nginx pod hook钩子优雅关闭示例详解
admin
2024-02-17 01:36:40
0

一.系统环境

服务器版本docker软件版本Kubernetes(k8s)集群版本CPU架构
CentOS Linux release 7.4.1708 (Core)Docker version 20.10.12v1.21.9x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器操作系统版本CPU架构进程功能描述
k8scloude1/192.168.110.130CentOS Linux release 7.4.1708 (Core)x86_64docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calicok8s master节点
k8scloude2/192.168.110.129CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点
k8scloude3/192.168.110.128CentOS Linux release 7.4.1708 (Core)x86_64docker,kubelet,kube-proxy,calicok8s worker节点

二.前言

本文介绍pod hook(pod钩子)和如何优雅的关闭nginx pod。

管理pod的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.jb51.net/article/266741.htm

三.pod hook(pod钩子)

为容器的生命周期事件设置处理函数,Kubernetes 支持 postStart 和 preStop 事件。 当一个容器启动后,Kubernetes 将立即发送 postStart 事件;在容器被终结之前, Kubernetes 将发送一个 preStop 事件。容器可以为每个事件指定一个处理程序。

pod hook:目前pod3容器里运行的是nginx进程,在启动容器的时候,除了主进程,还想启动一个进程,怎么办?这时候就需要使用pod hook(pod 钩子),pod hook有两个选项:

  • postStart:容器启动之后执行XXXX,和主进程是同时运行起来的,并没有先后顺序;
  • preStop:在容器关闭之前执行XXXX

postStart例子:容器启动之后执行"/bin/sh","-c","date >> /tmp/bb.txt",打印日期到/tmp/bb.txt文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

[root@k8scloude1 pod]# vim pod3.yaml

[root@k8scloude1 pod]# cat pod3.yaml

apiVersion: v1

kind: Pod

metadata:

  creationTimestamp: null

  labels:

    run: pod3

  name: pod3

spec:

  terminationGracePeriodSeconds: 0

  containers:

  - image: nginx

    command: ["sh","-c","date > /tmp/aa.txt ; sleep 10000"]

    imagePullPolicy: IfNotPresent

    name: n1

    resources: {}

    lifecycle:

      postStart:

        exec:

          command: ["/bin/sh","-c","date >> /tmp/bb.txt"]

  dnsPolicy: ClusterFirst

  restartPolicy: Always

status: {}

[root@k8scloude1 pod]# kubectl apply -f pod3.yaml

pod/pod3 created

[root@k8scloude1 pod]# kubectl get pods

NAME    READY   STATUS    RESTARTS   AGE

pod3    1/1     Running   0          8s

查看文件可以发现,/tmp/aa.txt /tmp/bb.txt 时间是一致的,就说明两个命令是同时运行的,证明了postStart:容器启动之后执行XXXX,和主进程是同时运行起来的,并没有先后顺序。

1

2

3

4

5

6

7

8

9

[root@k8scloude1 pod]# kubectl exec -it pod3 -- bash

root@pod3:/# cat /tmp/aa.txt /tmp/bb.txt

Thu Jan 13 07:40:24 UTC 2022

Thu Jan 13 07:40:24 UTC 2022

root@pod3:/# exit

exit

#删除pod

[root@k8scloude1 pod]# kubectl delete -f pod3.yaml

pod "pod3" deleted

现在添加preStop处理函数:在容器关闭之前执行"/bin/sh","-c","date >> /tmp/bb.txt ; sleep 100",打印日期到/tmp/bb.txt文件,并休眠100秒。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

[root@k8scloude1 pod]# vim pod4.yaml

[root@k8scloude1 pod]# cat pod4.yaml

apiVersion: v1

kind: Pod

metadata:

  creationTimestamp: null

  labels:

    run: pod3

  name: pod3

spec:

  terminationGracePeriodSeconds: 600

  containers:

  - image: nginx

    command: ["sh","-c","date > /tmp/aa.txt ; sleep 10000"]

    imagePullPolicy: IfNotPresent

    name: n1

    resources: {}

    lifecycle:

      postStart:

        exec:

          command: ["/bin/sh","-c","date >> /tmp/bb.txt"]

      preStop:

        exec:

          command: ["/bin/sh","-c","date >> /tmp/bb.txt ; sleep 100"]

  dnsPolicy: ClusterFirst

  restartPolicy: Always

status: {}

[root@k8scloude1 pod]# kubectl apply -f pod4.yaml

pod/pod3 created

[root@k8scloude1 pod]# kubectl get pod

NAME    READY   STATUS    RESTARTS   AGE

pod3    1/1     Running   0          7s

运行一段时间后,删除pod,在容器关闭之前执行preStop的命令,preStop执行完成之后,主程序还要运行10000秒,但是宽限期terminationGracePeriodSeconds只有600s,所以600秒之后pod被删除

1

2

3

4

5

6

7

[root@k8scloude1 pod]# kubectl delete pod pod3

pod "pod3" deleted

^C

#强制删除pod

[root@k8scloude1 pod]# kubectl delete pod pod3 --force

warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.

pod "pod3" force deleted

四.如何优雅的关闭nginx pod

说明: 当一个 Pod 被删除时,执行kubectl get pod 命令会展示这个 Pod 的状态为 Terminating(终止)。 这个 Terminating 状态并不是 Pod 阶段之一。 Pod 被赋予一个可以体面终止的期限,默认为 30 秒。 你可以使用 --force 参数来强制终止 Pod。

由于nginx默认是fast shutdown,关闭的时间一般小于30秒,如果想优雅的关闭nginx,可以在关闭容器之前运行nginx -s quit ,达到优雅的关闭nginx的效果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

[root@k8scloude1 pod]# vim pod5.yaml

#preStop处理函数指定在容器关闭之前执行"/bin/sh","-c","/usr/sbin/nginx -s quit"

[root@k8scloude1 pod]# cat pod5.yaml

apiVersion: v1

kind: Pod

metadata:

  creationTimestamp: null

  labels:

    run: pod5

  name: pod5

spec:

  terminationGracePeriodSeconds: 600

  containers:

  - image: nginx

    command: ["sh","-c","date > /tmp/aa.txt ; sleep 10000"]

    imagePullPolicy: IfNotPresent

    name: n1

    resources: {}

    lifecycle:

      postStart:

        exec:

          command: ["/bin/sh","-c","date >> /tmp/bb.txt"]

      preStop:

        exec:

          command: ["/bin/sh","-c","/usr/sbin/nginx -s quit"]

  dnsPolicy: ClusterFirst

  restartPolicy: Always

status: {}

[root@k8scloude1 pod]# kubectl apply -f pod5.yaml

pod/pod5 created

[root@k8scloude1 pod]# kubectl get pod

NAME   READY   STATUS    RESTARTS   AGE

pod5   1/1     Running   0          5s

[root@k8scloude1 pod]# kubectl delete pod pod5

pod "pod5" deleted

^C

[root@k8scloude1 pod]# kubectl delete pod pod5 --force

warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.

pod "pod5" force deleted

相关内容

热门资讯

优酷安卓9.0系统版本,畅享流... 你有没有发现,最近你的优酷APP是不是有点不一样了?没错,就是那个我们每天离不开的追剧神器——优酷,...
安卓手机系统体验排名,揭秘最佳... 你有没有发现,现在手机市场上安卓手机的品牌和型号简直多到让人眼花缭乱?每个品牌都试图在系统体验上大显...
安卓操作系统技巧在哪,安卓操作... 你有没有发现,安卓手机用久了,总感觉有点慢吞吞的?别急,今天就来给你支几招,让你的安卓手机焕发第二春...
安卓手机哪个系统最快,揭秘最快... 你有没有想过,为什么你的安卓手机有时候会慢吞吞的,像是老牛拉破车一样?别急,今天就来给你揭秘安卓手机...
安卓非系统允许程序,探索安卓非... 你知道吗?在安卓手机的世界里,除了那些系统自带的程序,还有很多“外来客”在悄悄地占领着你的手机空间。...
qq飞车安卓系统和苹果系统,安... 你有没有发现,最近QQ飞车这款游戏在安卓系统和苹果系统上可是火得一塌糊涂啊!不管是走在街头,还是坐在...
安卓系统页面不显示时间,安卓系... 手机屏幕上那时间怎么突然消失了呢?是不是你也遇到了安卓系统页面不显示时间的问题?别急,今天就来给你详...
怎么修改安卓系统设备,揭秘安卓... 手机用久了是不是觉得卡得要命?别急,今天就来教你怎么修改安卓系统设备,让你的手机焕发第二春!一、清理...
安卓平板刷车载系统固件,体验智... 你有没有想过,你的安卓平板不仅能陪你追剧、玩游戏,还能变身成为车载系统的得力助手呢?没错,就是那种让...
安卓要不要系统更新系统,守护安... 亲爱的安卓用户们,你是不是也经常被手机弹出的系统更新通知搞得头都大了?是不是在犹豫,这更新到底要不要...
电视机安卓系统则,体验升级 你有没有发现,现在的电视机越来越智能了?尤其是那些搭载了安卓系统的电视机,简直就像是个小机器人,不仅...
安卓系统打开动画效果,打开动画... 你有没有发现,每次打开安卓手机,那瞬间闪现的动画效果,就像是一场视觉盛宴呢?今天,就让我带你一起探索...
安卓系统的诞生和发展,安卓系统... 你有没有想过,手机里的那个小小的操作系统,竟然能改变我们的生活呢?没错,我要说的就是安卓系统。它就像...
安卓系统电话通话录音,捕捉真实... 你有没有想过,在繁忙的生活中,有时候一个电话的录音就能帮你回忆起重要的信息或者关键时刻的对话内容呢?...
安卓64位系统官方下载,解锁全... 你有没有发现,最近你的安卓手机好像有点卡卡的呢?别急,别急,今天就来给你揭秘一下如何给你的安卓手机升...
安卓8系统可以吗,创新与变革的... 你有没有听说安卓8系统?最近这个话题在数码圈可是火得一塌糊涂呢!不少朋友都在问我:“安卓8系统可以吗...
安卓系统电量显示不正,揭秘原因... 手机电量显示不准确,是不是你也遇到了这样的烦恼?每次看着那忽上忽下的电量百分比,心里是不是直发慌?别...
安卓平板开票系统怎么用,轻松实... 你有没有想过,拥有一台安卓平板,不仅能随时随地办公学习,还能轻松搞定开票业务呢?没错,现在就让我来带...
安卓系统怎样下载尚德,安卓系统... 你有没有想过,想要在安卓系统上下载尚德,其实就像是在茫茫书海中找到一本宝藏呢?别急,让我来带你一步步...
安卓5系统自带相机软件,系统自... 你有没有发现,自从你升级到了安卓5系统,手机里的相机软件好像变得不一样了呢?没错,就是那个我们每天都...