Skip to content

Commit

Permalink
1. move flanneld to single chapter;
Browse files Browse the repository at this point in the history
2. split kubelet&kube-proxy kubeconfig to node chapter;
3. move BOOTSTRAP_TOKEN to environment.sh;
  • Loading branch information
zhangjun3 committed May 7, 2017
1 parent 1322218 commit c038a74
Show file tree
Hide file tree
Showing 9 changed files with 270 additions and 226 deletions.
23 changes: 23 additions & 0 deletions 01-组件版本和集群环境.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,34 @@ tags: kubernetes, environment

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

## 创建 kube-apiserver 使用的客户端 token 文件

kubelet **首次启动**时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token.csv 一致,如果一致则自动为 kubelet生成证书和秘钥。

``` bash
$ export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
$ cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
```

### 分发 token.csv 文件

将 token.csv 文件拷贝到**所有机器**(Master 和 Node)的 `/etc/kubernetes/` 目录:

``` bash
$ sudo cp token.csv /etc/kubernetes/
$
```

## 集群环境变量

后续的部署步骤将使用下面定义的全局环境变量,根据**自己的机器、网络情况**修改:

``` bash
# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"

# 建议用 未用的网段 来定义服务网段和 Pod 网段

# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用 IP:Port 可达
Expand Down
2 changes: 1 addition & 1 deletion 03-部署高可用Etcd集群.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ $ systemctl status etcd
$
```

在所有的 kubernetes master 节点重复上面的步骤,直到所有机器的 etcd 服务都已启动。
在所有的 etcd 节点重复上面的步骤,直到所有机器的 etcd 服务都已启动。

## 验证服务

Expand Down
164 changes: 164 additions & 0 deletions 05-部署Flannel网络.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
<!-- toc -->

tags: flanneld

# 部署 Flannel 网络

kubernetes 要求集群内的 Node、Pod 能通过 Pod 网段互联互通,本文档介绍使用 Flannel 在**所有节点** (Master、Node) 上创建互联互通的 Pod 网段的步骤。

## 使用的变量

本文档用到的变量定义如下:

``` bash
$ # 导入用到的其它全局变量:ETCD_ENDPOINTS、FLANNEL_ETCD_PREFIX、CLUSTER_CIDR
$ source /root/local/bin/environment.sh
$
```

## 目录和文件

``` bash
$ sudo mkdir -p /etc/kubernetes/ssl
$ sudo cp ca.pem kubernetes.pem kubernetes-key.pem /etc/kubernetes/ssl
$
```

## 向 etcd 写入集群 Pod 网段信息

注意:本步骤只需在**第一次**部署 Flannel 网络时执行,后续在其它节点上部署 Flannel 时**无需**再写入该信息!

``` bash
$ /root/local/bin/etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
set ${FLANNEL_ETCD_PREFIX}/config '{"Network":"'${CLUSTER_CIDR}'", "SubnetLen": 24, "Backend": {"Type": "vxlan"}}'
```

+ flanneld **目前版本 (v0.7.1) 不支持 etcd v3**,故使用 etcd v2 API 写入配置 key 和网段数据;
+ 写入的 Pod 网段(${CLUSTER_CIDR},172.30.0.0/16) 必须与 kube-controller-manager 的 `--cluster-cidr` 选项值一致;


## 安装和配置 flanneld

### 下载 flanneld

``` bash
$ mkdir flannel
$ wget https://github.com/coreos/flannel/releases/download/v0.7.1/flannel-v0.7.1-linux-amd64.tar.gz
$ tar -xzvf flannel-v0.7.1-linux-amd64.tar.gz -C flannel
$ sudo cp flannel/{flanneld,mk-docker-opts.sh} /root/local/bin
$
```

### 创建 flanneld 的 systemd unit 文件

``` bash
$ cat > flanneld.service << EOF
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
After=network-online.target
Wants=network-online.target
After=etcd.service
Before=docker.service
[Service]
Type=notify
ExecStart=/root/local/bin/flanneld \\
-etcd-cafile=/etc/kubernetes/ssl/ca.pem \\
-etcd-certfile=/etc/kubernetes/ssl/kubernetes.pem \\
-etcd-keyfile=/etc/kubernetes/ssl/kubernetes-key.pem \\
-etcd-endpoints=${ETCD_ENDPOINTS} \\
-etcd-prefix=${FLANNEL_ETCD_PREFIX}
ExecStartPost=/root/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker
Restart=on-failure
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
EOF
```

+ etcd 集群启用了双向 TLS 认证,所以需要为 flanneld 指定与 etcd 集群通信的 CA 和秘钥;
+ mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入到 `/run/flannel/docker` 文件中,后续 docker 启动时使用这个文件中参数值设置 docker0 网桥;
+ `-iface` 选项值指定 flanneld 和其它 Node 通信的接口,如果机器有内、外网,则最好指定为内网接口;

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

### 启动 flanneld

``` bash
$ sudo cp flanneld.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable flanneld
$ sudo systemctl start flanneld
$ systemctl status flanneld
$
```

### 检查 flanneld 服务

``` bash
$ journalctl -u flanneld |grep 'Lease acquired'
$ ifconfig flannel.1
$
```

### 检查分配给各 flanneld 的 Pod 网段信息

``` bash
$ # 查看集群 Pod 网段(/16)
$ /root/local/bin/etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
get ${FLANNEL_ETCD_PREFIX}/config
{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
$ # 查看已分配的 Pod 子网段列表(/24)
$ /root/local/bin/etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
ls ${FLANNEL_ETCD_PREFIX}/subnets
/kubernetes/network/subnets/172.30.19.0-24
$ # 查看某一 Pod 网段对应的 flanneld 进程监听的 IP 和网络参数
$ /root/local/bin/etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
get ${FLANNEL_ETCD_PREFIX}/subnets/172.30.19.0-24
{"PublicIP":"10.64.3.7","BackendType":"vxlan","BackendData":{"VtepMAC":"d6:51:2e:80:5c:69"}}
```
### 确保各节点间 Pod 网段能互联互通
**各节点上部署完** Flannel 后,查看已分配的 Pod 子网段列表(/24)
``` bash
$ /root/local/bin/etcdctl \
--endpoints=${ETCD_ENDPOINTS} \
--ca-file=/etc/kubernetes/ssl/ca.pem \
--cert-file=/etc/kubernetes/ssl/kubernetes.pem \
--key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
ls ${FLANNEL_ETCD_PREFIX}/subnets
/kubernetes/network/subnets/172.30.19.0-24
/kubernetes/network/subnets/172.30.20.0-24
/kubernetes/network/subnets/172.30.21.0-24
```
当前三个节点分配的 Pod 网段分别是:172.30.19.0-24、172.30.20.0-24、172.30.21.0-24。
在各节点上分配 ping 这三个网段的网关地址,确保能通:
``` bash
$ ping 172.30.19.1
$ ping 172.30.20.2
$ ping 172.30.21.3
$
```
108 changes: 0 additions & 108 deletions 05-配置Kubeconfig文件.md

This file was deleted.

17 changes: 15 additions & 2 deletions 06-部署Master节点.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ kubernetes master 节点包含的组件:

``` bash
$ export MASTER_IP=10.64.3.7 # 替换为当前部署的 master 机器 IP
$ # 导入用到的其它全局变量:SERVICE_CIDR、CLUSTER_CIDR、NODE_PORT_RANGE、ETCD_ENDPOINTS
$ # 导入用到的其它全局变量:SERVICE_CIDR、CLUSTER_CIDR、NODE_PORT_RANGE、ETCD_ENDPOINTS、BOOTSTRAP_TOKEN
$ source /root/local/bin/environment.sh
$
```
Expand Down Expand Up @@ -76,6 +76,19 @@ $

## 配置和启动 kube-apiserver

### 创建 kube-apiserver 使用的客户端 token 文件

kubelet **首次启动**时向 kube-apiserver 发送 TLS Bootstrapping 请求,kube-apiserver 验证 kubelet 请求中的 token 是否与它配置的 token.csv 一致,如果一致则自动为 kubelet生成证书和秘钥。

``` bash
$ # 导入的 environment.sh 文件定义了 BOOTSTRAP_TOKEN 变量
$ cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
$ mv token.csv /etc/kubernetes/
$
```

### 创建 kube-apiserver 的 systemd unit 文件

``` bash
Expand Down Expand Up @@ -131,7 +144,7 @@ EOF
+ kubelet、kube-proxy、kubectl 部署在其它 Node 节点上,如果通过**安全端口**访问 kube-apiserver,则必须先通过 TLS 证书认证,再通过 RBAC 授权;
+ kube-proxy、kubectl 通过在使用的证书里指定相关的 User、Group 来达到通过 RBAC 授权的目的;
+ 如果使用了 kubelet TLS Boostrap 机制,则不能再指定 `--kubelet-certificate-authority``--kubelet-client-certificate``--kubelet-client-key` 选项,否则后续 kube-apiserver 校验 kubelet 证书时出现 ”x509: certificate signed by unknown authority“ 错误;
+ `--admission-control` 值必须包含 `ServiceAccount`
+ `--admission-control` 值必须包含 `ServiceAccount`,否则部署集群插件时会失败
+ `--bind-address` 不能为 `127.0.0.1`
+ `--service-cluster-ip-range` 指定 Service Cluster IP 地址段,该地址段不能路由可达;
+ `--service-node-port-range=${NODE_PORT_RANGE}` 指定 NodePort 的端口范围;
Expand Down
Loading

0 comments on commit c038a74

Please sign in to comment.