其他分享
首页 > 其他分享> > |NO.Z.00128|——————————|CloudNative|——|KuberNetes&基础标签.V11|------------------------------------------

|NO.Z.00128|——————————|CloudNative|——|KuberNetes&基础标签.V11|------------------------------------------

作者:互联网



[CloudNative:KuberNetes&基础标签.V11]                                                               [Applications.KuberNetes][|DevOps|k8s基础|零宕机Pod三种探针|StartuProbe|Liveness和Readiness|Pod退出流程|PreStop的使用|]








一、Pod退出的流程:探针检查配置说明
### --- 探针检查配置参数

~~~     initialDelaySeconds: 60          //  初始化时间
~~~     timeoutSeconds: 2                //  超时时间
~~~     periodSeconds: 5                 //  检测间隔
~~~     successThreshold: 1              //  检查成功为1次表示就绪
~~~     failureThreshold: 2              //  检测失败2次表示未就绪
### --- Prestop:

~~~     先去请求eureka接口,把自己的IP地址和端口号,进行下线,
~~~     eureka从注册表中删除该应用的IP地址。
### --- 然后容器进行sleep 90;kill `pgrep java`

~~~     下线之后需要把自己的进程关闭掉,那么进程是在sleep之前关闭,还是下线之后关闭呢?
~~~     而且在关闭的时候不要使用kill -9 ;而是使用kill 加进程号:kill 'pgrep java' 
~~~     一般情况下我们是在sleep后面去kill它的进程,因为:在sleep过程中,还是会有其它的service会连接到该容器,所以需要在之后把java进程给停掉。
~~~     所以一般情况下是在sleep后面执行kill;但是一般情况下不可以使用kill -9 强制性的关闭它的进程,而是设置一个它的信号,让它自己去关闭。
~~~     关闭的过程中会把他已经连接上的逻辑的请求处理完之后然后再停掉自己的服务,
~~~     90秒这个时间一定要大于它的注册刷新的时间,所有的应用都同步的话,这个时间可能会大于容器自己配置的时间,所以这个时间可能是需要长一点。
~~~     但是直接配置sleep 90是不生效的,若是你的terminationGracePeriodSeconds:30        的指令大于30秒,
~~~     那么k8s是不会等待你90s的;因为k8s在检查出来periodserver还没有执行玩的话,他只会给你生效2秒的宽限期,2秒中之后它就会强制删除这个pod;
~~~     所以说sleep的时间过长的话,这个值terminationGracePriodSecond的时间设置够长一些。
### --- 若是你的terminationGracePriodSecond:30写的是30 ;

~~~     你的sleep 5是不生效的,它会等待你30s后再去处理。
~~~     若是你的这个进程在5秒钟之内关闭的话那么你这个进程时可以生效的。
二、探针检查配置yaml示例
### --- 错误配置示例:设置sleep90秒,查看他会不会sleep90秒

[root@k8s-master01 ~]# vim pod.yaml
    lifecycle:
#      postStart:                                                                   # 容器创建完成后执行的指令, 可以是exec httpGet TCPSocket
#        exec:
#          command:
#          - sh
#          - -c
#          - 'mkdir /data/ '
      preStop:
#        httpGet:      
#              path: /
#              port: 80
        exec:
          command:
          - sh
          - -c
          - sleep 90
  restartPolicy: Always                                                             # 可选,默认为Always,容器故障或者没有启动成功,那就自动该容器,Onfailure: 容器以不为0的状态终止,自动重启该容器, Never:无论何种状态,都不会重启
三、创建资源实例验证结果
### --- 创建资源pod

[root@k8s-master01 ~]# kubectl create -f pod.yaml  
### --- 查看创建的资源

[root@k8s-master01 ~]# kubectl get po
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          28s 
### --- 设定删除pod的时间

[root@k8s-master01 ~]# time kubectl delete po nginx                                 //设置时间删除模式,查看一下它到底执行了多长时间
pod "nginx" deleted
real    0m39.346s                                                                   //只执行了39秒,没有执行90s
user    0m0.208s
sys 0m0.240s
### --- 同步查看PreStop执行过程

[root@k8s-master01 ~]# kubectl get po
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          4m22s
### --- 查看pod删除过程
~~~     打印出来,正在执行PreStopHook过程

[root@k8s-master01 ~]# kubectl describe po nginx
Events:
  Type     Reason             Age    From               Message
  ----     ------             ----   ----               -------
  Normal   Scheduled          6m7s   default-scheduler  Successfully assigned default/nginx to k8s-master01
  Normal   Pulled             5m56s  kubelet            Container image "nginx:1.15.2" already present on machine
  Normal   Created            5m56s  kubelet            Created container nginx
  Normal   Started            5m55s  kubelet            Started container nginx
  Normal   Killing            36s    kubelet            Stopping container nginx
  Warning  FailedPreStopHook  6s     kubelet            Exec lifecycle hook ([sh -c sleep 90]) for Container "nginx" in Pod "nginx_default(0172ea19-91bc-4ae8-ad64-c0028c09aec5)" failed - error: command 'sh -c sleep 90' exited with 137: , message: ""
四、terminationGracePeriodSeconds配置参数
### --- 查看namespace的事件的;这个事件也可以被作为监控。

[root@k8s-master01 ~]# kubectl get event            
7m5s        Normal    Scheduled                 pod/nginx           Successfully assigned default/nginx to k8s-master01
6m55s       Normal    Pulled                    pod/nginx           Container image "nginx:1.15.2" already present on machine
6m55s       Normal    Created                   pod/nginx           Created container nginx
6m54s       Normal    Started                   pod/nginx           Started container nginx
95s         Normal    Killing                   pod/nginx           Stopping container nginx
65s         Warning   FailedPreStopHook         pod/nginx           Exec lifecycle hook ([sh -c sleep 90]) for Container "nginx" in Pod "nginx_default(0172ea19-91bc-4ae8-ad64-c0028c09aec5)" failed - error: command 'sh -c sleep 90' exited with 137: , message: ""
### --- 正确的配置方案是:

[root@k8s-master01 ~]# vim pod.yaml 
  terminationGracePeriodSeconds: 40             # 这个参数是在containers上面的,因为它是作用于整个containers的
  containers:                                   # 必选,容器列表
### --- 创建pod

[root@k8s-master01 ~]# kubectl create -f pod.yaml 
pod/nginx created
### --- 查看创建的资源yaml

[root@k8s-master01 ~]# kubectl get po -oyaml    // 因为我们只有一个pod所以可以不写namespace名称,若是有多个的话,最好还是写上namespace名称,不然他会把所有的都打印不出,,打印出来,一个yuml文件是个list
    terminationGracePeriodSeconds: 40           // 可以看到这个值为40了
kind: List 
### --- 删除资源验证

[root@k8s-master01 ~]# time kubectl delete po nginx
pod "nginx" deleted

real    0m46.356s
user    0m0.259s
sys 0m0.208s
五、terminationGracePeriodSeconds删除过程
### --- terminationGracePeriodSeconds删除过程
### --- 灵活的应用PreStop可以实现零宕机的下线处理
### --- PreStop加上  terminationGracePeriodSeconds: 40    健康检查可以做到零宕机的上线发布应用。

~~~     这个时间比配置配置第一个30秒的时间长的多,也没有真正在做90秒的操作。
~~~     他不会等你到90s的,k8s的机制是它并不知道你到底执行的是什么操作,
~~~     它并不知道你执行的是一个sleep操作。
~~~     他无法判断你这个PreStop到底会执行多长时间,所以它会强制行性的删除。
[root@k8s-master01 ~]# kubectl describe po nginx 
Events:
  Type     Reason             Age   From               Message
  ----     ------             ----  ----               -------
  Normal   Scheduled          5m8s  default-scheduler  Successfully assigned default/nginx to k8s-master01
  Normal   Pulled             5m6s  kubelet            Container image "nginx:1.15.2" already present on machine
  Normal   Created            5m6s  kubelet            Created container nginx
  Normal   Started            5m6s  kubelet            Started container nginx
  Normal   Killing            42s   kubelet            Stopping container nginx
  Warning  FailedPreStopHook  2s    kubelet            Exec lifecycle hook ([sh -c sleep 90]) for Container "nginx" in Pod "nginx_default(ff87b2bc-0039-4855-aa72-ccdf110e2182)" failed - error: command 'sh -c sleep 90' exited with 137: , message: ""








===============================END===============================


Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart                                                                                                                                                   ——W.S.Landor



来自为知笔记(Wiz)

标签:V04,示例,---,nginx,sleep,pod,k8s,###
来源: https://www.cnblogs.com/yanqivip/p/16076304.html