背景: k8s集群扩容节点,扩容完成后发现节点daemonset启动失败,报错ImagePullBackOff,镜像拉取失败
排查:
- 登录扩容主机尝试手动docker login私有仓库地址
docker login --username=xxxx hub.xxx.com.cn # 登录仓库 > Error response from daemon: Get "https://hub.xxx.com.cn/v2/": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0 > # 登录仓库报错如上
-
github搜索后发现如下问题回复:
从上述回复可以基本看出,该报错为GO版本1.5前后TLS认证兼容性问题,于是检查docker版本情况 -
查看问题节点docker版本
docker version > Client: > Version: 18.06.3-ce > API version: 1.38 > Go Version: go1.10.4 > ...... > Server: Docker Engine - Community > Engine: > Version: 20.10.10 > API version: 1.41 (minimum version 1.12) > Go version: go1.16.9 > ......
从上面返回内容看出,docker client版本为18.06,go版本为1.10,而服务端docker server版本为20.10.10,Go版本为1.16,查看正常节点发现c/s均为18.06版本docker和1.10版本go,印证go版本兼容性导致该问题发生
- 查看已安装的docker,停止服务并卸载
rpm -qa |grep docker > docker-ce-cli-20.10.10-3.el7.x86_64 > docker-ce-20.10.10-3.el7.x86_64 > nvidia-docker2-2.2.2-1.noarch > docker-scan-plugin-0.9.0-3.el7.x86_64 > docker-ce-rootless-extras-20.10.10-3.el7.x86_64 systemctl stop kubelet docker yum -y remove docker-ce-cli-20.10.10-3.el7.x86_64 #验证发现卸载cli后所有docker20都会卸载掉,也可以逐个remove > ...... > rpm -qa |grep docker #卸载后验证无docker20残留
- 重新安装18版本docker,由于yum -y install docker默认会安装yum源中最新版,因此需要指定版本安装
# 查看yum源中所有的docker版本 yum list docker-ce --showduplicates |sort -r #列出所有docker-ce的版本信息 > ...... #省略其他版本信息 > docker-ce.x86_64 18.06.3.ce-3.el7 docker-repo > ...... yum -y install docker-ce-18.06.3.ce-3.el7.x86_64 # 拼接规则为应用名-版本.架构版本 > ...... #省略安装信息 # 安装完成后查看版本 docker version > Client: > Version: 18.06.3-ce > API version: 1.38 > Go Version: go1.10.4 > ...... > Server: Docker Engine - Community > Engine: > Version: 18.06.3-ce > API version: 1.38 (minimum version 1.12) > Go version: go1.10.3 > ......
- 查看节点daemonset,发现已正常启动,说明镜像拉取成功,问题解决



