crashloopbackoff表示容器启动后迅速崩溃并被kubelet指数退避重启;需先用kubectl describe查看事件,再用kubectl logs --previous获取上轮崩溃日志,结合退出码(如137=oomkilled)定位根因。

先看Pod状态,再查事件和日志——80%的Go应用部署异常靠这三步就能定位,不用猜、不重试、不删yaml。
Pod状态卡在CrashLoopBackOff,怎么快速抓到崩溃原因
这个状态说明Go进程启动后几秒内就panic退出,K8s反复拉起又杀掉。关键不是“为什么崩”,而是“崩前最后一行输出是什么”。
- 必须加
--previous查上一轮日志:kubectl logs <pod-name> -n <namespace> --previous</namespace></pod-name>,当前容器可能已重启,不加这个参数会看到空日志或新实例的启动日志 - 常见真凶:
configmap挂载路径错导致os.Open("config.yaml")失败;secret没注入,os.Getenv("DB_PASSWORD")返回空字符串;环境变量名拼写错误(DATABASE_URL写成DB_URL) - Go里别信“server started on :8080”这种日志——它可能在
http.ListenAndServe之前就打了,后面因db.Ping()超时才panic。一定要看到堆栈末尾的panic: ...或fatal error:
ImagePullBackOff报错但镜像明明存在,该查哪几处
不是仓库里没有镜像,而是节点根本没权限拉。手动复现是最快验证方式。
- 登录对应节点,执行:
crictl pull your-registry/go-app:v1.0(K8s 1.24+默认用containerd,docker pull可能不生效) - 如果报
unauthorized:检查imagePullSecrets是否和Pod在同一命名空间,且Secret名大小写完全匹配(regcred≠RegCred) - 如果报
timeout:确认节点能访问私有仓库域名,DNS解析正常,防火墙放行仓库端口(如443或5000) - Secret内容必须是合法JSON Base64编码:
echo <base64-string> | base64 -d</base64-string>应输出{"auths":{"your-registry":{"auth":"..."}}},否则kubectl describe pod里会显示rpc error: code = Unknown desc = Error response from daemon: Get ...: unauthorized
Pod一直Pending,到底是资源不够还是被调度器拦住了
Pending表示调度器连绑定都没完成,跟Go代码完全无关,只看四样东西:资源、标签、污点、配额。
- 运行
kubectl describe pod <pod-name></pod-name>,紧盯Events区域——出现Insufficient memory或node(s) had taint {node-role.kubernetes.io/master:NoSchedule}就直接对症下药 - 别只看
kubectl top node,要查真实可分配资源:kubectl describe node <node-name></node-name>里找Allocatable字段下的memory和cpu,注意单位(128Mi≠128M) - 如果节点打了污点(taint),而Pod没配对应容忍(toleration),调度器直接跳过。例如master节点默认带
NoSchedule污点,普通Deployment需显式加toleration才能调度上去 - 命名空间级ResourceQuota限制也会导致Pending,检查:
kubectl get resourcequota -n <namespace></namespace>
Service连不通,是不是Go监听端口和K8s配置对不上
K8s里containerPort只是文档字段,真正决定流量能否进来的是Service的targetPort是否等于Go进程实际绑定的端口。
- Go代码里确认监听地址,比如
log.Printf("server started on :8080"),这就是真实端口。别信Dockerfile里的EXPOSE 3000或Deployment里的containerPort: 3000 - Deployment中
containerPort建议和实际监听端口一致(虽非强制),避免团队误读;Service的targetPort必须严格等于该端口 - 本地验证连通性:
kubectl port-forward <pod-name> 8080:8080</pod-name>,然后curl http://localhost:8080/health。如果能通但Service不通,基本锁定targetPort或selector标签不匹配 - 检查Endpoints是否生成:
kubectl get endpoints <service-name></service-name>,为空说明Pod没通过readinessProbe,或label selector根本没匹配到任何Pod
最常被忽略的是:Go程序没处理SIGTERM,K8s发信号后进程直接退出,导致连接中断、数据丢失,进而触发探针失败——这会让问题看起来像“随机重启”,其实每次都是优雅关闭没做对。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











