镜像推送了,但其他集群拉不下来
你在主集群构建完镜像,打上标签推送到镜像仓库,信心满满地在另一个集群执行 kubectl apply,结果 Pod 卡在 ImagePullBackOff。这种情况太常见了。先别急着重启 kubelet,大多数时候问题出在镜像地址或网络策略上。
检查一下你的镜像 tag 是否带上了正确的仓库域名。比如你用的是 Harbor,那镜像名应该是 harbor.example.com/project/app:v1,而不是简单的 app:v1。本地构建时可能用了默认的 Docker Hub 命名空间,一到跨集群就找不到。
确认镜像是否真正同步到了目标集群可访问的仓库
有些公司会部署多个镜像仓库实例,分别对应不同区域的 Kubernetes 集群。你推的可能是华东的仓库,而华北的集群只能访问自己的本地仓库。这时候需要配置镜像复制策略,或者使用全局加速的镜像服务。
登录目标集群所在的节点,手动执行 docker pull 看看能否拉取成功:
docker pull harbor.north.example.com/project/app:v1如果超时或报 403,基本可以锁定是权限或网络问题。
跨集群网络不通导致拉取失败
别忘了,Pod 拉镜像是由 kubelet 发起的,走的是节点本身的网络。如果你的集群分布在不同的 VPC 或者有防火墙策略,很可能出不去。
比如你在金融环境,生产集群禁止访问外网,只能通过代理拉镜像。这时候就得在 kubelet 启动参数里配置 --image-pull-progress-deadline 和代理设置。也可以在节点上配置 registry mirror:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<registry-mirrors>
<mirror>https://mirror.docker.io</mirror>
</registry-mirrors>注意:这个配置得写进容器运行时的配置文件,比如 containerd 的 /etc/containerd/config.toml。
证书问题让安全传输变“拒传”
自建镜像仓库用的是私有 CA 签发的证书?那你得确保所有集群节点都信任这个 CA。否则会出现 x509: certificate signed by unknown authority 错误。
解决方案是在每个节点的 /etc/docker/certs.d/ 或 containerd 对应目录下放入证书文件。比如:
mkdir -p /etc/containerd/certs.d/harbor.private.com
cp ca.crt /etc/containerd/certs.d/harbor.private.com/ca.crt改完别忘了 reload containerd:systemctl reload containerd。
镜像太大,拉取慢到像蜗牛
一个 2GB 的镜像,在跨地域集群间分发,拉取动辄几分钟。业务上线等不起,滚动更新直接超时。
优化方向有两个:一是精简镜像,用 Alpine 基础镜像、合并 RUN 指令、清理缓存;二是利用 P2P 分发工具,比如 Dragonfly 或 Kraken,把镜像分发变成“下载加速”模式,从其他节点“蹭”块数据,而不是全靠中心仓库。
Dragonfly 的 Sidecar 模式很适合 Kubernetes:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: dfdaemon
spec:
template:
spec:
containers:
- name: dfdaemon
image: dragonflyoss/scheduler:latestRBAC 权限不足,连仓库都登不上
有时候问题不在网络,而在身份。目标集群的节点没有配置正确的 imagePullSecrets,kubelet 根本没法认证到私有仓库。
检查你的 Pod 模板里有没有声明:
spec:
imagePullSecrets:
- name: regcred而 regcred 这个 Secret 得提前创建好:
kubectl create secret docker-registry regcred \\
--docker-server=harbor.example.com \\
--docker-username=admin \\
--docker-password=xxxxx漏了这一步,再通的网络也白搭。
时间不同步引发的“签名过期”错觉
你没看错,服务器时间差太多也会导致镜像拉取失败。某些镜像仓库在签发 token 时带了有效期,如果节点时间比实际快了几分钟,系统会认为 token 已过期,拒绝拉取。
用 timedatectl status 看一下各个集群节点的时间是否同步。建议所有集群节点都接入 NTP 服务,保持时间误差在毫秒级。