利用kubeadm init初始化时由于registry.k8s.io/pause:3.6导致初始化失败
文章目录
工作中涉及到Kubernetes
相关知识,自己之前一直没有系统性的学习Kubernetes
,近期在腾讯云上想安装Kubernetes
时一直遇到在执行kubeadm init
时6443
和10280
端口无法访问导致操作失败进而无法顺利安装Kubernetes
。一番排查后发现是由于从1.24.0
之后Kubernetes
默认采用containerd
作为运行时容器,其默认镜像为registry.k8s.io
,该镜像在国内无法访问导致的,简单记录下。
安装过程主要参考1,相关配置与安装步骤如下:
系统配置与依赖
关闭防火墙
# 关闭交换内存
swapoff -a
#关闭selinux
getenforce
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
#关闭防火墙
firewall-cmd --state
systemctl stop firewalld.service
systemctl disable firewalld.service
配置docker参数
mkdir /etc/docker/
vim /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
配置内核参数
## 配置网卡转发,看值是否为1
sysctl -a |grep 'net.ipv4.ip_forward = 1'
sysctl -a |grep 'net.bridge.bridge-nf-call-iptables = 1'
sysctl -a |grep 'net.bridge.bridge-nf-call-ip6tables = 1'
## 若未配置,需要执行如下
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
安装docker
#安装相关依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 epel-release
#添加阿里云docker-ce源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum clean all
yum install -y docker-ce containerd.io
#设置docker开机自启
systemctl enable docker
#启动docker服务
systemctl start docker
#查看docker信息
docker info
配置container
containerd config default > /etc/containerd/config.toml
systemctl daemon-reload
systemctl restart containerd
安装Kubernetes
添加k8s源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
EOF
安装kubelet和kubeadm
-
执行下述指令,安装
kubelet kubeadm
yum -y install kubectl kubelet kubeadm
-
执行下述指令,修改
kubelet
配置 (把kubelet驱动方式改为和docker驱动方式一致,否则会有报错)cat <<EOF >/etc/sysconfig/kubelet KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" EOF
-
执行下述执行添加自启动
systemctl enable kubelet
-
前序步骤执行完成后,执行
kubectl version
输出结果如下,可以看出其无法访问8080
端口,结果输出不完整。造成此现象的原因为没有执行kubeadm init
执行kubeadm init
-
执行下述命令进行初始化
kubeadm init --v=5 --upload-certs --image-repository k8s.m.daocloud.io
-
前述命令的输出如下,可以看出创建过程一直阻塞
-
经过一段时间的等待,最终在控制台中出现如下错误信息,
kubeadm init
过程失败!
问题分析&解决
-
由于原始的报错信息没有提供太多有用的信息,故通过下述命令来输出其完整的日志2
systemctl status kubelet -l > logs.txt cat logs.txt
-
查看logs.txt的内容,输出如下
-
从上图中可知报错信息是由于无法下载
registry.k8s.io/pause:3.6
导致的,由于registry.k8s.io
在国内被墙,但是自己在执行kubeadm init
的时候已经通过--image-repository k8s.m.daocloud.io
制定了国内的镜像,为啥还会访问旧的镜像呢?奇怪! -
网上搜索一番后,在其官网说明中3的首页有如下说明
After its deprecation in v1.20, the dockershim component has been removed from the kubelet. From v1.24 onwards, you will need to either use one of the other supported runtimes (such as containerd or CRI-O) or use cri-dockerd if you are relying on Docker Engine as your container runtime. For more information about ensuring your cluster is ready for this removal, please see this guide.
而在前面通过
kubectl version
命令可知当前的版本为v1.26.0
,很明显其使用的是containerd
,而自己没有对其进行相关配置。 -
执行
cat /etc/containerd/config.toml|grep registry.k8s.io
后的结果如下,containerd
使用的还是默认镜像,至此问题原因找出! -
依次执行下述命令来重新配置
containerd
sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml systemctl daemon-reload systemctl restart containerd
-
之后重新执行下述命令
# 移除之前的旧配置 kubeadm reset -f # 初始化 kubeadm init --v=5 --upload-certs --image-repository k8s.m.daocloud.io
-
运行上述命令后的输出类似如下,可以看出
kubeadm init
顺利执行成功,整个过程耗时不超过1分钟,至此问题解决!
-
之所以要写入文件是由于直接执行
systemctl status kubelet
时其输出信息较多,在屏幕中显示不完整,不利于分析 ↩︎ -
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md ↩︎