AlmaLinux使用Ansible自动部署k8s集群

embedded/2025/2/14 3:17:51/

以下是使用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: allbecome: yestasks:- name: 禁用SELinuxselinux:state: disablednotify: reboot_server- name: 关闭防火墙service:name: firewalldstate: stoppedenabled: no- name: 禁用Swapshell: |swapoff -ased -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab- name: 加载内核模块shell: |modprobe overlaymodprobe br_netfilterregister: modprobechanged_when: false- name: 配置sysctl参数copy:content: |net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1dest: /etc/sysctl.d/k8s.confnotify: reload_sysctlhandlers:- name: reboot_serverreboot:msg: "Reboot after disabling SELinux"reboot_timeout: 300- name: reload_sysctlcommand: sysctl --system- name: 安装容器运行时(containerd)hosts: allbecome: yestasks:- name: 安装containerddnf:name:- containerd- docker-ce- docker-ce-clistate: presentenablerepo: docker-ce-stable- name: 配置containerdcopy:src: containerd-config.tomldest: /etc/containerd/config.tomlnotify: restart_containerd- name: 启动containerd服务service:name: containerdstate: startedenabled: yeshandlers:- name: restart_containerdservice:name: containerdstate: restarted- name: 安装Kubernetes组件hosts: allbecome: yestasks:- name: 添加Kubernetes仓库yum_repository:name: kubernetesdescription: Kubernetes Repobaseurl: https://pkgs.k8s.io/core:/stable:/v1.28/rpm/gpgkey: https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.keygpgcheck: yesenabled: yes- name: 安装kubeadm/kubelet/kubectldnf:name:- kubeadm-1.28.0- kubelet-1.28.0- kubectl-1.28.0state: present- name: 启用kubelet服务service:name: kubeletenabled: yes- name: 初始化Master节点hosts: masterbecome: yestasks:- name: 执行kubeadm initshell: kubeadm init --apiserver-advertise-address=192.168.1.10 --pod-network-cidr=10.244.0.0/16register: kubeadm_init- name: 保存join命令set_fact:join_command: "{{ kubeadm_init.stdout | regex_search('kubeadm join.*') }}"- name: 配置kubectlshell: |mkdir -p $HOME/.kubecp /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config- name: 加入Worker节点hosts: workersbecome: yestasks:- name: 执行kubeadm joinshell: "{{ 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 文件


http://www.ppmy.cn/embedded/162040.html

相关文章

MongoDB 的基本概念

一、数据库(Database) 数据库是 MongoDB 中最高层次的概念,是一个存储数据的逻辑容器,它可以包含多个集合。一个 MongoDB 实例可以管理多个数据库,每个数据库都有自己独立的权限和存储空间。可以使用use命令在 Mongo …

23种设计模式的定义和应用场景-C#代码-汇总

23种设计模式的定义和应用场景: 1. 创建型模式(共5种) 单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(…

蓝桥杯试题:冒泡排序 选择排序

一、问题描述 在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队…

【开源免费】基于SpringBoot+Vue.JS公寓报修管理系统(JAVA毕业设计)

本文项目编号 T 186 ,文末自助获取源码 \color{red}{T186,文末自助获取源码} T186,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

使用Python爬虫获取1688工厂档案信息:深入解析

一、引言 在电商采购和供应链管理中,了解供应商的工厂信息是至关重要的一步。1688作为国内领先的B2B平台,提供了丰富的供应商和工厂档案信息。通过item_get_factory API接口,开发者可以获取工厂的详细信息,包括工厂名称、地址、联…

使用Python爬虫获取1688 App原数据API接口

一、引言 在电商领域,数据是企业决策、市场分析和产品优化的关键要素。1688作为国内领先的B2B电商平台,汇聚了海量的商品信息和交易数据。通过获取1688 App的原数据API接口,企业可以精准把握市场动态,了解竞争对手的策略&#xf…

C++病毒(^_^|)(2)

第二期 声明&#xff1a; 仅供损害电脑&#xff0c;不得用于非法。损坏电脑&#xff0c;作者一律不负责。此作为作者原创&#xff0c;转载请经过同意。 直接上代码 #include <bits/stdc.h> #include <windows.h> using namespace std; HHOOK g_hHook;void lrud(…

Kotlin 2.1.0 入门教程(十六)属性、getter、setter、幕后字段、后备属性、编译时常量、延迟初始化

属性声明 属性可以使用 var 关键字声明为可变的&#xff0c;也可以使用 val 关键字声明为只读的。 class Address {var name: String "Holmes, Sherlock"var street: String "Baker"var city: String "London"var state: String? nullvar…