目录

k8s中pod的重启策略

pod中一共有以下三个重启策略(restartPolicy)

健康检查:

健康检查类型

支持的检查方法:

检查示例

其他检查方式示例


k8s中pod的重启策略

pod中一共有以下三个重启策略(restartPolicy)



1、Always:当容器终止退出后,总是重启容器,默认策略。



2、OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。 



3、Never:当容器终止退出,从不重启容器。




三种重启策略中,Always是默认策略,即当用户在配置文件中未配置关于重启的策略,则默认为Always.




k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes


当然,几种策略也按实际情况修改,即常驻容器肯定采用Always,例如nginx与mysql等


而一些预期终止的程序


  1、失败重新执行,例如定时任务,则适用于OnFailure


  2、失败不重新执行,例如一次性任务Neve


健康检查:


       健康检查是在pod中,可能容器进程存在,pod状态也为runing,但容器内部无法提供服务了(可能是因为堆内存溢出等)这种k8s自身无法判断,需要用户来提供检查方式从情况下使用的


健康检查类型


 1、livenessProbe(存活检查):如果检查失败,将杀死容器,根据Pod 的restartPolicy来操作。


 2、readinessProbe(就绪检查):如果检查失败,Kubernetes会把 Pod从service endpoints中剔除。(可以理解为提出k8s的负载均衡)


 3、startupProbe(启动检查):检查成功才由存活检查接手,用于保护 慢启动容器


支持的检查方法:


 • httpGet:发送HTTP请求,返回200-400范围状态码为成功。


 • exec:执行Shell命令返回状态码是0为成功。


 • tcpSocket:发起TCP Socket建立成功。


检查方式分同机器检查与不同机器检查(一般采用curl靠谱)


不同机器检查方式:curl、wget、telnet


同机器检查:netstat、ps


检查的实现是由kubelet实现的


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_nginx_02


检查示例


模拟http请求与存活检查


先创建一个nginx的deployment.yaml


kubectl create deployment nginx --image=nginx --dry-run=client -o yaml > deployment.yaml


如果是一个生产环境,应该需要开发人员在代码中加一个健康检查页面


修改这个yaml,在这个yaml中的pod加入了存活检查与启动检查,路径为根目录与80端口


apiVersion: apps/v1

kind: Deployment

metadata:

  creationTimestamp: null

  labels:

    app: nginx

  name: nginx

spec:

  replicas: 3

  selector:

    matchLabels:

      app: nginx

  strategy: {}

  template:

    metadata:

      creationTimestamp: null

      labels:

        app: nginx

    spec:

      containers:

      - image: nginx

        name: nginx

        resources: {}

        livenessProbe:

          httpGet:

            path: /

            port: 80

          initialDelaySeconds: 3 #启动容器后多少秒健康检查

          periodSeconds: 10 #以后每间隔多少秒检查一次

        readinessProbe:

          httpGet:

            path: /

            port: 80

          initialDelaySeconds: 3

          periodSeconds: 10


启动


kubectl apply -f deployment.yaml


查看启动成功


kubectl get pods


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes_03


给这个deployment添加service暴露端口


kubectl expose deployment nginx --port=80 --target-port=80


查看创建成功


kubectl get pods,svc


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_运维_04


从日志上看检查一直在执行


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes_05


此时进入一个nginx的pod中,删除他的index.html命令


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes_06


从日志上看已经有了一个错误的日志


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes_07


查看这个pod详情(pod名按实际生成来)


kubectl describe pod nginx-5b645dcb8b-5gwmk


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_容器_08


发现在详情中,由出现健康检查有403的错误日志,并重建了容器


pod中的nginx也有了重启记录


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_nginx_09


删除的index.html也恢复了


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes_10


注意:这里的重启,实际是重新拉取镜像帮你重建了这个容器。但pod名不变


其他检查方式示例


k8s子服务器重启后docker里的容器没有启动 k8s容器一直重启_kubernetes_11