使用 Ansible 项目 kubespray 配合特定版本标签可部署 Kubernetes v1.24 集群,但该版本已于 2023 年 5 月停止维护,仅适用于遗留系统兼容或隔离测试环境,生产环境存在安全更新缺失风险。
先说结论:技术可行但需谨慎,必须指定容器运行时为 containerd 且确认 kubespray 版本支持。
- 适合:遗留业务迁移、离线环境测试、特定版本兼容性验证
- 先准备:至少 3 台主控节点实现高可用、所有节点 SSH 免密互通、关闭 swap 分区
- 验收:kubectl get nodes 显示 Ready 状态、kube-apiserver 多实例存活
命令速用版
在配置好 inventory 主机清单后,使用以下 Ansible 命令触发部署流程,需确保本地已安装 ansible 及 kubespray 依赖。
ansible-playbook -i inventory/mycluster/hosts.yml `--become` `--user`=deploy cluster.yml若需指定 Kubernetes 版本,需在 kubespray 的 roles/download/defaults/main.yml 中修改 kube_version 变量为 v1.24.0 或对应小版本。
为什么会这样
Kubernetes v1.24 移除了 Dockershim,导致默认容器运行时配置发生变化,Ansible 自动化脚本需明确指定运行时类型。
Ansible 通过 SSH 协议无代理执行任务,适合批量配置系统内核参数、安装容器运行时及初始化集群组件。高可用架构依赖多个 control-plane 节点前端挂载负载均衡器,kubespray 内置了 haproxy 或 nginx 的自动化配置逻辑。v1.24 版本较旧,主流自动化工具的新版本可能默认支持更高版本,需手动锁定版本变量。
分步处理
按顺序执行以下步骤,每步完成后检查对应状态,避免后续步骤因前置条件失败而报错。
1. 准备基础环境
在所有目标节点关闭 swap 分区,否则 kubelet 无法启动。设置 net.bridge.bridge-nf-call-iptables 为 1。
swapoff -a
sed -i '/ swap / s/^\/#/' /etc/fstab2. 获取 kubespray 代码
克隆官方仓库并 checkout 到支持 v1.24 的稳定标签,例如 v2.20.0 左右版本,具体需查阅 release notes。
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
git checkout -b release-2.20 origin/release-2.203. 配置主机清单
复制 sample inventory 模板,填写 master 和 worker 节点 IP,确保至少 3 个 master 节点以实现高可用。
cp -rfp inventory/sample inventory/mycluster
vim inventory/mycluster/hosts.yml4. 指定容器运行时
编辑 group_vars/all/all.yml,设置 container_manager 为 containerd,因 v1.24 不再支持 docker shim。
container_manager: containerd5. 执行部署
运行 ansible-playbook 命令,添加 -b 参数获取 sudo 权限,部署过程约 10-30 分钟,视网络速度而定。
怎么验证是否生效
部署完成后,在任意 master 节点使用 kubectl 工具检查集群状态,确认组件健康且无重启循环。
1. 检查节点状态
所有节点应显示 Ready,STATUS 列不为 NotReady 或 SchedulingDisabled。
kubectl get nodes2. 检查系统组件
kube-system 命名空间下的核心 Pod 应处于 Running 状态,特别是 kube-apiserver 和 etcd。
kubectl get pods -n kube-system3. 验证高可用
手动停止一个 master 节点,观察集群是否仍可读写,apiserver 负载均衡是否自动切换。
常见坑
列出容易出错的点,提醒哪些场景应该谨慎。
- 版本不匹配:新版的 kubespray 可能移除了对 v1.24 的支持,强行部署会导致下载镜像失败,务必核对 roles/download 目录中的版本列表。
- 容器运行时错误:若未显式指定 containerd,脚本可能尝试配置 docker,导致 kubelet 启动失败,日志报错 unsupported CRI。
- 网络插件兼容性:Calico 或 Flannel 版本需与 K8s v1.24 匹配,过新的 CNI 插件可能调用已废弃的 API。
- 安全组限制:云平台需开放 6443、2379、2380 等端口,否则节点间心跳检测失败,集群无法初始化。
常见问题
Kubernetes v1.24 现在还能用于生产吗?
不建议用于新生产环境,该版本已停止安全更新,存在未修复漏洞风险。
Ansible 部署失败如何回滚?
kubespray 提供 reset.yml 脚本,可清理集群配置,但需手动重置节点系统状态。
高可用负载均衡如何配置?
kubespray 默认在 master 节点本地运行 haproxy,外部可通过 keepalived 浮动 IP 访问 apiserver。
参考来源
- Kubernetes Release Schedule: https://kubernetes.io/releases/
- Kubespray GitHub Repository: https://github.com/kubernetes-sigs/kubespray
- Kubernetes v1.24 Release Notes: https://kubernetes.io/blog/2022/05/03/kubernetes-v1-24-release/