以下是使用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: all
become: yes
tasks:
- name: 禁用SELinux
selinux:
state: disabled
notify: reboot_server
- name: 关闭防火墙
service:
name: firewalld
state: stopped
enabled: no
- name: 禁用Swap
shell: |
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- name: 加载内核模块
shell: |
modprobe overlay
modprobe br_netfilter
register: modprobe
changed_when: false
- name: 配置sysctl参数
copy:
content: |
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
dest: /etc/sysctl.d/k8s.conf
notify: reload_sysctl
handlers:
- name: reboot_server
reboot:
msg: "Reboot after disabling SELinux"
reboot_timeout: 300
- name: reload_sysctl
command: sysctl --system
- name: 安装容器运行时(containerd)
hosts: all
become: yes
tasks:
- name: 安装containerd
dnf:
name:
- containerd
- docker-ce
- docker-ce-cli
state: present
enablerepo: docker-ce-stable
- name: 配置containerd
copy:
src: containerd-config.toml
dest: /etc/containerd/config.toml
notify: restart_containerd
- name: 启动containerd服务
service:
name: containerd
state: started
enabled: yes
handlers:
- name: restart_containerd
service:
name: containerd
state: restarted
- name: 安装Kubernetes组件
hosts: all
become: yes
tasks:
- name: 添加Kubernetes仓库
yum_repository:
name: kubernetes
description: Kubernetes Repo
baseurl: https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
gpgkey: https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
gpgcheck: yes
enabled: yes
- name: 安装kubeadm/kubelet/kubectl
dnf:
name:
- kubeadm-1.28.0
- kubelet-1.28.0
- kubectl-1.28.0
state: present
- name: 启用kubelet服务
service:
name: kubelet
enabled: yes
- name: 初始化Master节点
hosts: master
become: yes
tasks:
- name: 执行kubeadm init
shell: kubeadm init --apiserver-advertise-address=192.168.1.10 --pod-network-cidr=10.244.0.0/16
register: kubeadm_init
- name: 保存join命令
set_fact:
join_command: "{{ kubeadm_init.stdout | regex_search('kubeadm join.*') }}"
- name: 配置kubectl
shell: |
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- name: 加入Worker节点
hosts: workers
become: yes
tasks:
- name: 执行kubeadm join
shell: "{{ 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 文件