AlmaLinux使用Ansible自动部署k8s集群

以下是使用Ansible在AlmaLinux上自动化部署Kubernetes(K8S)集群的详细步骤:


1. 环境准备

1.1 节点规划
  • 至少3台AlmaLinux 9服务器(1个Master,2个Worker)
  • 确保所有节点网络互通,SSH免密登录已配置
  • 关闭SELinux和防火墙(或配置放行K8S所需端口)
1.2 修改主机名和hosts文件
bash 复制代码
# 所有节点执行
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

yaml 复制代码
---
- 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

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. 执行部署

bash 复制代码
# 安装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)

bash 复制代码
# 在Master节点执行
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

6. 验证集群状态

bash 复制代码
kubectl get nodes  # 所有节点应显示Ready
kubectl get pods -A  # 检查所有Pod是否运行正常

关键说明

  1. 版本兼容性:示例使用Kubernetes 1.28,需确保containerd版本兼容。
  2. 网络配置--pod-network-cidr需与Calico的默认配置匹配。
  3. 高可用:生产环境建议部署多Master节点。
  4. 安全加固:根据需要配置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 文件

相关推荐
ZHOU_WUYI7 分钟前
Milvus Docker 部署教程
docker·容器·milvus
东方未明01081 小时前
docker(四)使用篇一:docker 镜像仓库
docker·容器·镜像仓库
Mr.小海2 小时前
k8s 1.10.26 一次containerd失败引发kubectl不可用问题
云原生·容器·kubernetes
ChironW2 小时前
Ubuntu 22.04.5 LTS上部署Docker及相关优化
ubuntu·docker·容器
文静小土豆6 小时前
K8S redis 部署
redis·kubernetes·bootstrap
在未来等你6 小时前
互联网大厂Java求职面试:构建高并发直播平台的架构设计与优化
java·spring boot·微服务·kubernetes·高并发·分布式系统·直播平台
sky北城16 小时前
ansible进阶02
ansible
李匠202419 小时前
C++GO语言微服务之Dockerfile && docker-compose②
c++·容器
斤斤计较19 小时前
Docker 环境安装(2025最新版)
运维·docker·容器
小锋学长生活大爆炸19 小时前
【教程】Docker方式本地部署Overleaf
运维·docker·容器