Azure Kubernetes从JFrog Registry拉取镜像失败:连接被对等方重置
问题:Azure Kubernetes Pod拉取JFrog镜像失败(connection reset by peer)
错误信息:
Failed to pull image "artifact.chi.com/gpm0001713-dkr-wfe-da-stage/Ga.chi.wfe.da/ghmadapter:2.4.09": failed to do request: Head "https://artifact.chi.com/v2/gmp008643: read tcp 101.1.0.107:42086->101.6.0.9:443: read: connection reset by peer"
已完成的故障排查步骤
- 验证JFrog Registry连通性:通过
curl -v -u <JFROG_USERNAME>:<JFROG_API_KEY> https://<JFROG_REGISTRY_URL>/v2/测试,连接成功。 - 检查Registry身份验证:通过
docker login <JFROG_REGISTRY_URL> -u <JFROG_USERNAME> -p <JFROG_API_KEY>登录,验证成功。 - 更新Kubernetes Secrets及部署配置:创建Docker Registry密钥
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>,并在部署YAML的imagePullSecrets中引用该密钥。 - 检查Kubernetes日志:Pod日志持续显示:
Warning Failed kubelet Failed to pull image: read tcp : -> :443: read: connection reset by peer
Warning ImagePullBackOff kubelet Backing off pulling image
额外排查/解决步骤
1. 验证Kubernetes节点与JFrog Registry的网络连通性
- 登录到Azure Kubernetes节点,执行以下命令测试网络:
# 测试443端口连通性 telnet artifact.chi.com 443 # 或用curl测试完整镜像路径 curl -v -u <JFROG_USERNAME>:<JFROG_API_KEY> https://artifact.chi.com/v2/gpm0001713-dkr-wfe-da-stage/Ga.chi.wfe.da/ghmadapter/manifests/2.4.09 - 检查Azure节点的NSG(网络安全组)规则,确保允许出站访问JFrog Registry的443端口;同时确认JFrog侧的防火墙/安全组未拦截节点IP。
2. 核对镜像路径的准确性
注意错误信息中请求的路径是/v2/gmp008643,但镜像名是artifact.chi.com/gpm0001713-dkr-wfe-da-stage/Ga.chi.wfe.da/ghmadapter:2.4.09,存在gpm/gmp的拼写差异,需:
- 登录JFrog UI,确认镜像的实际仓库路径、镜像名、标签是否完全匹配部署中使用的地址。
- 修正部署YAML中的镜像地址,确保与JFrog中的路径一致。
3. 检查节点容器运行时配置
如果集群使用containerd或Docker,验证镜像仓库配置:
- Docker:查看
/etc/docker/daemon.json,确认是否配置了正确的registry镜像源、代理设置,TLS证书是否有效。 - containerd:查看
/etc/containerd/config.toml中的[plugins."io.containerd.grpc.v1.cri".registry]段,确保已正确配置JFrog Registry的访问权限。 - 重启容器运行时服务(
systemctl restart docker或systemctl restart containerd)后重试拉取。
4. 检查JFrog Registry的访问限制
- 联系JFrog管理员,检查是否开启了IP白名单,确认Azure Kubernetes节点的公网/内网IP已加入白名单。
- 查看JFrog的访问日志,确认是否有来自节点IP的被拦截请求,或是否触发了限流规则。
5. 排查MTU配置问题
TCP连接重置可能因MTU过大导致数据包无法传输:
- 在节点上测试MTU兼容性:
# 测试最大MTU数据包(1472+28=1500) ping -M do -s 1472 artifact.chi.com - 如果测试丢包,调整节点的MTU值(例如改为1450),或在Kubernetes部署中配置Pod的MTU:
spec: containers: - name: your-container ... dnsPolicy: ClusterFirst networkSettings: mtu: 1450
6. 重新验证imagePullSecret配置
- 删除旧密钥并重新创建,确保参数完全匹配:
kubectl delete secret regcred kubectl create secret docker-registry regcred \ --docker-server=artifact.chi.com \ --docker-username=<JFROG_USERNAME> \ --docker-password=<JFROG_API_KEY> \ --docker-email=<your-email> - 重启部署使配置生效:
kubectl rollout restart deployment <your-deployment-name> - 验证密钥是否正确关联到Pod:
kubectl get pod <your-pod-name> -o yaml | grep imagePullSecrets
7. 测试节点直接拉取镜像
登录到Kubernetes节点,直接用容器运行时拉取镜像,定位问题层面:
# Docker环境 docker pull artifact.chi.com/gpm0001713-dkr-wfe-da-stage/Ga.chi.wfe.da/ghmadapter:2.4.09 # containerd环境 ctr images pull artifact.chi.com/gpm0001713-dkr-wfe-da-stage/Ga.chi.wfe.da/ghmadapter:2.4.09 --user <JFROG_USERNAME>:<JFROG_API_KEY>
- 如果节点拉取失败:问题在节点与JFrog的网络或容器运行时配置。
- 如果节点拉取成功:问题在Kubernetes的secret或Pod配置。
内容的提问来源于stack exchange,提问作者Srikanth Mannepalli
相关产品推荐
相关产品推荐

