pod中钩子函数

参考:https://www.jianshu.com/p/a329a73f3296

http://blog.redrose2100.com/article/263

1.钩子函数介绍

钩子函数对于程序员来说并不陌生,比如我们java中常用的过滤器、拦截器都可以称作为一个钩子函数。指在自身生命周期过程中需要做的事情。

K8s对于Pod中的主容器提供了两个钩子函数

post start:容器创建之后执行,如果失败了会重启容器
pre stop:容器停止之前执行,执行完成之后容器将成功停止,再完成之前会阻塞删除容器的操作

与Pod的健康检查一样。可以使用 exec、tcpSocket、httpGet

2. 钩子函数的使用方式

钩子处理器支持使用如下三种方式定义动作:

2.1 exec命令:在容器内执行一次命令

lifecycle:
  postStart:
    exec:
      command:
      - cat
      - /var/lib/redis.conf

2.2 tcpSocket: 在当前容器尝试访问指定的socket

lifecycle:
  postStart:
    tcpSocket:
      port: 8000

2.3 httpGet: 在当前容器中向某url发起http请求
如下,为访问 http://192.168.2.150:80/users

lifecycle:
  postStart:
    httpGet:
      path: /users
      port: 80
      host: 192.168.2.150
      scheme: HTTP  # 或者HTTPS

以上三种方式第一种使用的比较多,其次是第三种,第二种使用的很少

下面我们来使用一下钩子函数。

案例

在生产环境中,应用启动后通常需要将服务注册才能使用。应用终止前,由于可能有大量的用户正在办理业务。需要等他们办理完才能停止。这段期间需要阻止有新的业务进来。通常我们把它叫做优雅停机。

在这里就不写java程序来演示,直接使用nginx镜像模拟,容器启动后生成一个running.html内容为Runnning,容器终止前修改running.html内容为Stopping,并且等待10秒后才能真正终止。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    lifecycle:
     postStart:
       exec:
         command:
         - "/bin/sh"
         - "-c"
         - "echo Running > /usr/share/nginx/html/running.html"
     preStop:
       exec:
         command:
         - "/bin/sh"
         - "-c"
         - "echo 'Stopping' > /usr/share/nginx/html/running.html; sleep 10"
   

启动Pod,观察服务状态,停止Pod观察服务状态与停止过程

# 启动
[root@master cycle]# kubectl create -f kube-nginx.yml                      
pod/nginx created

# 查看当前服务状态
[root@master ~]# kubectl exec -it nginx -- curl 127.0.0.1/running.html
Running

# 停止,注意这里停止我们设置了休眠10s,所以新打开一个终端查看状态
[root@master cycle]# kubectl delete -f kube-nginx.yml 

# 新打开一个终端查看状态
[root@master ~]# kubectl exec -it nginx -- curl 127.0.0.1/running.html
Stopping

#观察停止过程,这里我删掉启动过程,只暂时 Stopping
[root@master ~]# kubectl describe  pod nginx|grep -A 100 Event
  Normal  Killing    7s    kubelet            Stopping container nginx
[root@master ~]# kubectl describe  pod nginx|grep -A 100 Events
  Normal  Killing    10s   kubelet            Stopping container nginx
[root@master ~]# kubectl describe  pod nginx|grep -A 100 Events
Error from server (NotFound): pods "nginx" not found

从上面结果可以看出,容器运行后postStart也运行了,在delete Pod时。等待了十秒钟才删除,并且这十秒期间服务状态为Stopping,不在对外提供流量。

posted @ 2023-02-09 11:19  灰蓝色的白云梦想  阅读(65)  评论(0编辑  收藏  举报