承接上文
上一篇博客我详细讲解了 kubeadm 手动搭建 K8s 集群 的全流程,适合新手学习、理解集群底层原理。但在真实企业生产环境中,绝对不会手动逐台部署集群。
手动部署存在致命短板:部署效率低、人为操作误差大、环境无法标准化、集群扩容繁琐、多节点配置不一致。
所以企业运维、云原生团队统一采用 Ansible 自动化部署 ,通过 Playbook 脚本统一管控所有节点,实现一条命令完成集群初始化、环境配置、插件部署、节点入网,标准化、可复用、可批量扩容。
本文作为进阶实战篇,手把手带大家实现 Ansible Roles 架构一键部署 K8s v1.32 集群,全程替换国内镜像源,解决境外网址无法访问、拉取超时、资源解析失败等所有网络问题,开箱即用。
前置环境说明
-
操作系统:CentOS Stream 9 / CentOS 7
-
K8s 版本:v1.32(稳定生产版)
-
容器运行时:containerd
-
网络插件:Calico v3.27.3
-
集群架构:1 Master + 2 Worker 单控制平面集群
-
部署方式:Ansible Roles 企业最佳实践(角色分离、解耦易维护)
-
网络优化:全部替换阿里云国内镜像源,彻底规避境外源访问失败问题
第三步:编写Ansible Playbook文件
项目采用Ansible Roles的最佳实践原则,将不同角色的任务(公共配置、Master配置、Worker配置)分离开,这样会使得Playbook清晰且易于维护。
1. 创建 ansible.cfg 配置文件
这个文件为Ansible设置主机清单(inventory)的位置,包括一些基础配置。
路径:~/ansible-k8s-deployment/ansible.cfg
bash
[defaults]
inventory = ./inventory
host_key_checking = False
remote_user = root
2. 创建 inventory 主机清单文件
对集群中的所有节点进行功能定义和分组,统一管理集群变量。
路径:~/ansible-k8s-deployment/inventory
bash
[masters]
k8s-node1 ansible_host=192.168.30.11
[workers]
k8s-node2 ansible_host=192.168.30.12
k8s-node3 ansible_host=192.168.30.13
[all:vars]
# 在单Master集群需要明确指定Master的IP
# 如果是多Master高可用集群,需要配置VIP
master_ip = 192.168.30.11
# 为K8s Pod网络指定CIDR,Calico网络插件需要
pod_network_cidr = "10.244.0.0/16"
3. 创建 deploy-k8s.yml 主 playbook
ansible的入口文件,按顺序调用不同的角色,规范集群部署流程。
路径:~/ansible-k8s-deployment/deploy-k8s.yml
bash
---
- name: 1. Configure all nodes with common settings
hosts: all
become: true
roles:
- common
- name: 2. Deploy Kubernetes master node
hosts: masters
become: true
roles:
- master
- name: 3. Deploy Kubernetes worker nodes
hosts: workers
become: true
roles:
- worker
# 循环所有 worker 节点,给节点打上 worker 角色标签
# 作用:原生 kubeadm 只会给 master 打 master 标签,worker 默认无角色标识
# 打标签后,kubectl get nodes 能清晰区分 Master/Worker,调度策略、监控、业务部署可基于节点标签筛选机器。
- name: 4. Label worker nodes from master
hosts: masters
become: true
tasks:
- name: Apply worker role label to each worker node
ansible.builtin.command: "kubectl label node {{ item }} node-role.kubernetes.io/worker=worker --overwrite"
loop: "{{ groups['workers'] }}"
4. 创建 roles 目录结构
标准化创建分层角色目录,适配企业维护规范:
bash
mkdir -p roles/{common,master,worker}/tasks
(a) 编写 common 公共角色(所有节点执行)
统一关闭防火墙、SELinux、Swap,加载内核参数、部署容器运行时、配置国内K8s镜像源。
路径:~/ansible-k8s-deployment/roles/common/tasks/main.yml
bash
---
# tasks file for common role
# 作用:永久关闭 SELinux 安全拦截。
# K8s 操作容器网络、挂载存储时 SELinux 会拦截请求,实验 / 生产集群都必须关闭。
- name: Disable SELinux
ansible.posix.selinux:
state: disabled
# swapoff -a:临时关闭交换分区
# 替换/etc/fstab注释 swap 开机挂载:永久关闭
# K8s 官方强制要求关闭 Swap,内存交换会导致调度、OOM、Pod 漂移异常。
- name: Disable Swap
block:
- name: Turn off swap
ansible.builtin.command: swapoff -a
- name: Comment out swap in fstab
ansible.builtin.replace:
path: /etc/fstab
regexp: '^(.*swap.*)$'
replace: '# \1'
when: ansible_swaptotal_mb > 0
# 加载overlay:容器镜像分层存储依赖内核模块
# 加载br_netfilter:网桥流量转发,Pod 之间、Pod 和宿主机互通必备
# 写入/etc/sysctl.d/k8s.conf开启三条核心转发参数
# sysctl --system:立刻生效内核配置,无需重启服务器
- name: Configure kernel modules and sysctl for Kubernetes
block:
- name: Load overlay module
community.general.modprobe: { name: overlay, state: present }
- name: Load br_netfilter module
community.general.modprobe: { name: br_netfilter, state: present }
- name: Create k8s.conf for sysctl
ansible.builtin.copy:
dest: /etc/sysctl.d/k8s.conf
content: |
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
- name: Apply sysctl params
ansible.builtin.command: sysctl --system
# 安装dnf-utils、lvm2:yum 工具与存储依赖
# 下载 / 写入 docker-ce 源文件:提供 containerd 安装 yum 仓库
# 安装containerd.io:K8s 官方标准容器运行时,替代 docker daemon
# 生成默认 containerd 配置,修改SystemdCgroup=true
# Kubelet 必须使用 systemd cgroup 驱动,不修改会出现 kubeadm 初始化报错
# 重启并开机自启 containerd 服务
- name: Install and configure containerd
block:
- name: Install required packages for containerd
ansible.builtin.dnf:
name: [dnf-utils, device-mapper-persistent-data, lvm2]
state: present
- name: Add Docker CE repository
ansible.builtin.get_url:
url: https://download.docker.com/linux/centos/docker-ce.repo
dest: /etc/yum.repos.d/docker-ce.repo
- name: Install containerd.io
ansible.builtin.dnf:
name: containerd.io
state: present
- name: Configure containerd to use systemd cgroup
ansible.builtin.shell: |
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
- name: Restart and enable containerd service
ansible.builtin.systemd:
name: containerd
state: restarted
enabled: yes
# 写入官方 K8s rpm 仓库地址,用于安装 kubeadm/kubelet/kubectl,exclude临时屏蔽防止提前更新
- name: Add Kubernetes v1.32 yum repository
ansible.builtin.yum_repository:
name: kubernetes
description: Kubernetes
# --- 版本更新点 ---
baseurl: https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
gpgkey: https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
gpgcheck: yes
enabled: yes
exclude: kubelet kubeadm kubectl cri-tools kubernetes-cni
# 安装集群三件套:kubelet、kubeadm、kubectl
# kubeadm:一键初始化 master、节点加入集群工具
# kubelet:每个节点常驻代理,管理本机 Pod 生命周期
# kubectl:集群命令行客户端,操作 apiserver
- name: Install Kubernetes components
ansible.builtin.dnf:
name: [kubelet, kubeadm, kubectl]
state: present
disable_excludes: kubernetes
# 服务器重启后 kubelet 自动运行,保证节点自动恢复集群连接
- name: Enable kubelet service
ansible.builtin.systemd:
name: kubelet
enabled: yes
(b) 编写 master 控制节点角色
仅在Master节点执行集群初始化、权限配置、Calico网络部署。
路径:~/ansible-k8s-deployment/roles/master/tasks/main.yml
bash
---
# tasks file for master role
# kubeadm init 初始化 K8s 控制平面
# --apiserver-advertise-address={{ master_ip }}:指定 master 节点 IP 192.168.30.11
# --pod-network-cidr={{ pod_network_cidr }}:Pod 网段10.244.0.0/16,适配 Calico 网络插件
# --upload-certs:将集群证书上传至 secret,方便后续扩容多 Master/Worker 节点生成 etcd、apiserver、controller-manager、scheduler 全套控制组件。
- name: Initialize the Kubernetes cluster with kubeadm
ansible.builtin.shell: "kubeadm init --apiserver-advertise-address={{ master_ip }} --pod-network-cidr={{ pod_network_cidr }} --upload-certs"
args:
creates: /etc/kubernetes/admin.conf
# 存放集群管理员认证配置文件,权限 755 保证 root 可读
- name: Setup kubectl for the root user
ansible.builtin.file:
path: /root/.kube
state: directory
owner: root
group: root
mode: '0755'
# admin.conf是集群最高权限凭证,复制后直接用 kubectl 操作集群,否则会报无权限
- name: Copy admin.conf to user's kube config
ansible.builtin.copy:
src: /etc/kubernetes/admin.conf
dest: /root/.kube/config
remote_src: yes
owner: root
group: root
mode: '0644'
# 部署 Calico 网络插件
# 应用 Calico 官方 yaml,提供 Pod 之间、跨节点 Pod 网络通信,不部署 Calico 所有 Pod 网络不通、状态无法 Ready
- name: Install Calico network CNI
ansible.builtin.shell: "kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml"
args:
creates: /etc/cni/net.d/10-calico.conflist
# 生成一条带 token、hash 校验的 join 命令,存到 Ansible 变量join_command,供给 Worker 角色调用
- name: Generate join command
ansible.builtin.command: kubeadm token create --print-join-command
register: join_command_raw
- name: Store join command
ansible.builtin.set_fact:
join_command: "{{ join_command_raw.stdout }}"
(c) 编写 worker 工作节点角色
所有Worker节点自动读取Master生成的入网命令,批量加入集群,无需手动操作。
路径:~/ansible-k8s-deployment/roles/worker/tasks/main.yml
bash
---
- name: Join the worker nodes to the cluster
ansible.builtin.command: "{{ hostvars[groups['masters'][0]]['join_command'] }}"
args:
creates: /etc/kubernetes/kubelet.conf
第四步:解决Ansible依赖报错,安装集合插件
直接执行Playbook会报错,原因是代码中使用了ansible.posix 、community.general 扩展集合,默认未安装。
1. 创建依赖配置文件
路径:~/ansible-k8s-deployment/requirements.yml
bash
---
collections:
- name: ansible.posix
version: ">=1.5.4" # 指定一个版本范围,保证稳定性
- name: community.general
version: ">=8.5.0"
2. 一键安装依赖集合
bash
cd ~/ansible-k8s-deployment
ansible-galaxy install -r requirements.yml
3. 执行自动化部署脚本
bash
ansible-playbook deploy-k8s.yml
执行耗时5-10分钟,全程自动配置,无需人工干预。
第五步:集群状态验证
在Master节点执行以下命令,验证集群部署结果:
1. 查看节点状态
bash
kubectl get nodes -o wide
所有节点状态为 Ready 即为正常。
2. 查看系统组件Pod
bash
kubectl get pods -A
确保 kube-system 命名空间下 coredns、calico、etcd、kube-apiserver 等组件全部 Running。
第六步:基础工具自动化安装
统一安装运维必备工具:
bash
# 安装git, tar
dnf install -y git tar
# 安装Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
helm version # 验证
手动部署 VS Ansible自动化部署
1. 手动 kubeadm 部署
-
优点:适合学习、考证、理解底层原理
-
缺点:效率极低、易出错、无法标准化、不支持批量扩容、生产环境禁用
2. Ansible 企业自动化部署
-
优点:一键部署、环境100%标准化、支持批量扩缩容、可复用、适配CI/CD、零人为误差
-
缺点:需要掌握Ansible Roles架构,适合生产运维
总结
K8s手动部署是学习基础,Ansible自动化部署才是企业生产标配。通过Roles角色分离架构,实现了集群环境的标准化、自动化、可维护化,同时全程国内镜像适配,彻底解决网络访问问题,可直接落地用于企业测试、预发、生产环境。