Pod常见的状态和重启策略
- 常见的pod状态
 - 第一阶段:
 - 第二阶段:
 - 扩展:
 
- pod重启策略
 - 测试Always重启策略
 - 正常停止容器内的tomcat服务
 - 非正常停止容器里的tomcat服务
 
- 测试never重启策略
 - 正常停止容器里的tomcat服务
 - 非正常停止容器里的tomcat服务
 
- 测试OnFailure重启策略
 - 正常停止容器里的tomcat服务
 - 非正常停止容器里的tomcat服务
 
常见的pod状态

第一阶段:
-  
挂起(Pending):
1、正在创建Pod但是Pod中的容器还没有全部被创建完成,处于此状态的Pod应该检查Pod依赖的存储是否有权限挂载、镜像是否可以下载、调度是否正常等
2、我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了pod但是没有适合它运行的节点叫做挂起,调度没有完成。 -  
失败(Failed):
Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。 -  
未知(Unknown):
未知状态,所谓pod是什么状态是apiserver和运行在pod节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息了,就会看Unknown,通常是由于与pod所在的node节点通信错误。 -  
Error 状态:
Pod 启动过程中发生了错误 -  
成功(Succeeded):
Pod中的所有容器都被成功终止,即pod里所有的containers均已terminated。 
第二阶段:
- Unschedulable:Pod不能被调度, scheduler没有匹配到合适的node节点
 - PodScheduled:pod正处于调度中,在scheduler刚开始调度的时候,还没有将pod分配到指定的node,在筛选出合适的节点后就会更新etcd数据,将pod分配到指定的node
 - Initialized:所有pod中的初始化容器已经完成了
 - ImagePullBackOff:Pod所在的node节点下载镜像失败
 - Running:Pod内部的容器已经被创建并且启动。
 
扩展:
- Evicted状态:出现这种情况,多见于系统内存或硬盘资源不足,可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源,尤其是一些大文件、docker镜像。
 - CrashLoopBackOff:容器曾经启动了,但可能又异常退出了
 
pod重启策略
- Pod的重启策略(RestartPolicy)应用于Pod内的所有容器,当某个容器异常退出或者健康检查失败时,kubelet将根据 重启策略来进行相应的操作。
 - Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。
 - Always:只要容器异常退出,kubelet就会自动重启该容器。(这个是默认的重启策略)
 - OnFailure:当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
 - Never:不论容器运行状态如何,kubelet都不会重启该容器。
 
测试Always重启策略
vim pod.yaml 
 
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
spec:
  restartPolicy: Always
  containers:
  - name:  tomcat-pod-java
    ports:
    - containerPort: 8080
    image: xianchao/tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent
 
kubectl apply -f pod.yaml
 
正常停止容器内的tomcat服务
kubectl exec -it demo-pod -- /bin/bash
/usr/local/tomcat/bin/shutdown.sh
 
查看pod状态:发现正常停止容器里的tomcat服务,容器重启了一次,pod又恢复正常了
kubectl get pod
NAME         READY   STATUS    RESTARTS     AGE
demo-pod   1/1     Running   1 (5s ago)   3m24s
 
非正常停止容器里的tomcat服务
kubectl exec -it demo-pod -- /bin/bash
kill 1
 
可以看到容器终止了,并且又重启一次,重启次数增加了一次
kubectl get pod
NAME         READY   STATUS    RESTARTS     AGE
demo-pod   1/1     Running   2 (5s ago)   3m24s
 
测试never重启策略
vim pod.yaml 
 
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
spec:
  restartPolicy: Never
  containers:
  - name:  tomcat-pod-java
    ports:
    - containerPort: 8080
    image: xianchao/tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent	
 
kubectl apply -f pod.yaml
 
正常停止容器里的tomcat服务
kubectl exec -it demo-pod -- /bin/bash
/usr/local/tomcat/bin/shutdown.sh
 
查看pod状态:发现正常停止容器里的tomcat服务,pod正常运行,容器没有重启
kubectl get pod
NAME         READY   STATUS     RESTARTS     AGE
demo-pod   1/1       Completed  0     3m24s
 
非正常停止容器里的tomcat服务
kubectl exec -it tomcat-pod -- /bin/bash
kill 1
 
可以看到容器状态是error,并且没有重启,这说明重启策略是never,那么pod里容器服务无论如何终止,都不会重启
kubectl get pod
NAME         READY   STATUS    RESTARTS     AGE
demo-pod   1/1       error     0            3m24s
 
测试OnFailure重启策略
vim pod.yaml 
 
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
  namespace: default
  labels:
    app: myapp
spec:
  restartPolicy: OnFailure
  containers:
  - name:  tomcat-pod-java
    ports:
    - containerPort: 8080
    image: xianchao/tomcat-8.5-jre8:v1
    imagePullPolicy: IfNotPresent	
 
kubectl apply -f pod.yaml
 
正常停止容器里的tomcat服务
kubectl exec -it demo-pod -- /bin/bash
/usr/local/tomcat/bin/shutdown.sh
 
查看pod状态:发现正常停止容器里的tomcat服务,退出码是0,pod里的容器不会重启
kubectl get pod
NAME         READY   STATUS    RESTARTS     AGE
demo-pod     0/1     complete   0     3m24s
 
非正常停止容器里的tomcat服务
kubectl exec -it tomcat-pod -- /bin/bash
kill 1
 
上面可以看到非正常停止pod里的容器,容器退出码不是0,那就会重启容器
kubectl get pod
NAME         READY   STATUS    RESTARTS     AGE
demo-pod   1/1       running    1         3m24s
                


















