以下是使用Ansible在AlmaLinux上自动化部署Kubernetes(K8S)集群的详细步骤:
1. 环境准备
1.1 节点规划
- 至少3台AlmaLinux 9服务器(1个Master,2个Worker)
- 确保所有节点网络互通,SSH免密登录已配置
- 关闭SELinux和防火墙(或配置放行K8S所需端口)
1.2 修改主机名和hosts文件
# 所有节点执行
sudo hostnamectl set-hostname master
sudo hostnamectl set-hostname worker1
sudo hostnamectl set-hostname worker2# 编辑/etc/hosts
echo "192.168.1.10 master
192.168.1.11 worker1
192.168.1.12 worker2" | sudo tee -a /etc/hosts
2. 编写Ansible Playbook
创建文件 k8s-cluster.yml
:
---
- name: 初始化所有节点hosts: allbecome: yestasks:- name: 禁用SELinuxselinux:state: disablednotify: reboot_server- name: 关闭防火墙service:name: firewalldstate: stoppedenabled: no- name: 禁用Swapshell: |swapoff -ased -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab- name: 加载内核模块shell: |modprobe overlaymodprobe br_netfilterregister: modprobechanged_when: false- name: 配置sysctl参数copy:content: |net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1dest: /etc/sysctl.d/k8s.confnotify: reload_sysctlhandlers:- name: reboot_serverreboot:msg: "Reboot after disabling SELinux"reboot_timeout: 300- name: reload_sysctlcommand: sysctl --system- name: 安装容器运行时(containerd)hosts: allbecome: yestasks:- name: 安装containerddnf:name:- containerd- docker-ce- docker-ce-clistate: presentenablerepo: docker-ce-stable- name: 配置containerdcopy:src: containerd-config.tomldest: /etc/containerd/config.tomlnotify: restart_containerd- name: 启动containerd服务service:name: containerdstate: startedenabled: yeshandlers:- name: restart_containerdservice:name: containerdstate: restarted- name: 安装Kubernetes组件hosts: allbecome: yestasks:- name: 添加Kubernetes仓库yum_repository:name: kubernetesdescription: Kubernetes Repobaseurl: https://pkgs.k8s.io/core:/stable:/v1.28/rpm/gpgkey: https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.keygpgcheck: yesenabled: yes- name: 安装kubeadm/kubelet/kubectldnf:name:- kubeadm-1.28.0- kubelet-1.28.0- kubectl-1.28.0state: present- name: 启用kubelet服务service:name: kubeletenabled: yes- name: 初始化Master节点hosts: masterbecome: yestasks:- name: 执行kubeadm initshell: kubeadm init --apiserver-advertise-address=192.168.1.10 --pod-network-cidr=10.244.0.0/16register: kubeadm_init- name: 保存join命令set_fact:join_command: "{{ kubeadm_init.stdout | regex_search('kubeadm join.*') }}"- name: 配置kubectlshell: |mkdir -p $HOME/.kubecp /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config- name: 加入Worker节点hosts: workersbecome: yestasks:- name: 执行kubeadm joinshell: "{{ hostvars['master']['join_command'] }}"
3. 配置文件
containerd-config.toml
创建文件 containerd-config.toml
:
version = 2
[plugins."io.containerd.grpc.v1.cri"][plugins."io.containerd.grpc.v1.cri".containerd]snapshotter = "overlayfs"[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]runtime_type = "io.containerd.runc.v2"[plugins."io.containerd.grpc.v1.cri".registry][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]endpoint = ["https://registry-1.docker.io"]
4. 执行部署
# 安装Ansible
sudo dnf install ansible -y# 创建Ansible inventory文件(hosts.ini)
echo "[master]
192.168.1.10[workers]
192.168.1.11
192.168.1.12" > hosts.ini# 运行Playbook
ansible-playbook -i hosts.ini k8s-cluster.yml
5. 安装网络插件(Calico)
# 在Master节点执行
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
6. 验证集群状态
kubectl get nodes # 所有节点应显示Ready
kubectl get pods -A # 检查所有Pod是否运行正常
关键说明
- 版本兼容性:示例使用Kubernetes 1.28,需确保containerd版本兼容。
- 网络配置:
--pod-network-cidr
需与Calico的默认配置匹配。 - 高可用:生产环境建议部署多Master节点。
- 安全加固:根据需要配置TLS证书、RBAC等。
故障解决:
1.安装ansible出现dnf无法找到ansible的包
自动删除重复仓库条目
可以使用 sed 或 awk 等工具查找并删除重复的仓库条目。以下是一个基本的方法来删除重复的仓库条目。
使用 awk 和 sort 查找并删除重复条目
创建脚本或直接使用命令,遍历 /etc/yum.repos.d/ 目录下的 .repo 文件,删除重复的仓库条目。
sudo awk ‘!seen[$0]++’ /etc/yum.repos.d/*.repo > /tmp/temp.repo && sudo mv /tmp/temp.repo /etc/yum.repos.d/
这个命令的作用:
awk ‘!seen[$0]++’ 会读取每个 .repo 文件并仅保留第一次出现的行,忽略重复的行。
/tmp/temp.repo 将去重后的内容输出到临时文件。
然后使用 mv 命令将去重后的文件覆盖原 .repo 文件