欢迎光临
我们一直在努力

企业级自动化部署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

[defaults]
inventory = ./inventory
host_key_checking = False
remote_user = root

2. 创建 inventory 主机清单文件

对集群中的所有节点进行功能定义和分组,统一管理集群变量。

路径:~/ansible-k8s-deployment/inventory

[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


– 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 目录结构

标准化创建分层角色目录,适配企业维护规范:

mkdir -p roles/{common,master,worker}/tasks

(a) 编写 common 公共角色(所有节点执行)

统一关闭防火墙、SELinux、Swap,加载内核参数、部署容器运行时、配置国内K8s镜像源。

路径:~/ansible-k8s-deployment/roles/common/tasks/main.yml


# 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


# 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


– 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


collections:
– name: ansible.posix
version: ">=1.5.4" # 指定一个版本范围,保证稳定性
– name: community.general
version: ">=8.5.0"

2. 一键安装依赖集合

cd ~/ansible-k8s-deployment
ansible-galaxy install -r requirements.yml

3. 执行自动化部署脚本

ansible-playbook deploy-k8s.yml

执行耗时5-10分钟,全程自动配置,无需人工干预。

第五步:集群状态验证

在Master节点执行以下命令,验证集群部署结果:

1. 查看节点状态

kubectl get nodes -o wide

所有节点状态为 Ready 即为正常。

2. 查看系统组件Pod

kubectl get pods -A

确保 kube-system 命名空间下 coredns、calico、etcd、kube-apiserver 等组件全部 Running。

第六步:基础工具自动化安装

统一安装运维必备工具:

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

赞(0)
未经允许不得转载:171主机测评 » 企业级自动化部署K8s集群|Ansible一键搭建Kubernetes v1.32集群
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址