1. Wrong Container Image / Invalid Registry Permissions
当pod状态为ErrImagePull
或ImagePullBackOff
时,通常是由于以下3个原因(在排查网络故障的前提下):
- 镜像tag写错
- 镜像不存在,或拉取的镜像仓库地址写错
- 没有拉取镜像的权限(漏配了
imagePullSecrets
)
2. Application Crashing after Launch
当看到pod出现CrashLoopBackOff
状态时,说明K8S试图启动这个pod,但是pod内有一个或多个的容器启动失败。可以通过过describe
来查看pod的Event信息,通常从这些信息中可以找到Reason
和Exit Code
等提示信息。
对于应用的失败,当然少不了查看应用日志。如果应用日志是输出到stdout
的话(建议这样),就可以使用kubectl logs
命令来查看日志。
小技巧:
对于pod被重启的情况,通常有用的日志信息在之前的容器,这时,可以加上--previous
参数来查看容器前一个实例的日志
3. Missing ConfigMap or Secret
ConfigMap和Secret是在应用运行时将配置等信息注入最佳实践方式。但是,如果在应用启动前忘了创建ConfigMap或Secret,将会导致pod启动失败。
Missing ConfigMap
当pod要用到一个还没创建的ConfigMap时,状态会显示为RunContainerError
。此时用kubectl describe
可以查看事件信息,会有类似于:configmaps xxxxxxx not found
的事件提示信息。
Missing Secret
假设pod将把名为myothersecret
的Secret挂载作为数据卷,当myothersecret
还并没有生成:
# missing-secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: test-container
image: gcr.io/google_containers/busybox
command: [ "/bin/sh", "-c", "env" ]
volumeMounts:
- mountPath: /etc/secret/
name: myothersecret
restartPolicy: Never
volumes:
- name: myothersecret
secret:
secretName: myothersecret
执行kubectl create -f missing-secret.yaml
后,会发现pod状态一直为ContainerCreating
。同样,通过kubectl describe
查看事件信息,会有类似于:secrets "myothersecret" not found
的提示。
…未完待续