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

相关推荐
chuanauc2 小时前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉2 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信2 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记2 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花2 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay2 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu2 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记6 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
疯子的模样11 小时前
Docker 安装 Neo4j 保姆级教程
docker·容器·neo4j
风清再凯12 小时前
自动化工具ansible,以及playbook剧本
运维·自动化·ansible