Skip to content

Commit

Permalink
v1.10.4: harder working
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhang Jun committed Jun 16, 2018
1 parent be0247e commit 67a0ded
Show file tree
Hide file tree
Showing 45 changed files with 1,867 additions and 1,299 deletions.
Binary file modified .DS_Store
Binary file not shown.
81 changes: 0 additions & 81 deletions 00.系统准备.md

This file was deleted.

65 changes: 65 additions & 0 deletions 00.组件版本和集群环境.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<!-- toc -->

tags: kubernetes, environment

# 组件版本和集群环境

## 集群组件和版本

+ Kubernetes 1.10.4
+ Docker 18.03.1-ce
+ Etcd 3.3.7
+ Flanneld 0.10.0
+ 插件:
- DNS: coredns
- Dashboard
- Heapster (influxdb、grafana)
- Metrics-Server
- EFK (elasticsearch、fluentd、kibana)
+ 镜像仓库:
- docker registry
- harbor

## 主要配置策略

kube-apiserver:

+ 关闭非安全端口 8080 和匿名访问;
+ 严格的认证和授权策略 (x509、token、RBAC);
+ 开启 bootstrap token 认证,从而支持 kubelet TLS bootstrapping;
+ 使用 https 和证书访问 kubelet、etcd,加密通信;

kube-controller-manager:

+ 3 节点高可用;
+ 关闭非安全端口,在安全端口 10252 监听 https 请求;
+ 使用 kubeconfig 访问 apiserver 的安全端口;
+ 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
+ 各 controller 使用自己的 ServiceAccount 访问 apiserver;

kube-scheduler:

+ 3 节点高可用;
+ 使用 kubeconfig 访问 apiserver 的安全端口;

kubelet:

+ 使用 kubeadm 动态 bootstrap 所需的 token,而不是在 apiserver 中静态配置;
+ 使用 TLS bootstrap 机制自动获取 client 和 server 证书,过期后自动轮转;
+ 在 KubeletConfiguration 类型的 JSON 文件配置主要参数;
+ 关闭只读端口,只在 10250 安全端口接收所有 https 请求,且对请求进行认证和授权,拒绝匿名访问和非授权访问;
+ 使用 kubeconfig 访问 apiserver 的安全端口;

kube-proxy:

+ 使用 kubeconfig 访问 apiserver 的安全端口;
+ 在 KubeProxyConfiguration 类型的 JSON 文件配置主要参数;
+ 使用 ipvs 代理模式;

集群插件:

+ DNS:使用功能、性能更好的 coredns;
+ Dashboard:支持登录认证;
+ Metric 收集:heapster、metrics-server,使用 https 访问 kubelet 安全端口;
+ Log:Elasticsearch、Fluend、Kibana;
+ Registry 镜像库:docker-registry、harbor;
109 changes: 81 additions & 28 deletions 01.组件版本和集群环境.md → 01.系统初始化.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,16 @@
<!-- toc -->

tags: kubernetes, environment
tags: system-env

# 组件版本和集群环境

## 集群组件和版本

+ Kubernetes 1.10.4
+ Docker 18.03.1-ce
+ Etcd 3.3.7
+ Flanneld 0.10.0 vxlan
+ 安全:TLS 认证通信 (所有组件,如 etcd、kubernetes master 和 node),周期自动轮转 kubelet TLS 证书,RBAC 授权;
+ kubelet:kublet.config 配置文件,TLS BootStrapping Token,自动 approve CSR;
+ 插件:coredns、dashboard、heapster (influxdb、grafana)、EFK (elasticsearch、fluentd、kibana);
+ 镜像仓库:docker registry 和 harbor;
# 系统初始化

## 集群机器

+ kube-node1:172.27.129.105
+ kube-node2:172.27.129.111
+ kube-node3:172.27.129.112

vagrant 目录下提供了 Vagrantfile 文件,你可以使用 vagrant 和 virtualbox 创建对应的三台虚机:
vagrant 目录下提供了 Vagrantfile 文件,可以使用 vagrant 和 virtualbox 创建对应的三台虚机:

``` bash
$ cd vagrant
Expand All @@ -30,6 +19,8 @@ $ vagrant up

本着测试的目的,etcd 集群、kubernetes master、kubernetes node 均使用这三台机器。

## 主机名

修改每台机器的 `/etc/hosts` 文件,添加主机名和 IP 的对应关系:

``` bash
Expand All @@ -39,6 +30,75 @@ $ grep kube-node /etc/hosts
172.27.129.112 kube-node3 kube-node3
```

## 运行账户

``` bash
[root@localhost ~]# useradd -m k8s
[root@localhost ~]# visudo
[root@test-105 ~]# grep '%wheel.*NOPASSWD: ALL' /etc/sudoers
%wheel ALL=(ALL) NOPASSWD: ALL
[root@localhost ~]# gpasswd -a k8s wheel
[root@localhost ~]# echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc
[k8s@localhost ~]$ echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>~/.bashrc
```

## docker 账户和配置

``` bash
[root@kube-node1 ~]# useradd -m docker
[root@kube-node1 ~]# gpasswd -a k8s docker
[root@kube-node1 ~]# mkdir -p /etc/docker/
[root@kube-node1 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["docker02:35000"],
"max-concurrent-downloads": 20
}
```

## 无秘钥登录

``` bash
[k8s@kube-node1 k8s]$ ssh-keygen -t rsa
[k8s@kube-node1 k8s]$ ssh-copy-id root@kube-node1
[k8s@kube-node1 k8s]$ ssh-copy-id root@kube-node2
[k8s@kube-node1 k8s]$ ssh-copy-id root@kube-node3

[k8s@kube-node1 k8s]$ ssh-copy-id k8s@kube-node1
[k8s@kube-node1 k8s]$ ssh-copy-id k8s@kube-node2
[k8s@kube-node1 k8s]$ ssh-copy-id k8s@kube-node3
```

## 安装依赖包

``` bash
[root@kube-node1 ~]# yum install -y epel-release
[root@localhost ~]# yum install -y vim go conntrack ipvsadm ipset jq sysstat curl iptables # ipvs 依赖 ipset
```

## 关闭防火墙

``` bash
[root@kube-node1 ~]# systemctl stop firewalld
[root@kube-node1 ~]# systemctl disable firewalld
[root@kube-node1 ~]# sudo iptables -P FORWARD ACCEPT
```

## 创建目录

``` bash
[root@localhost ~]# mkdir -p /opt/k8s/bin
[root@localhost ~]# chown -R k8s /opt/k8s

[root@kube-node1 ~]# sudo mkdir -p /etc/kubernetes/ssl
[root@kube-node1 ~]# chown -R k8s /etc/kubernetes

[root@kube-node1 ~]# mkdir -p /etc/etcd/ssl
[root@kube-node1 ~]# chown -R k8s /etc/etcd/ssl

[root@kube-node1 ~]# mkdir -p /var/lib/etcd && chown -R k8s /etc/etcd/ssl
```

## 集群环境变量

后续的部署步骤将使用下面定义的全局环境变量,根据**自己的机器、网络情况**修改:
Expand Down Expand Up @@ -66,6 +126,12 @@ export NODE_IPS=(172.27.129.105 172.27.129.111 172.27.129.112)
# 集群各 IP 对应的 主机名
export NODE_NAMES=(kube-node1 kube-node2 kube-node3)

# kube-apiserver 节点 IP
export MASTER_NODE=172.27.129.105

# kube-apiserver https 地址
export KUBE_APISERVER="https://${MASTER_NODE}:6443"

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://172.27.129.105:2379,https://172.27.129.111:2379,https://172.27.129.112:2379"

Expand Down Expand Up @@ -96,17 +162,4 @@ export PATH=/opt/k8s/bin:$PATH
``` bash
$ cp environment.sh /opt/k8s/bin
$ chmod +x /opt/k8s/bin/*
```

## 认证和授权

本文档开启了严格的安全认证和授权机制,包括但不限于:
+ 后续 `kube-apiserver` 使用 `RBAC` 对客户端(如 `kubelet``kube-proxy``Pod`)请求进行授权;
+ `kube-apiserver` 预定义了一些 `RBAC` 使用的 `RoleBindings`,如 `cluster-admin` 将 Group `system:masters` 与 Role `cluster-admin` 绑定,该 Role 授予了调用`kube-apiserver` **所有 API**的权限;
+ O 指定该证书的 Group 为 `system:masters``kubelet` 使用该证书访问 `kube-apiserver` 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 `system:masters`,所以被授予访问所有 API 的权限;
+ hosts 属性值为空列表;

## 网段

POD 网段
Cluster Service 网段
```
Loading

0 comments on commit 67a0ded

Please sign in to comment.