企业级自动化部署K8s集群|Ansible一键搭建Kubernetes v1.32集群

承接上文

上一篇博客我详细讲解了 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.posixcommunity.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角色分离架构,实现了集群环境的标准化、自动化、可维护化,同时全程国内镜像适配,彻底解决网络访问问题,可直接落地用于企业测试、预发、生产环境。