Skip to content

Commit

Permalink
WIP: update
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhang Jun committed Jun 17, 2018
1 parent e08b70b commit 8cfa9d2
Show file tree
Hide file tree
Showing 16 changed files with 131 additions and 275 deletions.
Binary file modified .DS_Store
Binary file not shown.
2 changes: 1 addition & 1 deletion 02.创建CA证书和秘钥.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ tags: TLS, CA

# 创建 CA 证书和秘钥

为确保安全,`kubernetes` 系统各组件需要使用 `x509 TLS` 证书对通信进行加密和认证。
为确保安全,`kubernetes` 系统各组件需要使用 `x509` 证书对通信进行加密和认证。

CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。

Expand Down
6 changes: 3 additions & 3 deletions 04.部署etcd集群.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ tags: etcd

# 部署 etcd 集群

Etcd 是基于 Raft 的分布式 key-value 存储系统,由 CoreOS 开发,常用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。
etcd 是基于 Raft 的分布式 key-value 存储系统,由 CoreOS 开发,常用于服务发现、共享配置以及并发控制(如 leader 选举、分布式锁等)。kubernetes 使用 etcd 存储所有运行数据

kubernetes 使用 etcd 来存储所有运行数据。本文档介绍部署一个三节点高可用 etcd 集群的步骤:
本文档介绍部署一个三节点高可用 etcd 集群的步骤:

+ 下载和分发 etcd 二进制文件;
+ 创建 etcd 集群各节点的 x509 证书,用于加密客户端(如 etcdctl) 与 etcd 集群、etcd 集群之间的数据流;
Expand Down Expand Up @@ -143,7 +143,7 @@ EOF

## 为各节点创建和分发 etcd systemd unit 文件

根据模板文件,为各节点创建 systemd unit 文件:
替换模板文件中的变量,为各节点创建 systemd unit 文件:

``` bash
source /opt/k8s/bin/environment.sh
Expand Down
12 changes: 7 additions & 5 deletions 05.部署flannel网络.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ tags: flanneld

# 部署 flannel 网络

kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通。
kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通。flannel 使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络。

flannel 使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络。Flaneel 第一次启动时,从 etcd 获取 Pod 网段信息,为本节点分配一个未使用的 `/24` 段地址,然后创建 `flannedl.1`(也可能是其它名称,如 flannel1 等) 接口。Flannel 将分配的 Pod 网段信息写入 `/run/flannel/docker` 文件,docker 后续使用这个文件中的环境变量设置 `docker0` 网桥。
flaneel 第一次启动时,从 etcd 获取 Pod 网段信息,为本节点分配一个未使用的 `/24` 段地址,然后创建 `flannedl.1`(也可能是其它名称,如 flannel1 等) 接口。

flannel 将分配的 Pod 网段信息写入 `/run/flannel/docker` 文件,docker 后续使用这个文件中的环境变量设置 `docker0` 网桥。

## 下载和分发 flanneld 二进制文件

Expand All @@ -32,7 +34,7 @@ for node_ip in ${NODE_IPS[@]}

## 创建 flannel 证书和私钥

flannel 从 etcd 集群存取网段分配信息,而 etcd 集群启用了双向 TLS 认证,所以需要为 flanneld 生成 x509 证书和私钥
flannel 从 etcd 集群存取网段分配信息,而 etcd 集群启用了双向 x509 证书认证,所以需要为 flanneld 生成证书和私钥

创建证书签名请求:

Expand Down Expand Up @@ -128,7 +130,7 @@ WantedBy=multi-user.target
RequiredBy=docker.service
EOF
```
+ mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入 `/run/flannel/docker` 文件,后续 docker 启动时使用这个文件中的环境变量配置 docker0 网桥;
+ `mk-docker-opts.sh` 脚本将分配给 flanneld 的 Pod 子网网段信息写入 `/run/flannel/docker` 文件,后续 docker 启动时使用这个文件中的环境变量配置 docker0 网桥;
+ flanneld 使用系统缺省路由所在的接口与其它节点通信,对于有多个网络接口(如内网和公网)的节点,可以用 `-iface` 参数指定通信接口;
+ flanneld 运行时需要 root 权限;

Expand Down Expand Up @@ -252,7 +254,7 @@ inet 172.30.29.0/32 scope global flannel.1
inet 172.30.39.0/32 scope global flannel.1
```

在各节点上分配 ping 上面输出的 IP,确保能通:
在各节点上 ping 所有 flannel 接口 IP,确保能通:

``` bash
source /opt/k8s/bin/environment.sh
Expand Down
6 changes: 3 additions & 3 deletions 06-1.api-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ ETCDCTL_API=3 etcdctl \
get /registry/ --prefix --keys-only
```

## 打印集群信息
## 检查集群信息

``` bash
$ kubectl cluster-info
Expand All @@ -237,9 +237,9 @@ etcd-2 Healthy {"health":"true"}

`The connection to the server localhost:8080 was refused - did you specify the right host or port?`

1. 执行 kubectl get componentstatuses 命令时,apiserver 默认向 127.0.0.1 发送请求。当 controller-manager、scheduler 以集群模式运行时,有可能和 kube-apiserver 不在一台机器上,这时 controller-manager 或 scheduler 的状态为 Unhealthy,但实际上它们正常运行
1. 执行 `kubectl get componentstatuses` 命令时,apiserver 默认向 127.0.0.1 发送请求。当 controller-manager、scheduler 以集群模式运行时,有可能和 kube-apiserver **不在一台机器**,这时 controller-manager 或 scheduler 的状态为 Unhealthy,但实际上它们工作**正常**

## 打印 kube-apiserver 监听的端口
## 检查 kube-apiserver 监听的端口

``` bash
$ sudo netstat -lnpt|grep kube
Expand Down
6 changes: 3 additions & 3 deletions 06-2.controller-manager集群.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 部署高可用 kube-controller-manager 集群

本文档介绍部署高可用 kube-controller-manager 集群的步骤,包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态
本文档介绍部署高可用 kube-controller-manager 集群的步骤。

当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。
该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。

为保证通信安全,本文档先生成 x509 证书和私钥,kube-controller-manager 在如下两种情况下使用该证书:

Expand Down Expand Up @@ -180,7 +180,7 @@ ClusteRole: system:kube-controller-manager 的**权限很小**,只能创建 se

需要在 kube-controller-manager 的启动参数中添加 `--use-service-account-credentials=true` 参数,这样 main controller 会为各 controller 创建对应的 ServiceAccount XXX-controller。

内置的 ClusterRoleBinding system:controller:XXX 将赋予上面 XXX-controller ServiceAccount 对应 ClusterRole system:controller:XXX 权限。
内置的 ClusterRoleBinding system:controller:XXX 将赋予各 XXX-controller ServiceAccount 对应的 ClusterRole system:controller:XXX 权限。

## 启动 kube-controller-manager 服务

Expand Down
4 changes: 2 additions & 2 deletions 06-3.scheduler集群.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# 部署高可用 kube-scheduler 集群

本文档介绍部署高可用 kube-scheduler 集群的步骤,包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态
本文档介绍部署高可用 kube-scheduler 集群的步骤。

当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。
该集群包含 3 个节点,启动后将通过竞争选举机制产生一个 leader 节点,其它节点为阻塞状态。当 leader 节点不可用后,剩余节点将再次进行选举产生新的 leader 节点,从而保证服务的可用性。

为保证通信安全,本文档先生成 x509 证书和私钥,kube-scheduler 在如下两种情况下使用该证书:

Expand Down
35 changes: 16 additions & 19 deletions 07-3.kube-proxy.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
## 部署 kube-proxy 服务

每台机器上都运行一个 kube-proxy 服务,它监听 API server 中 service 和 endpoint 的变化情况,并通过 iptables 等来为服务配置负载均衡(仅支持 TCP 和 UDP
kube-proxy 运行在所有 worker 节点上,,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。

kube-proxy 用于管理服务,使用 ipvs 模式
本文档讲解部署 kube-proxy 的部署,使用 ipvs 模式

## 下载和分发 kube-proxy 二进制文件

参考 [06-0.部署master节点.md](06-0.部署master节点.md)

## 安装依赖包

各节点需要安装 `ipvsadm``ipset` 命令,加载 `ip_vs` 内核模块。

参考 [07-0.部署worker节点.md](07-0.部署worker节点.md)

## 创建 kube-proxy 证书
Expand All @@ -36,11 +38,11 @@ cat > kube-proxy-csr.json <<EOF
}
EOF
```
+ CN 指定该证书的 User 为 `system:kube-proxy`
+ `kube-apiserver` 预定义的 RoleBinding `system:node-proxier` 将User `system:kube-proxy` 与 Role `system:node-proxier` 绑定,该 Role 授予了调用 `kube-apiserver` Proxy 相关 API 的权限;
+ kube-proxy 与 kube-apiserver 通信时以 client 方式使用该证书,所以无需在 hosts 字段中指定 IP 或列表
+ CN指定该证书的 User 为 `system:kube-proxy`
+ 预定义的 RoleBinding `system:node-proxier` 将User `system:kube-proxy` 与 Role `system:node-proxier` 绑定,该 Role 授予了调用 `kube-apiserver` Proxy 相关 API 的权限;
+ 该证书只会被 kube-proxy 当做 client 证书使用,所以 hosts 字段为空

生成 kube-proxy 证书和私钥
生成证书和私钥

``` bash
cfssl gencert -ca=/etc/kubernetes/cert/ca.pem \
Expand Down Expand Up @@ -76,8 +78,7 @@ kubectl config set-context default \
# 设置默认上下文
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
```
+ 设置集群参数和客户端认证参数时 `--embed-certs` 都为 `true`,这会将 `certificate-authority``client-certificate``client-key` 指向的证书文件内容写入到生成的 `kube-proxy.kubeconfig` 文件中;
+ `kube-proxy.pem` 证书中 CN 为 `system:kube-proxy``kube-apiserver` 预定义的 RoleBinding `cluster-admin` 将User `system:kube-proxy` 与 Role `system:node-proxier` 绑定,该 Role 授予了调用 `kube-apiserver` Proxy 相关 API 的权限;
+ `--embed-certs=true`:将 ca.pem 和 admin.pem 证书内容嵌入到生成的 kubectl-proxy.kubeconfig 文件中(不加时,写入的是证书文件路径);

分发 kubeconfig 文件:

Expand All @@ -90,11 +91,9 @@ for node_name in ${NODE_NAMES[@]}
done
```

## 创建 kube-proxy config 文件

kubeproxy 的 --write-config-to
## 创建 kube-proxy 配置文件

https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/apis/kubeproxyconfig/types.go
从 v1.10 开始,kube-proxy **部分参数**可以配置文件中配置。可以使用 `--write-config-to` 选项生成该配置文件,或者参考 kubeproxyconfig 的类型定义源文件 :https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/apis/kubeproxyconfig/types.go

创建 kube-proxy config 文件模板:

Expand All @@ -112,13 +111,13 @@ metricsBindAddress: ##NODE_IP##:10249
mode: "ipvs"
EOF
```
+ `bindAddress`:
+ `clientConnection.kubeconfig`:
+ `bindAddress`: 监听地址;
+ `clientConnection.kubeconfig`: 连接 apiserver 的 kubeconfig 文件;
+ `clusterCIDR`: 必须与 kube-controller-manager 的 `--cluster-cidr` 选项值一致;kube-proxy 根据 `--cluster-cidr` 判断集群内部和外部流量,指定 `--cluster-cidr``--masquerade-all` 选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT;
+ `hostnameOverride`: 参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 ipvs 规则;
+ `mode`: 使用 ipvs 模式;

为各节点创建和分发 kube-proxy config 文件
为各节点创建和分发 kube-proxy 配置文件

``` bash
source /opt/k8s/bin/environment.sh
Expand Down Expand Up @@ -154,8 +153,6 @@ LimitNOFILE=65536
WantedBy=multi-user.target
EOF
```
+ `--kubeconfig` 指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息;
+ 预定义的 RoleBinding `cluster-admin` 将User `system:kube-proxy` 与 Role `system:node-proxier` 绑定,该 Role 授予了调用 `kube-apiserver` Proxy 相关 API 的权限;

完整 unit 见 [kube-proxy.service](https://github.com/opsnull/follow-me-install-kubernetes-cluster/blob/master/systemd/kube-proxy.service)

Expand Down Expand Up @@ -193,13 +190,13 @@ for node_ip in ${NODE_IPS[@]}
done
```

确保状态为 active (running),否则查看日志,确认原因:
确保状态为 `active (running)`,否则查看日志,确认原因:

``` bash
journalctl -u kube-proxy
```

## 监听端口和 metrics
## 查看监听端口和 metrics

``` bash
[k8s@kube-node1 ~]$ sudo netstat -lnpt|grep kube-prox
Expand Down
17 changes: 6 additions & 11 deletions 08-验证集群功能.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 验证集群功能

本文档使用 daemonset 验证 master 和 worker 节点是否工作正常。

## 检查节点状态

``` bash
Expand All @@ -11,7 +13,7 @@ kube-node3 Ready <none> 3h v1.10.4
```
都为 Ready 时正常。

## 定义文件
## 创建测试文件

``` bash
$ cat > nginx-ds.yml <<EOF
Expand Down Expand Up @@ -50,7 +52,7 @@ spec:
EOF
```

## 创建服务和 Daemonset
## 执行定义文件

``` bash
$ kubectl create -f nginx-ds.yml
Expand All @@ -67,7 +69,7 @@ nginx-ds-rk777 1/1 Running 0 2m 172.30.81.2 kube-nod
nginx-ds-tr9g5 1/1 Running 0 2m 172.30.39.2 kube-node3
```

可见,nginx-ds 的 Pod IP 分别是 `172.30.39.2``172.30.81.2``172.30.29.2`,在所有 Node 上分别 ping 这三个 IP,看是否连通
可见,nginx-ds 的 Pod IP 分别是 `172.30.39.2``172.30.81.2``172.30.29.2`,在所有 Node 上分别 ping 这三个 IP,看是否连通

``` bash
source /opt/k8s/bin/environment.sh
Expand Down Expand Up @@ -119,11 +121,4 @@ for node_ip in ${NODE_IPS[@]}
done
```

预期输出 nginx 欢迎页面内容。

## 参考:
https://kubernetes.io/docs/admin/authentication/
https://kubernetes.io/docs/admin/bootstrap-tokens/
https://kubernetes.io/docs/admin/kubelet-tls-bootstrapping/
https://github.com/linuxkit/kubernetes/pull/68
https://github.com/linuxkit/kubernetes/issues/71
预期输出 nginx 欢迎页面内容。
10 changes: 10 additions & 0 deletions 09-0.部署集群插件.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# 部署集群插件

插件是集群的附件组件,丰富和完善了集群的功能。


+ [coredns](./09-1.dns插件.md)
+ [Dashboard](./09-2.dashboard插件.md)
+ [Heapster (influxdb、grafana)](./09-3.heapster插件.md)
+ [Metrics Server](./09-4.metrics-server插件.md)
+ [EFK (elasticsearch、fluentd、kibana)](./09-5.EFK插件.md)
2 changes: 1 addition & 1 deletion 09-1.dns插件.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ tags: kubedns

将下载的 kubernetes-server-linux-amd64.tar.gz 解压后,再解压其中的 kubernetes-src.tar.gz 文件。

coredns 对应的目录是:`cluster/addons/dns`
coredns 对应的目录是:`cluster/addons/dns`

```bash
$ pwd
Expand Down
2 changes: 1 addition & 1 deletion 09-2.dashboard插件.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ tags: dashboard

将下载的 kubernetes-server-linux-amd64.tar.gz 解压后,再解压其中的 kubernetes-src.tar.gz 文件。

dashboard 对应的目录是:`cluster/addons/dashboard`
dashboard 对应的目录是:`cluster/addons/dashboard`

``` bash
$ pwd
Expand Down
Loading

0 comments on commit 8cfa9d2

Please sign in to comment.