本文介绍如何使用Ansible Playbook实现生产级别高可用Kubernetes集群的自动化部署。该方案支持系统初始化配置、集群证书自动签发、etcd集群安装配置、haproxy及keepalived部署、IPv4/IPv6双栈网络、SELINUX启用、信创操作系统适配,并采用bootstrap认证机制与Kubernetes组件健康检查。此外,还提供集群节点扩容、证书替换和版本升级等运维功能。本Playbook采用二进制方式进行部署,确保生产环境稳定可靠。

代码获取
执行以下命令拉取部署代码:
git clone https://github.com/kubeop/k8s.git
库存配置
编辑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]
10.43.75.198 hostname=haproxy-001 type=MASTER priority=100
10.43.75.199 hostname=haproxy-002 type=BACKUP priority=90
# 控制平面节点组
[master]
10.43.75.210 hostname=master-001
10.43.75.211 hostname=master-002
10.43.75.212 hostname=master-003
# 工作节点组(gpu=true标识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-001节点上安装所需软件:
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"
已挂载磁盘的数据目录绑定:
ansible-playbook fdisk.yml -i inventory -l master,worker -e "disk=sdb dir=/data" -t bind_dir
离线资源下载
ansible-playbook download.yml
集群部署
执行完整部署流程:
# 前提:已完成磁盘分区和离线包下载
ansible-playbook cluster.yml -i inventory
# 使用现有负载均衡时跳过haproxy安装
ansible-playbook cluster.yml -i inventory --skip-tags=haproxy,keepalived
# 允许master节点参与调度
ansible-playbook cluster.yml -i inventory --skip-tags=create_master_taint
工作节点扩容
在inventory的worker组添加新节点后执行:
磁盘初始化:
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}}目录后,保留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.pem \
--endpoints=https://10.43.75.201:2379,https://10.43.75.202:2379,https://10.43.75.203:2379
清理旧证书:
ansible -i inventory master,worker -m shell -a "rm -rf /etc/kubernetes/pki/kubelet*"
重启节点组件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
注意:使用etcd证书的网络插件(如calico、cilium)需同步更新证书。
重启网络插件(以cilium为例):
kubectl get pod -n kube-system | grep -v NAME | grep cilium | awk '{print $1}' | xargs kubectl -n kube-system delete pod
版本升级
修改group_vars/all.yml中的kubernetes.version参数后:
下载新版本资源:
ansible-playbook download.yml
可选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
节点排水:
kubectl drain --ignore-daemonsets --force <节点名称>
重启节点组件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
恢复节点调度:
kubectl uncordon <节点名称>
节点清理
移除节点配置:
ansible-playbook reset.yml -i inventory -l ${IP} -e "flush_iptables=true"