Error: pod 启动过程中发生错误
NodeLost: pod 所在节点失联
Unknow: pod 所在节点失联或者其他未知异常
Waiting: pod 等待启动
Pending: pod 等待被调度,基本是外部资源获取有问题.
Terminating: Pod 等待被销毁,是否有其他服务占用.
CrashLoopBackOff: Pod启动失败,但kubelet正在将它重启
InvalidImageNmae: node节点无法解析镜像名称导致镜像无法下载
ImageInspectError: 无法校验镜像,镜像不完整导致
ErrorImageNeverPull: 策略禁止拉取镜像,镜像中心权限是私有等
ImagePullBackOff: 镜像拉取失败,尝试重新拉取
RegistryUnavailable: 镜像服务器不可用,网络原因或harbor宕机
ErrorIImagePull: 镜像拉取出错,超时或下载被强制终止
CreateContainerConfigErrror: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
PreStartContainer: 执行preStart hook报错,Pod hook是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,比如容器创建完成后里面的服务启动之前可以检查一下依赖的其他服务是否启动,或者容器退出之前可以把容器中的服务先通过命令停止爱
PostStartHookError: 执行 posstStart hook报错
RunContainerError: pod运行失败,容器中没有初始化pid为1的守护进程等.
ContainersNotInitialized: pod没有初始化完毕
ContainersNotReady: pod没有准备完毕
ContainerCreating: pod正在创建中
PodInitializing: pod正在初始化中
DockerDaemonNotReady: node节点docker服务没有启动
NetworkPluginNotReady: 网络插件还没有启动
探针是由kubelet对容器执行的定时诊断,以保证Pod的状态始终处于运行状态,要执行诊断,kubelet调用由容器实现的handler(处理程序)
探测的方式
每次探测都将获得以下三种结果之一:
注意: 存活探测情况下的失败就意味着重新启动容器,就绪探测情况下的失败就意味着pod就会被打上未就绪的标签。
initialDelaySeconds: 120 #初始化延迟时间,默认是0s,最小是0s
periodSeconds: 60 #探测周期间隔时间,指定了kebelet每隔多少秒执行一次存活探测,默认是10秒,最小是1s,类似haproxy中的inter
timeoutSeconds: 5 #单次探测超时时间,探测的超时后等待多少秒,默认1秒,最小1秒
successThreshold: 1 #从失败转为成功的重试次数,探测器失败后,被视为成功的最小连续成功数,默认是1,,存活探测的这个值必须是1,最小值是1.类似于haproxy的rise
failurThreshold: 3 #从成功转为失败的重试次数,当pod启动了并且探测失败,kubernetes的重试次数,存活探测情况下的放弃就意味着重启容器,就绪探测情况下放弃pod就会被打上未就绪的标签,默认值是3,最小值是1
http探测器可以在HTTPGetAction上配置字段
host:连接使用的主机名,默认是pod的IP,也可以使用HTTP头中设置的Host值代替
scheme:连接主机方式(http/https),默认是http
path:访问http服务的路径
httpHeaders:请求中定义的HTTP头
port:访问容器的端口号或者端口名
root@master1:~/yaml/pod# cat pod-http.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-80
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy
template:
metadata:
labels:
app: nginx-deploy
spec:
containers:
- name: nginx-deploy
image: nginx
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5 #初始化延迟的时间5s(默认0秒)
periodSeconds: 3 #每隔3s执行一次存活探测
timeoutSeconds: 5 #单次探测超时时间为5s
successThreshold: 1 # 成功的次数
failureThreshold: 3 # 允许失败的次数
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- name: http
port: 81
targetPort: 80
nodePort: 30020
type: NodePort
selector:
app: nginx-deploy
探测成功的结果:
删除了index.html文件后,探测失败的结果
watch -n 1 kubectl get ep
由于镜像本身就有,此时被删除的index.html探针检查一会又将恢复正常.在重建没有完成时,通过service继续访问该pod会有403的报错.
使用tcpSocket进行检测
root@master1:~/yaml/pod# cat pod-tcp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-deploy-tcp
template:
metadata:
labels:
app: nginx-deploy-tcp
spec:
containers:
- name: deploy-nginx
image: nginx
ports:
- containerPort: 80
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- name: http
port: 81
targetPort: 80
nodePort: 30021
protocol: TCP
type: NodePort
selector:
app: nginx-deploy-tcp
某些情况下通过端口判断并不是很准确,同时服务又没法使用httpget的方式获取服务状态.这时就采用execaction方式,通过一条或多条命令的执行结果进行判断服务是否正常.
root@master1:~/yaml/pod# cat pod-execAction.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-redis
spec:
replicas: 1
selector:
matchLabels:
app: deploy-redis
template:
metadata:
labels:
app: deploy-redis
spec:
containers:
- name: redis-deploy
image: redis
ports:
- containerPort: 6379
livenessProbe:
exec:
command:
- /usr/local/bin/redis-cli
- quit
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
readinessProbe:
exec:
command:
- /usr/local/bin/redis-cli
- quit
initialDelaySeconds: 5
periodSeconds: 3
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
---
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
ports:
- name: http
port: 82
targetPort: 6379
nodePort: 30022
protocol: TCP
type: NodePort
selector:
app: deploy-redis