Ansible部署Kubernetes
本博客内容参考:1
《Linux学习-Kubernetes学习之kubernetes安装部署(一)》
《Kubernetes官网》
B站Up主: 火星小刘《20分钟搭建kubernetes 1.24.1 - 全网最简捷高效的方式》
B站Up主: 貔貅云原生 《k8s 部署工具 kubez-ansible 的代码分析》
说明: 在实际安装过程当中请根据需要修改参数, 自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除,原因不兼容CRI接口
1 主机组清单
私网ip | 节点名称 | 主机名称 |
---|---|---|
172.19.139.231 | master-node | www.example1.com |
172.19.139.230 | secondary-node | www.example2.com |
172.19.139.229 | secondary-node | www.example3.com |
阿里云云服务器性能参数展示:
2 检查事项
2.1 检查yum源
博主测试使用的是阿里云服务器,Operation System是Alibaba Cloud Linux (Aliyun Linux) 2.1903 LTS (Hunting Beagle),在检查事项的末尾有最终的检查ansible剧本DEMO
更新完kubernetes.repo记得要yum makecache,刷新yum源缓存
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
下列为Ansible剧本代码DEMO:
---
- name: ---检查yum源仓库和操作系统信息---
hosts: all # 将your_target_host替换为您的目标主机名称或IP地址
gather_facts: false # 可选,如果您不需要收集主机信息,可以设置为false
tasks:
- name: ---列出已启用的yum仓库---
command: yum repolist enabled
register: yum_all_repolist
- name: 使用正则过滤出Kubernetes信息
set_fact:
kubernetes_repolist: "{{ yum_all_repolist.stdout | regex_findall('kubernetes', multiline=true) }}"
- name: Kubernetes_yum仓库信息如下
debug:
var: kubernetes_repolist
- name: ---获取操作系统信息---
command: cat /etc/os-release
register: os_release_info
- name: 操作系统信息如下
debug:
var: os_release_info.stdout_lines
2.2 检查防火墙以及Selinux
云主机的防火墙若为开启状态需要添加放行白名单,不然也会报错
2.3 检查云主机的VCPU
云主机的VCPU至少为2颗
在部署的过程当中,若低于2颗将会在安装kubelet的时候提示异常
2.4 检查云主机的云盘容量
云主机的云盘容量至少40G
Ansible剧本检查云盘以及docker运行状态的DEMO:
---
- name: 开始前置检查步骤
hosts: all # 将your_target_host替换为您的目标主机名称或IP地址
gather_facts: true # 可选,如果您不需要收集主机信息,可以设置为false
tasks:
- name: 第一步:使用"systemctl"检查Containerd的运行状态
command: systemctl is-active containerd
register: containerd_status
- name: Containerd的运行状态
debug:
var: containerd_status.stdout
- name: 第二步:使用"df -h"命令检查磁盘使用情况
command: df -h
register: df_output
- name: 磁盘的情况
debug:
var: df_output.stdout_lines
- name: 第三步:使用"cat /proc/cpuinfo"命令检查cpu核数
command: cat /proc/cpuinfo
register: cpuinfo_output
- name: 计算CPU数量
set_fact:
cpu_count: "{{ cpuinfo_output.stdout_lines | select('match', '^processor') | list | length }}"
- name: CPU核数
debug:
var: cpu_count
这边附上检查DEMO
---
- name: 开始前置检查步骤
hosts: all
gather_facts: true
become: yes
tasks:
- name: 第一步:使用"systemctl"检查Docker的运行状态
command: systemctl is-active docker
register: docker_status
- name: Docker的运行状态
debug:
var: docker_status.stdout
- name: 第二步:使用"df -h"命令检查磁盘使用情况
command: df -h
register: df_output
- name: ---磁盘的情况---
debug:
var: df_output.stdout_lines
- name: 第三步:使用"cat /proc/cpuinfo"命令检查cpu核数
command: cat /proc/cpuinfo
register: cpuinfo_output
- name: ---计算CPU数量---
set_fact:
cpu_count: "{{ cpuinfo_output.stdout_lines | select('match', '^processor') | list | length }}"
- name: CPU核数
debug:
var: cpu_count
- name: 第四步:检查Selinux状态
command: sestatus
register: selinux_status
- name: ---Slinux状态---
debug:
var: selinux_status.stdout_lines
- name: 第五步:检查yum仓库
command: yum repolist enabled
register: yum_all_repolist
- name: 使用正则过滤出Kubernetes信息
set_fact:
kubernetes_repolist: "{{ yum_all_repolist.stdout | regex_findall('kubernetes', multiline=true) }}"
- name: ---Kubernetes_yum仓库信息如下---
debug:
var: kubernetes_repolist
- name: 第六步:检查云实例操作系统
command: cat /etc/os-release
register: os_release_info
- name: ---操作系统信息如下---
debug:
var: os_release_info.stdout_lines
- name: 第七步:检查防火墙状态
command: firewall-cmd --state
register: firewall_status
- name: ---防火墙状态---
debug:
var: firewall_status.stdout
- name: 关闭防火墙
firewalld:
state: disabled
when: "'enabled' in firewall_status.stdout and firewall_status.stdout.enabled"
运行部分效果图:
3 安装continerd以及其他插件的指令行
在这里博主不展开描述了,因为官方文档写的真的很详细,感兴趣的可以自己去看一下,理解了部署过程以及原理就一定能装上,图省事的话,建议可以做成脚本
安装contained的步骤:
-
github containerd下载链接
下载对应版本的containerd安装压缩包 -
使用sha256sum文件进行校验
-
切换至/usr/local路径下
-
使用tar指令解压tar包
-
切换至/usr/local/lib,判断是否存在systemd/system/,并下载contained.service单元文件 https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
-
systemctl daemon-reload && systemctl enable --now containerd
-
下载runc.amd64文件从https://github.com/opencontainers/runc/releases,路径在/usr/local/sbin/runc
mkdir -p /usr/local/sbin/runc
wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
cd /usr/local/sbin
install -m 755 runc.amd64 /usr/local/sbin/runc
-
安装CNI插件 链接: https://github.com/containernetworking/plugins/releases
创建存放路径:
mkdir -p /opt/cni/bin/
tar Cxzvf /opt/cni/bin/ cni-plugins-linux-amd64-v1.3.0.tgz
#创建文件路径,不存在该路径
mkdir /etc/containerd
#生成默认配置文件
containerd config default > /etc/containerd/config.toml
4 开始安装Kubernetes组件
4.1 检查白名单以及权重
前置步骤还需要检查放行端口
博主的网络规划思路是:
protocol规划:
https http优先原则 1~10
ssh 10~20
其他 20~100
# 做主机映射并且配置各个主机成员组件的免密登录
172.19.139.229 secondary-node2.cn secondary-node2.cn
172.19.139.230 secondary-node1.cn secondary-node1.cn
172.19.139.231 master-node master-node
入站信息
master-node:
172.19.139.231/32 6443
172.19.139.231/32 2379/2380
172.19.139.231/32 10250/10250
172.19.139.231/32 10259/10259
172.19.139.231/32 10257/10257
secondary-node:
172.19.139.230/32 10250/10250
172.19.139.229/32 10250/10250
172.19.139.230/32 30000/32767
172.19.139.229/32 30000/32767
4.2 登录ACR并开启ip-forwarding
登录私有docker镜像仓库这步切记不能忘记
其次,要把ip-forwarding功能开启,在终端的指令为
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1 && sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1
Ansible剧本DEMO:
---
- name: 部署Kubernetes-Cluster
hosts: all
become: yes
tasks:
- name: 关闭Swap分区
shell: swapoff -a && sed -i '/ swap / s/^\\(.*\\)$/\\#\\1/g' /etc/fstab
- name: 安装三件套kubeadm,kubelet,kubectl
yum:
name: ['kubelet', 'kubeadm', 'kubectl']
state: present
- name: 使用systemctl开启kubelet
command: systemctl enable kubelet
- name: 开启iptables forwarding功能
command: sysctl -w net.bridge.bridge-nf-call-iptables=1 && sysctl -w net.bridge.bridge-nf-call-ip6tables=1
# - name: 初始化master节点
# command: kubeadm init --apiserver-advertise-address=172.19.139.231 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.22.3 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
# - name: 设置kubeconfig为当前用户
# command: "{{ item }}"
# loop:
# - mkdir -p $HOME/.kube
# - cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# - chown $(id -u):$(id -g) $HOME/.kube/config
# - name: 安装pod network
# command: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# - name: 安装Kubernetes Dashboard
# command: kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
handlers:
- name: 安装完毕重新启动
command: systemctl reboot
运行完该剧本,使用deployment_kuber_node.py,安装配置接下来的内容
包括第4章节里面所有的步骤,这里默认服务器能访问外网
5 错误复盘
在安装过程当中,会有这个报错,博主绕了很久也没找到原因,但直觉告诉问题出在这个文件里/etc/containers/storage.conf 找到对应的报错点,键值异常
根据报错的内容把相应键注释掉,因为默认的键值不是安装sealos的安装方式读到到的
Failed to decode the keys [\\\"storage.options.override_kernel_check\\\"] from \\\"/etc/containers/storage.conf\\\"\"/run/containerd/containerd.sock". Please update your configuration!
还有实际安装的时候,建议卸载docker,因为最终会使用到的是containerd
需要对内核参数进行修改,由于博主使用的是阿里云的镜像,阿里云操作系统的内核文档参考链接如下:
aliyun linux kernel文档链接
print(" .__.__ \n"
" ___ __ ___________ ____ |__| | \n"
" \ \/ // __ \_ __ \/ ___\| | | \n"
" \ /\ ___/| | \/ /_/ > | |__ \n"
" \_/ \___ >__| \___ /|__|____/ \n"
" \/ /_____/ \n")
6 大功告成
正式开始折腾环境了~
在这里我的个人建议直接使用脚本方式安装是最快的,可以使用sealos这个去安装配置k8s效率非常高,但是也要做前期的检查工作,用二进制安装方式是效率最慢的
注脚的解释 ↩︎