概要描述
本文描述TDH/TDC 环境中,在registry pod 状态正常的情况下,Pod启动失败且状态为 ImagePullBackOff的排查思路和解决方案
详细描述
场景1、问题描述
pod 启动失败,状态为 ImagePullBackOff ,kubectl describe pod xxxxx -n yy 报错如下:
Get https://registry-1.docker.io/v2/: diap tcp:lookup registry-1.docker.io on 10.10.0.10:53; server misbehaving
场景1、原因分析
从图中可以看到,拉取镜像是从官网拉取的,一般会有如下几点导致:
- 节点的/etc/docker/daemon.json 文件 Registry Mirrors: 字段没有配置;
- pod 的 image 地址指定错误,为官方的地址;
- 内部镜像仓库内没有这个镜像
场景1、解决方案
- 首先查看此节点的 docker 配置是否正确
- 查看 image 地址,并尝试手动下载
- 若还是有问题,看具体报错,若是报 not found 之类的,基本可以断定是 image 不存在导致
- 若是其他问题,看日志在具体排查。
查看此节点的 docker 配置是否正确:
docker info | grep -A 5 -i 'mirrors'
正常情况显示如下
TDC 环境:
TDH 环境:
若这个参数为空或者配置有问题
TDC 环境:
需要和其他节点的配置对比一下,然后修改配置文件 /etc/docker/daemon.json 修改 Registry Mirrors: 字段为一正确地址,重启 docker。
TDH 环境:
需要和其他节点的配置对比一下,然后修改配置文件 /etc/sysconfig/docker-registry 重启docker
查看 image 地址,并尝试手动下载:
kubectl describe po -n | grep -i image
获取到 image 地址,先手动在本台机器上执行下,然后在本集群的另一台机器上同样操作
docker pull image-addr
若是都不可以,说明是镜像的问题,可能有两个原因:
-
所有镜像都无法pull:
TDC环境 检查registry节点的 /registry-data 目录是否正常(是否正常挂载,是否可读可写)
TDH环境 检查/var/lib/registry_data 目录是否正常(是否正常挂载,是否可读可写) -
个别镜像没有:比如docker pull 172.26.5.58:5000/transwarp/antrea:v1.7.0),若是报 not found,就说明镜像不存在,解决方法就是上传镜像;
确定是镜像不存在之后,需要重新加载或者上传镜像。
情况一:TOS组件镜像不存在
tos 组件的镜像不上传到 registry,需要加载到本地,一般在集群安装或者扩容时会自动加载好。一些运维操作,比如docker大招,可能会清理掉本地镜像,需要手动加载,操作步骤如下:
TDH环境
docker load -i /etc/tos/conf/tos.tar.gz
TDC环境
cd /opt/kubernetes/images && ls -1 *.tar.gz | xargs --no-run-if-empty -L 1 docker load -i
情况二:云产品镜像不存在
TDH环境
manager上重新上传产品包
TDC环境
下载产品包到集群服务器,下面以TDH931为例
tar -zxvf /opt/tdc-installer/packages/tdh931/TDH-Image-Registry-Transwarp-9.3.1-final.tar.gz
解压完成后,在/opt/tdc-installer/packages/tdh931/目录下执行
#!/bin/bash
for eachTag in \$(jq -r '.manifests[].annotations."org.opencontainers.image.ref.name"' ./images/index.json)
do
echo \$eachTag
skopeo --insecure-policy=true copy --dest-tls-verify=false oci:./images:\$eachTag docker://172.22.28.21:5000/\$eachTag
done
其中docker://172.22.28.21:5000 根据实际情况替换成对应的registry角色的ip地址
场景2、问题描述
若是单个节点pull镜像处于卡住的状态,其他节点pull镜像正常
场景2、原因分析
- 磁盘有写满的情况,可以df -h | head -n 25 重点观察 根分区、/var/lib/docker、/var/log分区的大小
场景3、问题描述
TDC物理节点操作系统重启后,出现无法从 Docker 仓库拉取镜像的错误
Error response from daemon: Get "https://registry-1.docker.io/v2": diap tcp: lookup registry-1.docker.io on [::1]:53:read udp [::1]:xxxx ->[::1]:53: read:connection refused
错误原因是网络问题,额外考虑DNS解析的问题
场景3、问题原因
Linux 系统中,DNS 配置通常在 /etc/resolv.conf 文件中设置。然而,这个文件可能会被某些网络管理服务(如 NetworkManager 或 systemd-resolved)在系统启动或网络连接状态改变时自动更新。因此, /etc/resolv.conf 文件内的更改可能在会在重启后被这些网络管理服务覆盖。可以配置这些网络管理服务的配置文件达到永久修改DNS配置的目的
场景3、解决方案
方案1
直接编辑/etc/resolv.conf 修改成:
search transwarp.local
nameserver 10.10.0.10
options ndots:5
nameserver 114.114.114.114
方案2
/etc/profile.d 是 Linux 系统中的一个目录,用于存放 shell 环境初始化脚本。在这个目录下,各个软件的环境变量初始化脚本分散到各自的文件中,在用户登录时执行。我们可以在这个文件夹中增加一些配置,覆盖网络管理服务的更改,以实现自己需要的对DNS的永久配置
vim /etc/profile.d/tcos.sh
插入代码
#BEGIN insert for resolv.conf
# reset /etc/resolv.conf
cat > /etc/resolv.conf <<-EOF
#BEGIN TCOS insert
search transwarp.local
nameserver 10.10.0.10
options ndots:5
nameserver 114.114.114.114
#END TCOS insert
EOF
#END insert for resolv.conf