找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5084

积分

0

好友

703

主题
发表于 3 小时前 | 查看: 4| 回复: 0

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

注意:当 haproxykube-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 节点进行扩容。

  1. inventory 文件的 [worker] 组中,添加新增服务器的信息。
  2. 执行以下一系列命令(请将 ${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

替换集群证书

当证书临近过期时,需要替换集群证书。

  1. 备份并删除证书目录 {{cert.dir}}
  2. 重新创建 {{cert.dir}} 目录。
  3. 务必保留并拷贝 tokensa.pubsa.key 这三个文件到新目录。
  4. 执行以下命令重新生成并分发证书:
ansible-playbook cluster.yml -i inventory -t cert,dis_certs
  1. 证书分发后,需要依次重启各个组件。以下是详细步骤:

重启 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 版本,请按顺序执行以下步骤。

  1. 编辑 group_vars/all.yml 文件,将 kubernetes.version 修改为目标新版本。
  2. 下载新版本的离线安装包:
ansible-playbook download.yml
  1. (可选) 如需升级 etcd,执行以下命令(升级过程会自动重启 etcd 服务):
ansible-playbook cluster.yml -i inventory -l ${IP} -t install_etcd,dis_etcd_config
  1. 升级 Kubernetes 各组件二进制文件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t install_kubectl,install_master,install_worker
  1. 分发新的组件配置文件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t dis_master_config,dis_worker_config
  1. 在控制端,将目标节点设置为不可调度并驱逐其上 Pod:
kubectl drain —ignore-daemonsets —force <节点名称>
  1. 依次重启该节点上的所有 Kubernetes 组件:
ansible-playbook cluster.yml -i inventory -l ${IP} -t restart_apiserver,restart_controller,restart_scheduler,restart_kubelet,restart_proxy,healthcheck
  1. 恢复该节点的可调度状态:
kubectl uncordon <节点名称>
  1. 对集群中的其他节点重复步骤 6-8。

清理集群节点

如果需要从集群中移除某个节点并清理其安装的配置,可以使用以下命令:

ansible-playbook reset.yml -i inventory -l ${IP} -e “flush_iptables=true”

通过上述步骤,你可以使用 Ansible 高效、自动地管理生产环境的 Kubernetes 高可用集群,涵盖部署、扩容、证书轮换和版本升级等核心运维场景。希望这份教程能为你在 运维 与自动化部署的道路上提供清晰的指引。如果你想探讨更多关于 DevOps云原生 的实践,欢迎访问 云栈社区 与广大开发者交流。




上一篇:Spring Boot集成Nacos:企业级RPC微服务治理与gRPC实践
下一篇:Kubernetes中Jenkins生产就绪部署实践:从概念到进阶流水线
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-12 08:13 , Processed in 0.746988 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表