使用 Ansible Playbook 可以自动化部署一套生产级别的高可用 Kubernetes 集群。本方案采用二进制方式部署,支持初始化系统配置、自动签发集群证书、安装配置 etcd 集群、安装配置 haproxy 及 keepalived、IPv4/IPv6 双栈网络、支持开启 SELINUX,并兼容信创操作系统。认证方式采用 bootstrap,并对所有 Kubernetes 组件进行健康检查。此外,该方案还支持集群节点扩容、替换集群证书以及 Kubernetes 版本升级等运维操作。

拉取代码
首先需要获取部署脚本,执行以下命令克隆代码仓库:
git clone https://github.com/kubeop/k8s.git
配置 inventory
Inventory 文件用于定义集群中所有节点的角色和配置。请根据你的实际环境编辑此文件。
# 本组内填写etcd服务器及主机名(会校验是否以横杠分割),集群节点名称会截取主机名以横杠分割后两段
[etcd]
10.43.75.201 hostname=etcd-001
10.43.75.202 hostname=etcd-002
10.43.75.203 hostname=etcd-003
# 使用云负载均衡时,可以注释以下haproxy内容
[haproxy]
10.43.75.198 hostname=haproxy-001 type=MASTER priority=100
10.43.75.199 hostname=haproxy-002 type=BACKUP priority=90
# 本组内填写master服务器及主机名(会校验是否以横杠分割),集群节点名称会截取主机名以横杠分割后两段
[master]
10.43.75.210 hostname=master-001
10.43.75.211 hostname=master-002
10.43.75.212 hostname=master-003
# 本组内填写worker服务器及主机名(会校验是否以横杠分割),集群节点名称会截取主机名以横杠分割后两段
# 最后面添加gpu=true 表示节点为GPU节点,运行时会配置使用GPU并且添加nvidia.com/gpu=true标签
# 启用GPU时,请先参考README自行在节点安装GPU驱动
[worker]
10.43.75.220 hostname=worker-001 gpu=false
10.43.75.221 hostname=worker-002 gpu=false
10.43.75.222 hostname=worker-003 gpu=false
注意:当 haproxy 和 kube-apiserver 部署在同一台服务器时,请在后续的配置中将 loadbalance.port 修改为其他不冲突的端口。
配置集群安装信息
编辑 group_vars/all.yml 文件,根据你的实际情况(如网络插件、版本号、服务网段等)进行修改。
安装 Ansible
可以在单独的控制机或任意一台 master 节点(例如 master-001)上安装 Ansible。执行以下命令:
pip3 install "ansible>=7.0.0,<10.0.0" -i https://mirrors.ustc.edu.cn/pypi/web/simple
pip3 install "netaddr>=0.10.1" -i https://mirrors.ustc.edu.cn/pypi/web/simple
格式化并挂载数据盘
如果节点已有数据盘但未挂载,可使用此步骤自动格式化并挂载。若已自行处理,可跳过。
ansible-playbook fdisk.yml -i inventory -e "disk=sdb dir=/data"
如果数据盘已格式化挂载,仅需将数据目录(如 /data)绑定到该磁盘,可以使用以下命令:
ansible-playbook fdisk.yml -i inventory -l master,worker -e "disk=sdb dir=/data" -t bind_dir
下载离线包
执行以下命令下载所有必要的软件包到本地,为离线部署做准备。
ansible-playbook download.yml
部署集群
完成以上准备后,即可开始部署集群。请根据你的环境选择对应的命令。
# 执行之前,请确认已经进行过磁盘分区
# 执行之前,请确认已经执行 ansible-playbook download.yml 完成安装包下载
ansible-playbook cluster.yml -i inventory
# 如已有负载均衡,请先行配置好负载均衡,并跳过安装haproxy和keepalived
ansible-playbook cluster.yml -i inventory --skip-tags=haproxy,keepalived
# 如master节点也需要调度(即去除master节点的污点)
ansible-playbook cluster.yml -i inventory --skip-tags=create_master_taint
扩容 worker 节点
当需要增加计算资源时,可以对 worker 节点进行扩容。
- 在
inventory 文件的 [worker] 组中,添加新增服务器的信息。
- 执行以下一系列命令(请将
${SCALE_WORKER_IP} 替换为新增节点的实际 IP)。
格式化挂载数据盘:
ansible-playbook fdisk.yml -i inventory -l ${SCALE_WORKER_IP} -e “disk=sdb dir=/data”
生成节点证书:
ansible-playbook cluster.yml -i inventory -t cert
初始化节点:
ansible-playbook cluster.yml -i inventory -l ${SCALE_WORKER_IP} -t verify,init
执行节点扩容:
ansible-playbook cluster.yml -i inventory -l ${SCALE_WORKER_IP} -t containerd,worker --skip-tags=bootstrap,create_master_label
替换集群证书
当证书临近过期时,需要替换集群证书。
- 备份并删除证书目录
{{cert.dir}}。
- 重新创建
{{cert.dir}} 目录。
- 务必保留并拷贝
token、sa.pub、sa.key 这三个文件到新目录。
- 执行以下命令重新生成并分发证书:
ansible-playbook cluster.yml -i inventory -t cert,dis_certs
- 证书分发后,需要依次重启各个组件。以下是详细步骤:
重启 etcd:
ansible -i inventory etcd -m systemd -a “name=etcd state=restarted”
验证 etcd 集群健康状态:
etcdctl endpoint health \
--cacert=/etc/etcd/pki/etcd-ca.pem \
--cert=/etc/etcd/pki/etcd-healthcheck-client.pem \
--key=/etc/etcd/pki/etcd-healthcheck-client.key \
--endpoints=https://10.43.75.201:2379,https://10.43.75.202:2379,https://10.43.75.203:2379
逐个删除所有节点旧的 kubelet 证书:
ansible -i inventory master,worker -m shell -a “rm -rf /etc/kubernetes/pki/kubelet*”
逐个重启节点上的 Kubernetes 组件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
重要提示:如果你的网络插件(如 Calico、Cilium)使用了 etcd 集群证书,请务必一同更新其配置并重启插件。
重启网络插件(以 Cilium 为例):
kubectl get pod -n kube-system | grep -v NAME | grep cilium | awk ‘{print $1}‘ | xargs kubectl -n kube-system delete pod
说明:更新证书可能会导致网络插件异常,建议重启。请根据你实际使用的网络插件替换上述命令中的关键字。
升级集群版本
若需升级 Kubernetes 版本,请按顺序执行以下步骤。
- 编辑
group_vars/all.yml 文件,将 kubernetes.version 修改为目标新版本。
- 下载新版本的离线安装包:
ansible-playbook download.yml
- (可选) 如需升级
etcd,执行以下命令(升级过程会自动重启 etcd 服务):
ansible-playbook cluster.yml -i inventory -l ${IP} -t install_etcd,dis_etcd_config
- 升级
Kubernetes 各组件二进制文件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t install_kubectl,install_master,install_worker
- 分发新的组件配置文件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t dis_master_config,dis_worker_config
- 在控制端,将目标节点设置为不可调度并驱逐其上 Pod:
kubectl drain —ignore-daemonsets —force <节点名称>
- 依次重启该节点上的所有
Kubernetes 组件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
- 恢复该节点的可调度状态:
kubectl uncordon <节点名称>
- 对集群中的其他节点重复步骤 6-8。
清理集群节点
如果需要从集群中移除某个节点并清理其安装的配置,可以使用以下命令:
ansible-playbook reset.yml -i inventory -l ${IP} -e “flush_iptables=true”
通过上述步骤,你可以使用 Ansible 高效、自动地管理生产环境的 Kubernetes 高可用集群,涵盖部署、扩容、证书轮换和版本升级等核心运维场景。希望这份教程能为你在 运维 与自动化部署的道路上提供清晰的指引。如果你想探讨更多关于 DevOps 或 云原生 的实践,欢迎访问 云栈社区 与广大开发者交流。