使用kubeadm部署k8s1.24.0版本,遇到的坑总结
- 环境
- 安装
- 遇到的问题
环境
操作系统:centos7
内核:5.4.231-1.el7.elrepo.x86_64
kubeadm:1.24.0
kubelet:1.24.0
kubectl:1.24.0
cri:docker
cni:flannel
docker:20.10.15
安装
使用kubeadm进行安装,首先进行虚机环境的适配:
关闭现有防火墙firewalld
# systemctl disable firewalld
# systemctl stop firewalld
# firewall-cmd --state
not running
所有主机均需要操作。修改SELinux配置需要重启操作系统。
# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
所有主机均需要操作。最小化安装系统需要安装ntpdate软件。
# crontab -l
0 */1 * * * /usr/sbin/ntpdate time1.aliyun.com
升级操作系统内核,所有主机均需要操作
导入elrepo gpg key
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
安装elrepo YUM源仓库
# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
设置grub2默认引导为0
# grub2-set-default 0
重新生成grub2引导文件
# grub2-mkconfig -o /boot/grub2/grub.cfg
更新后,需要重启,使用升级的内核生效。
# reboot
重启后,需要验证内核是否为更新对应的版本
# uname -r
配置内核转发及网桥过滤,所有主机均需要操作。
添加网桥过滤及内核转发配置文件
# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
加载br_netfilter模块
# modprobe br_netfilter
查看是否加载
# lsmod | grep br_netfilter
br_netfilter 22256 0
bridge 151336 1 br_netfilter
加载网桥过滤及内核转发配置文件
# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
安装ipset及ipvsadm,所有主机均需要操作。
安装ipset及ipvsadm
# yum -y install ipset ipvsadm
配置ipvsadm模块加载方式
添加需要加载的模块
# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
授权、运行、检查是否加载
# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
关闭SWAP分区
修改完成后需要重启操作系统,如不重启,可临时关闭,命令为swapoff -a
永远关闭swap分区,需要重启操作系统
# cat /etc/fstab
......
# /dev/mapper/centos-swap swap swap defaults 0 0
在上一行中行首添加#
Docker准备
# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# yum -y install docker-ce
# systemctl enable --now docker
# cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
# systemctl restart docker
cri-dockerd安装
# 按照github上的步骤安装
kubernetes 1.24.0 集群部署
添加阿里云YUM源
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# yum -y install kubeadm-1.24.0 kubelet-1.24.0 kubectl-1.24.0
# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
# systemctl enable kubelet
初始化命令
# kubeadm config print init-defaults > kubeadm.yaml
# kubeadm init --config=kubeadm.yaml --v=5 | tee kubeadm-init.log
遇到的问题
注意:上面步骤生成的kubeadm.yaml文件中需要修改一些参数,例如advertiseAddress,node name等
kubeadm init之后一直报错
网上大部分的解决方式是修改docker和kubelet的cgroup的驱动方式为systemd,但是我修改之后没有生效。
最后通过systemctl status cri-docker
命令发现,docker一直在pull pause镜像文件,这就很奇怪,因为我已经下载到本地docker了,
然后发现本地docker image中的的文件名和cri-docker pull的文件名不一致,统一修改成k8s.gcr.io/pause:3.7(在/etc/systemd/system/cri-docker.service文件中增加启动参数 --pod-infra-container-image registry.k8s.io/pause:3.7),然后container的配置文件/etc/containerd/config.toml中修改:SystemdCgroup = true sandbox_image = "k8s.grc.io/pause:3.7"
.
之后kubeadm reset,init就成功了