必须配置imagepullsecrets,kubernetes不复用宿主机docker login凭据;需用kubectl create secret docker-registry创建secret,并在pod spec中显式引用,且secret须与pod同命名空间。

能直接部署,但必须明确镜像来源、拉取权限和运行上下文——否则 ImagePullBackOff 或 CrashLoopBackOff 几乎必然出现。
镜像拉取失败:Private registry 认证没配 Secret
私有仓库(如 Harbor、自建 Registry)的镜像不会自动拉取。Kubernetes 不会复用宿主机 docker login 的凭据,必须显式提供 imagePullSecrets。
- 先用
kubectl create secret docker-registry创建 Secret,名称比如regcred - Deployment 中的
spec.template.spec下添加:imagePullSecrets: - name: regcred
- 确保 Secret 与 Pod 在同一 namespace;跨 namespace 需复制或使用 ServiceAccount 绑定
- 若用 Docker Hub,注意免费账号已限制匿名拉取频次,
ImagePullBackOff日志里常带toomanyrequests
容器启动就退出:缺少必要环境变量或初始化逻辑
很多官方镜像(如 postgres、redis)依赖环境变量驱动行为,不设就 fail fast。
-
postgres必须设POSTGRES_PASSWORD,否则容器立即退出并报password authentication failed -
mysql镜像需MYSQL_ROOT_PASSWORD,且首次启动会初始化数据目录,若挂载了非空 PVC,可能因权限或结构冲突卡住 - 自定义镜像若依赖
ENTRYPOINT脚本,要确认脚本中没有硬编码路径(如/app/start.sh),否则挂载 ConfigMap 后易失效
端口不通:service port / targetPort / nodePort 混用错误
Service 和 Pod 网络打通的关键是三者对齐,常见错误是把容器监听端口写成 port 而不是 targetPort。
-
targetPort必须等于容器内实际监听的端口(如 Spring Boot 默认8080,Nginx 是80) -
port是 Service 自身暴露的 ClusterIP 端口,可任意(如8087),但客户端访问时用这个 -
nodePort仅在type: NodePort时生效,范围必须是30000–32767,且集群节点防火墙需放行 - 用
kubectl get endpoints查看是否关联到 Pod IP+targetPort,为空说明 selector 不匹配或 Pod 未就绪
PVC 挂载后权限拒绝:initContainer 初始化不足
PostgreSQL、MySQL 等数据库镜像要求数据目录属主为 postgres 或 mysql 用户(UID 通常非 0),而默认 PVC 挂载后属主是 root。
- 不要在 main container 中用
command: ["sh", "-c", "chown -R ..."]—— 容器启动时数据目录可能已被进程占用,chmod 失败 - 正确做法是加一个
initContainer,镜像用busybox:stable或alpine:latest,执行chown -R 70:70 /var/lib/postgresql/data(以 postgres 为例) - initContainer 的
volumeMounts必须和主容器完全一致,路径相同才能生效 - 若用 NFS 或某些 CSI 驱动,还需检查
fsGroup是否被支持,否则securityContext.fsGroup可能静默无效
最常被跳过的其实是 initContainer 权限修复和 Secret 绑定——这两步不出错,90% 的镜像都能跑起来;出错时日志往往只显示 “container created, then exited”,得盯住 kubectl logs <pod-name> --previous</pod-name> 和 kubectl describe pod 里的 Events 才能找到根因。











