Please refer to the documentation for detailed configuration: Wiki Docs URL。
Wiki 文档内容为 1.14.x 版本
以下所有的部署全部使用 Ubuntu 16.04 为环境进行示例演练。个人部署时请使用最新版进行尝试。
使用 Ansible 基于容器化部署 Kubernetes Cluster(非 Kubeadm), 并支持 Master/Node 节点的添加。(旧版本的 HaProxy 需要自己更新新节点的上游配置)
部署全局基于 TLS, 并区分 K8s Cluster CA、Etcd CA 证书。
部署时支持离线、在线和镜像方式部署, 默认使用在线和镜像方式部署, 在线方式相当于主动 Pull 获取包(如果基于镜像则下载镜像, 如非镜像部署则下载二进制), 镜像方式基于 image in image 策略方式部署, 离线则只适用于镜像方式部署, 把 image in image 镜像放置在本地推送到目标机进行部署。参看文档: Docs
不支持单独使用 tag 方式部署, 因全部使用 Kubelet 的静态方式部署启动 Pod, 如删除集群某一批次的节点时 tag 比较有用。
目前还暂不支持国内服务器直接进行部署, 如果不使用镜像方式部署, 则部署时镜像基于
k8s.gcr.io地址进行下载, 国内访问时可能会被墙。受影响的应用etcd、kube-apiserver-amd64、kube-controller-manager、kube-scheduler、kube-proxy、pause。
可修改参数
k8s_cluster_component_registry值为slzcc自定义镜像仓库地址, 在使用自定义镜像仓库时, 请确保已经执行过script/PublishK8sRegistryImages.sh脚本。(可支持的镜像版本参阅 slzcc/kubernetes)
默认 Etcd 需要跟随 Master 进行部署, 暂不支持 Etcd 部署在 Node 中 (后期会优化, 在添加 节点时支持 Node 节点部署)。
目前支持的 Kubernetes 版本:
- v1.10.0
- v1.14.x >= 1.16.x
在 v1.14.x 开始, 可以支持动态的选择版本进行部署, 如 v1.14.1/v1.14.2 版本, 但目前只支持小版本。后续会添加集群的热更新。
- 支持集群后续 Kubernetes Cluster 扩容, 支持添加 Master/None 节点。
- 支持集群后续 Etcd Cluster 扩容 (只添加节点, 对现有集群无感知) v1.14.1.8 中添加。
- 支持自定义镜像仓库地址。
- 支持 Add-Ons 等应用部署。
- 支持自定义 TLS 。
- 支持 Kubernetes Cluster CA 根证书更新。
- 支持 Kubernetes Cluster 版本升级。
- 支持 Etcd Cluster CA 根证书更新。
- 支持 Ansible in Docker 方式进行部署。
以 v1.16.x 为例:
- Kubernetes A/C/S v1.16.x
- CoreDNS: v1.5.x
- Calico: v3.7.x
- Kube Proxy: v1.15.x
- HaProxy: v2.0.x
- Etcd: v3.3.10
- pause: v3.1
- 支持自定义远程镜像仓库地址, 默认
k8s.gcr.io, 可修改为slzcc自定义镜像仓库, 在使用自定义镜像仓库时, 请确保已经执行过script/PublishK8sRegistryImages.sh脚本。 - 支持 Etcd 热添加节点。
- 支持 Add Ons 其他 Tools 部署, 包括 Helm、Prometheus、Ingress-Nginx、Ingress-Example、DNS-Tools。
- 支持 Istio。
- 支持操作系统预判部署 Ubuntu/Centos 更合理的安装即优化, v1.14.2.6 中优化.
- 支持 Harbor HTTPS 部署, v1.16.1.7 中添加。(暂支持空数据卷,请自行修改挂载点)
- 支持 TLS 证书自定义。v1.15.0.2 中更新。
- 支持 OpenResty 入口流量的灰度发布。
- 支持 Kubernetes 热更新 TLS, v1.15.0.3 版本更新。对集群中 Master/Node/Kubelet 等组件的所有 TLS 服务进行证书更新, 主要解决 CFSSL 默认申请 CA 证书 5 年时效问题, 以及后续可能存在的证书泄露问题。(Beta Version)
- 支持 Etcd 热更新 TLS, v1.15.0.6 中更新。
- 支持 Kubernetes 镜像导入方式部署, v1.14.2.1 版本更新。 默认使用镜像部署, 支持的版本请参看 slzcc/kubernetes
-
支持 Proxy 方式部署 Docker Image 和 二进制应用, 已经通过容器方式部署. - 支持离线方式部署 Kubernetes Cluster, 可参阅 downloads-packages
- 支持 IPVS, v1.14.2.8 版本更新.
- 支持 Ansible in Docker 方式部署, 不在依赖于本地环境。v1.15.3.0 中更新。
- 支持 Kubernetes Cluster 版本更新, v1.15.0.5 中更新。
- 修复 Calico 在使用时, 无法与 Etcd 进行通信。
- 脚本绝大部分使用 Shell 执行, 后期重构统一使用模块解决跨平台执行。
- 修复 Calico 在使用时, 无法识别宿主机网卡, 造成无法通信的问题。
- 修复 Bootstrap 无法创建凭证的问题。
- 修复 Swap 如果打开情况下的优化配置, v1.14.2.5 中修复。
- 修复 Ubuntu IPVS 模式下无法跨主机访问问。v1.14.2.9 中修复。
- 修复 Kubernetes 添加节点时, 无法获取真实的宿主机 IP 地址, v1.15.0.1 中修复。
- 修复 CNI 容器部署 Download Plugin 位置错误。v1.15.0.2 中修复。(之前版本实际不受影响, Calico 有自己的初始化 Plugin 部署方式)
- 修复 kubelet 重新加入集群时, 证书无效的问题, v1.15.0.3 中修复。
- 修复添加 Master 节点时, HaProxy 没有及时更新新节点问题, v1.15.0.5 中修复。
- 修复 Add Etcd 节点时, 没有更新 Kubu apiServer 和 Calico、Etcd 服务的配置信息, v1.15.0.6 中修复。
- 修复 Proxy 中使用 Keepalived 通过 VIP 访问 nodePort 模式的服务时流量不可达的问题, v1.15.3.5 中修复。
- 修复 Kubelet 中的 Cgroup 与 Docker 版本兼容报错的问题, v1.15.3.6 中修复。
- 修复
镜像部署模式中重复导入镜像/二进制文件的问题, v1.16.1.3 中修复。 - 修复
docker安装时, 如果本地有集群外的服务(daemon.json 文件一致), 会停止服务的问题, v1.16.1.3 中修复。 - 修复 v1.16.x 中取消
extensions/v1beta1apiVersion 的问题, v1.16.1.1 中修复。 - 修复
TZ时区问题, 由于是挂载宿主机/usr/share/zoneinfo目录所以一定要保证此目录存在, v1.16.1.4 中修复。
切记, 如需要安装哪个大版本的集群, 就获取相应的 tag :
$ git clone -b v1.16.x.x https://github.com/slzcc/crane.git
v1.15.x.x 最末尾一位属于编写 Ansible 脚本的迭代版本, 不属于 Kubernetes 自身版本。
不建议下载 zip 格式源码进行部署, 没有正式测试。
在 nodes 文件中, 分为三大块:
[kube-master]
35.236.167.32
[kube-node]
34.80.142.147
[etcd]
35.236.167.32
[k8s-cluster-add-master]
[k8s-cluster-add-node]
[etcd-cluster-add-node]
[k8s-cluster:children]
kube-node
kube-master
[etcd-cluster:children]
etcd
etcd-cluster-add-node
[all:vars]
ansible_ssh_public_key_file='/Users/shilei/.ssh/id_rsa.pub'
ansible_ssh_private_key_file='/Users/shilei/.ssh/id_rsa'
第一部分为部署集群所规划的集群初始节点, 可自定义添加。(第一次创建集群时, 不能在添加 master/node/etcd 中写入节点地址, 否则会冲突)
第二部分为后续集群需要添加的节点可分为 master/node/etcd 。
第三部分为集群内所有节点均可使用的 SSH 秘钥。
在初次部署时, 应先修改基础配置文件 group_vars/all.yml 文件, 下面列出初始部署时应修改的选项:
# apiServer 的入口, 也就是 apiServer 的负载均衡层, 可支持 lvs/keepalived 组合, 如第一次部署请不要开启 lvs/keepalived , 如公有云环境也不支持 lvs/keepalived 。
k8s_load_balance_ip: < SLB 或 某节点 IP >
# Ansible 使用的远程服务器用户, 可使用普通用户但必须属于 Sudo 组
ssh_connect_user: < SSH USER >
# 所有节点统一的网卡名称, 否则会出现环境不一致的问题, 此配置被 Etcd/LVS 服务依赖。
os_network_device_name: < NetWork Name >
如有不明确的问题, 请参照上方的 Wiki 链接, 如果还有问题请提交 issue。
普通用户需要具有 Sudo 组, 并且配置 Sudo 免密。
如上述修改完成后, 可执行命令(v1.10.0 部署版本为例):
$ export ANSIBLE_HOST_KEY_CHECKING=true
$ ansible-playbook -i nodes main.yml -vv
Cluster Status
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-5hl64 11m system:node:instance-3 Approved,Issued
csr-758h6 11m system:node:instance-4 Approved,Issued
csr-fdf9g 11m system:node:instance-2 Approved,Issued
node-csr-4PjnAlcpExzHYlotBexV1yaev40khyc3RjIlWj-JFMU 10m system:bootstrap:b53294 Approved,Issued
node-csr-9qRs7kA959MOtQHx-5XXuMvmwl3vT6M1QkmmzUgvteQ 10m system:bootstrap:b53294 Approved,Issued
node-csr-GJqCuRzlL6KzLvxLRgNo1fEswguU6RLaETPjw2SNzs4 10m system:bootstrap:b53294 Approved,Issued
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
instance-2 Ready master 11m v1.10.0
instance-3 Ready master 11m v1.10.0
instance-4 Ready master 11m v1.10.0
instance-5 NotReady node 10m v1.10.0
instance-6 NotReady node 10m v1.10.0
instance-7 NotReady node 10m v1.10.0
$ kubectl -n kube-system get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
calico-kube-controllers-7779fd5f4c-v95ps 1/1 Running 0 34m 10.30.0.204 instance-4
calico-node-6fcbj 2/2 Running 0 34m 10.30.0.204 instance-4
calico-node-9tzx9 0/2 ContainerCreating 0 34m 10.30.0.205 instance-5
calico-node-hhd5b 2/2 Running 0 34m 10.30.0.202 instance-2
calico-node-hjzx7 2/2 Running 0 34m 10.30.0.203 instance-3
calico-node-nfqqs 0/2 ContainerCreating 0 34m 10.30.0.207 instance-7
calico-node-sm454 0/2 ContainerCreating 0 34m 10.30.0.206 instance-6
etcd-instance-2 1/1 Running 0 34m 10.30.0.202 instance-2
etcd-instance-3 1/1 Running 0 35m 10.30.0.203 instance-3
etcd-instance-4 1/1 Running 0 35m 10.30.0.204 instance-4
haproxy-instance-2 1/1 Running 0 35m 10.30.0.202 instance-2
haproxy-instance-3 1/1 Running 0 35m 10.30.0.203 instance-3
haproxy-instance-4 1/1 Running 0 35m 10.30.0.204 instance-4
keepalived-instance-2 1/1 Running 0 35m 10.30.0.202 instance-2
keepalived-instance-3 1/1 Running 0 35m 10.30.0.203 instance-3
keepalived-instance-4 1/1 Running 0 35m 10.30.0.204 instance-4
kube-apiserver-instance-2 1/1 Running 0 35m 10.30.0.202 instance-2
kube-apiserver-instance-3 1/1 Running 0 35m 10.30.0.203 instance-3
kube-apiserver-instance-4 1/1 Running 0 35m 10.30.0.204 instance-4
kube-controller-manager-instance-2 1/1 Running 0 35m 10.30.0.202 instance-2
kube-controller-manager-instance-3 1/1 Running 0 35m 10.30.0.203 instance-3
kube-controller-manager-instance-4 1/1 Running 0 35m 10.30.0.204 instance-4
kube-dns-654684d656-jkprr 0/3 Pending 0 34m <none> <none>
kube-proxy-4dtr6 1/1 Running 0 34m 10.30.0.204 instance-4
kube-proxy-4lc6x 1/1 Running 0 34m 10.30.0.203 instance-3
kube-proxy-84vzq 0/1 ContainerCreating 0 34m 10.30.0.207 instance-7
kube-proxy-cxkdl 0/1 ContainerCreating 0 34m 10.30.0.206 instance-6
kube-proxy-h2vgj 0/1 ContainerCreating 0 34m 10.30.0.205 instance-5
kube-proxy-w9rxj 1/1 Running 0 34m 10.30.0.202 instance-2
kube-scheduler-instance-2 1/1 Running 0 35m 10.30.0.202 instance-2
kube-scheduler-instance-3 1/1 Running 0 35m 10.30.0.203 instance-3
kube-scheduler-instance-4 1/1 Running 0 35m 10.30.0.204 instance-4
批量添加 Master 节点到集群, 首先在 nodes 文件中 k8s-cluster-add-master 下添加需要添加的节点: (支持批量)
[k8s-cluster-add-master]
130.211.245.55
...
部署安装:
$ ansible-playbook -i nodes add_master.yml -vv
查看 Cluster Status:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
instance-2 Ready master 46m v1.10.0
instance-3 Ready master 46m v1.10.0
instance-4 Ready master 46m v1.10.0
instance-5 Ready node 45m v1.10.0
instance-6 Ready node 45m v1.10.0
instance-7 Ready node 45m v1.10.0
instance-8 Ready master 7m v1.10.0
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-hs7lr 46m system:node:instance-3 Approved,Issued
csr-kc46g 46m system:node:instance-4 Approved,Issued
csr-nz8h2 7m system:node:instance-8 Approved,Issued
csr-xbbg2 46m system:node:instance-2 Approved,Issued
node-csr-DBuvqHT_-wjeb4DBGiovuWr3Y6t3MjywFj1kRpOIIhc 45m system:bootstrap:ed3fd7 Approved,Issued
node-csr-e-yBfiDSbcDTxJM8wloZLHsOStlO7TWiKDGX29dnm6I 45m system:bootstrap:ed3fd7 Approved,Issued
node-csr-xk3fBmT4OOHNAtbYJq4IXtLLpFlfyXLeX2PWFMNsrjk 45m system:bootstrap:ed3fd7 Approved,Issued
在添加完相应的类型节点后, 请把 nodes 文件中对应添加节点的地址, 移动至 master/node 中, 以防止后续操作时遗漏。
批量添加 Node 节点到集群, 首先在 nodes 文件中 k8s-cluster-add-node 下添加需要添加的节点: (支持批量)
[k8s-cluster-add-node]
34.80.142.147
...
部署安装:
$ ansible-playbook -i nodes add_nodes.yml -vv
Cluster Status
$ kubectl get node
NAME STATUS ROLES AGE VERSION
instance-2 Ready master 46m v1.10.0
instance-3 Ready master 46m v1.10.0
instance-4 Ready master 46m v1.10.0
instance-5 Ready node 45m v1.10.0
instance-6 Ready node 45m v1.10.0
instance-7 Ready node 45m v1.10.0
instance-8 Ready master 7m v1.10.0
instance-9 NotReady node 10s v1.10.0
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-hs7lr 47m system:node:instance-3 Approved,Issued
csr-kc46g 47m system:node:instance-4 Approved,Issued
csr-nz8h2 8m system:node:instance-8 Approved,Issued
csr-xbbg2 47m system:node:instance-2 Approved,Issued
node-csr-DBuvqHT_-wjeb4DBGiovuWr3Y6t3MjywFj1kRpOIIhc 46m system:bootstrap:ed3fd7 Approved,Issued
node-csr-GztgEuKzz0eVw77CDPzvxnkuhvYE8jucK_xA_tBkJCA 1m system:bootstrap:ed3fd7 Approved,Issued
node-csr-e-yBfiDSbcDTxJM8wloZLHsOStlO7TWiKDGX29dnm6I 46m system:bootstrap:ed3fd7 Approved,Issued
node-csr-xk3fBmT4OOHNAtbYJq4IXtLLpFlfyXLeX2PWFMNsrjk 46m system:bootstrap:ed3fd7 Approved,Issued
在添加完相应的类型节点后, 请把 nodes 文件中对应添加节点的地址, 移动至 master/node 中, 以防止后续操作时遗漏。
清除集群所有部署的数据信息:
$ ansible-playbook -i nodes remove_cluster.yml -vv
移除集群是对集群中所有节点来说的, 它会销毁集群中的所有安装过的应用以及配置。但不包含 docker、cfssl 等可供后续使用的应用。
清除集群时 IPVS 默认不会清除规则, 所以需要自己执行
ipvsadm -C来解决.
对现有集群添加支持 TLS 的 Etcd 节点, 批量添加 Node 节点到集群, 首先在 nodes 文件中 etcd-cluster-add-node 下添加需要添加的节点: (支持批量)
添加 Etcd 需要保证 Etcd 节点数在 2 个以上, 否则会出现没有 Leader 而无法加入集群的问题。
[etcd-cluster-add-node]
130.211.245.55
...
添加 Etcd 时, 需要保证添加的节点已经是 Kubernetes Master/Node 的成员, 否则不会生效。
部署安装:
$ ansible-playbook -i nodes add_etcd.yml -vv
添加的节点在现有的集群中不会被直接识别到, 因为 Etcd Endpoints 还是之前使用的, 如需要修改目前只支持手动更新, 因为牵扯太多目前不支持热更新服务配置, 否则会引起 apiServer、Calico 等应用的使用。
在添加完相应的类型节点后, 请把 nodes 文件中对应添加节点的地址, 移动至 etcd 中, 以防止后续操作时遗漏。
默认创建集群时, 是可以直接部署 Add-Ons 的, 如果后续进行部署, 则直接通过 tags 方式进行部署即可:
$ ansible-playbook -i nodes main.yml --tags k8s-addons -vv
默认通过 CFSSL 创建出的 CA 根证书只有 5 年时效, 如果更新根证书不当可能会涉及到 Master/Node 上大面积的应用不可用的问题, 下面的集群证书更新方式只适用于通过上述安装部署的集群使用, 其他服务集群请自行尝试, 目前没有发现问题:
需要保证 nodes 文件中不要有 add.* 开头的 Group, 在部署时会重新启动 Calico 网络, 但经过大量测试没有发现对集群访问的影响.
使用时, 只需要保证
tls_k8s.*的配置符合自身需求即可进行证书更新.
部署安装:
$ ansible-playbook -i nodes k8s_certificate_rotation.yml -vv
此方式会让 kubelet 重新加入到集群中, 所以可能会大面积的看到 csr 状态:
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
csr-26cfs 13m system:node:instance-template-2 Approved,Issued
csr-2ldhb 18m system:node:instance-template-2 Approved,Issued
csr-2q5rz 44m system:node:instance-template-2 Approved,Issued
csr-5ww4d 26m system:node:instance-template-2 Approved,Issued
csr-7fffj 62m system:node:instance-template-1 Approved,Issued
csr-7swmb 44m system:node:instance-template-1 Approved,Issued
csr-9pjxr 18m system:node:instance-template-1 Approved,Issued
csr-blrw7 66m system:node:instance-template-2 Approved,Issued
csr-bprkl 66m system:node:instance-template-1 Approved,Issued
csr-cmt86 55m system:bootstrap:0a7860 Approved,Issued
csr-dt6x4 48m system:node:instance-template-1 Approved,Issued
csr-j87l7 12m system:bootstrap:2db6c4 Approved,Issued
csr-kqtdr 75m system:node:instance-template-2 Approved,Issued
csr-m4567 48m system:node:instance-template-2 Approved,Issued
csr-mh9cr 26m system:node:instance-template-1 Approved,Issued
csr-nnkwg 38m system:node:instance-template-1 Approved,Issued
csr-pcnn8 13m system:node:instance-template-1 Approved,Issued
csr-rvmws 62m system:node:instance-template-2 Approved,Issued
csr-t8f44 38m system:node:instance-template-2 Approved,Issued
csr-zp7tr 75m system:node:instance-template-1 Approved,Issued
...
上述集群只有几个节点, 所以有重复的添加状态。
支持集群版本升级, 执行命令如下: (目前支持 1.14.x 升级 1.15.x 其他版本请自行尝试)
只需要配置 k8s_version 参数指定版本即可。
部署安装:
$ ansible-playbook -i nodes upgrade_version.yml -vv
执行结果如下:
$ kubectl get node
NAME STATUS ROLES AGE VERSION
instance-2 Ready <none> 2m2s v1.14.2
instance-template-1 Ready master 2m5s v1.14.2
instance-template-2 Ready master 2m3s v1.14.2
$ kubectl get node
NAME STATUS ROLES AGE VERSION
instance-2 Ready <none> 6m6s v1.15.0
instance-template-1 Ready master 6m6s v1.15.0
instance-template-2 Ready master 6m6s v1.15.0
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:40:16Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:32:14Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
与 K8s TLS Rotation 方式类似, 当更换证书时, 则集群中的 Etcd 需要重启服务, 可能会造成一定范围时间内的服务不可用, 启动完成时会对 Master 中的 apiServer 以及 Calico 进行重新配置并启动的过程.
部署安装:
$ ansible-playbook -i nodes etcd_certificate_rotation.yml -vv
在 Docker 内使用 Ansible 进行部署, 使用时挂载本地的 nodes 文件和 group_vars/all.yml 文件进行部署。
部署安装: (版本请自己根据需求查看 slzcc/crane 获取)
$ docker run --rm -i \
-v ~/.ssh:/root/.ssh \
-v ${PWD}/nodes:/crane/nodes \
-v ${PWD}/group_vars:/carne/group_vars \
slzcc/crane:v1.15.x.x \
-i nodes main.yml -vv
切记!不要在任何 Master 或者 Node 节点上使用 Ansible in Docker 会造成 Dockerd 被重启导致服务中断!
如果实例上的 daemon.json 与部署的文件一致, 则不会导致 DockerD 重启, 可以在任意节点上使用 Ansible in Docker. 如果第一次部署请配置如下:
$ systemctl stop docker
$ cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"exec-opts": ["native.cgroupdriver=cgroupfs"],
"log-driver": "json-file",
"log-opts": {
"max-size": "1G"
},
"data-root": "/var/lib/docker",
"insecure-registry": []
}
EOF
$ systemctl start docker
通过自定义 daemin.json 来保证 Ansible in Docker 不重启 DockerD。
Logo 图片并非商业, 本人无意侵犯版权。 前 Ansible-Kubernetes 正式更名 Crane