AlmaLinux使用Ansible自动部署k8s集群

发布于:2025-02-14 ⋅ 阅读:(33) ⋅ 点赞:(0)

以下是使用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是否运行正常

关键说明

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


网站公告

今日签到

点亮在社区的每一天
去签到