工作中涉及到Kubernetes相关知识,自己之前一直没有系统性的学习Kubernetes,近期在腾讯云上想安装Kubernetes时一直遇到在执行kubeadm init644310280端口无法访问导致操作失败进而无法顺利安装Kubernetes。一番排查后发现是由于从1.24.0之后Kubernetes默认采用containerd作为运行时容器,其默认镜像为registry.k8s.io,该镜像在国内无法访问导致的,简单记录下。

安装过程主要参考1,相关配置与安装步骤如下:

系统配置与依赖

关闭防火墙

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 关闭交换内存
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参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
## 配置网卡转发,看值是否为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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#安装相关依赖
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

1
2
3
containerd config default > /etc/containerd/config.toml
systemctl daemon-reload
systemctl restart containerd

安装Kubernetes

添加k8s源

1
2
3
4
5
6
7
8
9
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

  1. 执行下述指令,安装kubelet kubeadm

    1
    
    yum -y install kubectl kubelet kubeadm
    
  2. 执行下述指令,修改kubelet配置 (把kubelet驱动方式改为和docker驱动方式一致,否则会有报错)

    1
    2
    3
    
    cat <<EOF >/etc/sysconfig/kubelet
    KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
    EOF
    
  3. 执行下述执行添加自启动

    1
    
    systemctl enable kubelet
    
  4. 前序步骤执行完成后,执行kubectl version输出结果如下,可以看出其无法访问8080端口,结果输出不完整。造成此现象的原因为没有执行kubeadm init

    kubectl version输出结果不完善

执行kubeadm init

  1. 执行下述命令进行初始化

    1
    
    kubeadm init --v=5  --upload-certs --image-repository k8s.m.daocloud.io
    
  2. 前述命令的输出如下,可以看出创建过程一直阻塞

    kubeadm init创建过程阻塞

  3. 经过一段时间的等待,最终在控制台中出现如下错误信息,kubeadm init过程失败!

    kubeadm init创建失败

问题分析&解决

  1. 由于原始的报错信息没有提供太多有用的信息,故通过下述命令来输出其完整的日志2

    1
    2
    
    systemctl status kubelet -l > logs.txt
    cat logs.txt
    
  2. 查看logs.txt的内容,输出如下

    kubeadm init找不到镜像导致部署出错

  3. 从上图中可知报错信息是由于无法下载registry.k8s.io/pause:3.6导致的,由于registry.k8s.io在国内被墙,但是自己在执行kubeadm init的时候已经通过--image-repository k8s.m.daocloud.io制定了国内的镜像,为啥还会访问旧的镜像呢?奇怪!

  4. 网上搜索一番后,在其官网说明中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,而自己没有对其进行相关配置。

  5. 执行cat /etc/containerd/config.toml|grep registry.k8s.io后的结果如下,containerd使用的还是默认镜像,至此问题原因找出!

    ontainerd使用的是默认镜像

  6. 依次执行下述命令来重新配置containerd

    1
    2
    3
    
    sed -i 's/registry.k8s.io/registry.aliyuncs.com\/google_containers/' /etc/containerd/config.toml
    systemctl daemon-reload
    systemctl restart containerd
    
  7. 之后重新执行下述命令

    1
    2
    3
    4
    5
    
    # 移除之前的旧配置
    kubeadm reset -f
    
    # 初始化
    kubeadm init --v=5  --upload-certs --image-repository k8s.m.daocloud.io
    
  8. 运行上述命令后的输出类似如下,可以看出kubeadm init顺利执行成功,整个过程耗时不超过1分钟,至此问题解决!

    kubeadm init执行成功


  1. https://www.cnblogs.com/cerberus43/p/15881294.html ↩︎

  2. 之所以要写入文件是由于直接执行systemctl status kubelet时其输出信息较多,在屏幕中显示不完整,不利于分析 ↩︎

  3. https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md ↩︎