D16 kubernetes 容器生命周期回调{PostStart、PreStop}

1、简介

容器生命周期回调是指在容器的生命周期中执行用户定义的操作。
  • kubernetes支持以下生命周期回调
PostStart(容器启动后):在容器启动后立即执行的回调,它可以用于执行一些初始化任务
PreStop(容器停止前):在容器停止之前执行的回调。它可以用于执行清理或保存状态的操作
可以通过使用exec、httpGet或tcpSocket方法配置回调。有关这些方法的具体用法参考这个链接 https://www.cnblogs.com/suyj/p/18376865

2、PostStart

  • PostStart回调在容器启动后立即执行,它有以下应用场景
执行预热操作:执行一系列预热操作,例如加载应用程序所需的数据或缓存数据,以提高应用程序的响应速度
准备文件:修改容器中已有文件或外部地址下载文件,以确保应用程序可以使用到正确的文件
通知其他组件:向其他组件发送通知(如调用api),以通知它们容器以启动
  • PostStart回调配置示例如下:
[root@k8s-master k8s]# cat pod-poststart.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: pod-poststart
  name: pod-poststart
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo $(date) 'Container started' > /tmp/poststart.log"]
[root@k8s-master k8s]# kubectl apply -f pod-poststart.yaml
pod/pod-poststart unchanged
[root@k8s-master k8s]# kubectl exec -it pod-poststart  -- cat /tmp/poststart.log
Thu Sep 5 09:50:07 UTC 2024 Container started
	在上述配置中,lifecycle部分定义了一个PostStart回调,用于在容器启动后执行 echo $(date) 'Container started' > /tmp/poststart.log命令
	例如:有一个Python Django开发的web应用,它要求在启动之前执行数据同步操作,以确保对ORM模型代码的变更应用到数据库中。这一需求可以通过配置postStart回调来实现,配置示例如下:
[root@k8s-master k8s]# cat django-app.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: django
  name: django-app
spec:
  containers:
  - name: web
    image: lizhenliang/django-app:v1
    lifecycle:
      postStart:
        exec:
          command:
          - /bin/sh
          - -c
          - |
            python mamage.py makeigrations &&
            python manage.py migrate
通过这样的配置,pod启动时执行 python mamage.py makeigrations 和python manage.py migrate命令分别生成数据库迁移文件,执行数据同步操作
需要注意的是,这里的command字段使用横岗-写法,与中括号[]等价,当执行复杂命令时,这种写法更易读

3、preStop

  • preStop回调在容器终止之前执行,它有以下应用场景
优雅关闭连接:关闭数据库连接,网络连接等,以确保数据的完整性和资源的正确释放
保存状态和数据:将应用程序生成的状态和数据写入数据库中或远程存储,以便在下次启动时恢复到之前的状态
通知其他组件:向其他组件发起通知,以通知它们容器即将终止
  • preStop回调配置示例如下:
[root@k8s-master k8s]# cat pod-prestop.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: pod-prestop
  name: pod-prestop
spec:
  containers:
  - name: web
    image: uhub.service.ucloud.cn/librarys/nginx:1.23
    lifecycle:
      preStop:
        exec:
          command: ["nginx", "-s", "quit"]
[root@k8s-master k8s]# kubectl apply -f pod-prestop.yaml
pod/pod-prestop created
[root@k8s-master k8s]# kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
pod-prestop   1/1     Running   0          1s
在上述配置中,lifecycle部分定义了一个preStop回调,用于在容器终止前执行 nginx -s quit命令。该命令向正在运行的nginx进程发送关闭信号,使该进程在处理完当前正在进行的请求后,优雅的停止服务,释放相关资源,并最终关闭与客户端的链接。这种做法确保了正在处理的请求得到正确处理,避免了异常终止或数据丢失,并提高了网站的稳定性和可靠性
下面的这个配置是定义了一个preStop回调,用于在容器退出之前执行nginx -s quit命令。该命令向正在运行的nginx进程发送关闭信号,使该进程在处理完当前正在进行的请求后,优雅的停止服务,释放相关资源,并最终关闭与客户端的链接。这种做法确保了正在处理的请求得到正确处理,避免了异常终止或数据丢失,并提高了网站的稳定性和可靠性
  containers:
    - image: 192.168.1.1/pay-nginx:master
      imagePullPolicy: Always
      lifecycle:
        preStop:
          exec:
            command:
              - /bin/sh
              - '-c'
              - nginx -s quit; while killall -0 nginx; do sleep 5; done
posted @ 2024-09-05 19:16  Hello_worlds  阅读(12)  评论(0编辑  收藏  举报