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 文件

相关推荐
勇哥的编程江湖2 小时前
starrocks官网docker部署mysql无法连接
运维·docker·容器
终端行者10 小时前
k8s之Ingress服务接入控制器
云原生·容器·kubernetes
IT成长日记12 小时前
【自动化运维神器Ansible】Ansible常用模块之File模块详解
运维·自动化·ansible·file·常用模块
longxibo14 小时前
飞牛系统安装DataEase自定义Docker包
运维·docker·容器
学Linux的语莫15 小时前
k8s的nodeport和ingress
网络·rpc·kubernetes
胡耀超16 小时前
基于Docker的GPU版本飞桨PaddleOCR部署深度指南(国内镜像)2025年7月底测试好用:从理论到实践的完整技术方案
运维·python·docker·容器·ocr·paddlepaddle·gpu
aashuii21 小时前
k8s通过NUMA亲和分配GPU和VF接口
云原生·容器·kubernetes
Most661 天前
kubesphere安装使用
kubernetes
Kentos(acoustic ver.)1 天前
云原生 —— K8s 容器编排系统
云原生·容器·kubernetes·云计算·k8s
Linux运维技术栈1 天前
从零构建 Node20+pnpm+pm2 环境镜像:基于 Dockerfile 的两种方案及持久化配置指南
运维·docker·容器