nginx pod hook鉤子優(yōu)雅關(guān)閉示例詳解
一.系統(tǒng)環(huán)境
| 服務(wù)器版本 | docker軟件版本 | Kubernetes(k8s)集群版本 | CPU架構(gòu) |
|---|---|---|---|
| CentOS Linux release 7.4.1708 (Core) | Docker version 20.10.12 | v1.21.9 | x86_64 |
Kubernetes集群架構(gòu):k8scloude1作為master節(jié)點(diǎn),k8scloude2,k8scloude3作為worker節(jié)點(diǎn)
| 服務(wù)器 | 操作系統(tǒng)版本 | CPU架構(gòu) | 進(jìn)程 | 功能描述 |
|---|---|---|---|---|
| k8scloude1/192.168.110.130 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico | k8s master節(jié)點(diǎn) |
| k8scloude2/192.168.110.129 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker節(jié)點(diǎn) |
| k8scloude3/192.168.110.128 | CentOS Linux release 7.4.1708 (Core) | x86_64 | docker,kubelet,kube-proxy,calico | k8s worker節(jié)點(diǎn) |
二.前言
本文介紹pod hook(pod鉤子)和如何優(yōu)雅的關(guān)閉nginx pod。
管理pod的前提是已經(jīng)有一套可以正常運(yùn)行的Kubernetes集群,關(guān)于Kubernetes(k8s)集群的安裝部署,可以查看博客《Centos7 安裝部署Kubernetes(k8s)集群》http://www.dbjr.com.cn/article/266741.htm
三.pod hook(pod鉤子)
為容器的生命周期事件設(shè)置處理函數(shù),Kubernetes 支持 postStart 和 preStop 事件。 當(dāng)一個(gè)容器啟動(dòng)后,Kubernetes 將立即發(fā)送 postStart 事件;在容器被終結(jié)之前, Kubernetes 將發(fā)送一個(gè) preStop 事件。容器可以為每個(gè)事件指定一個(gè)處理程序。
pod hook:目前pod3容器里運(yùn)行的是nginx進(jìn)程,在啟動(dòng)容器的時(shí)候,除了主進(jìn)程,還想啟動(dòng)一個(gè)進(jìn)程,怎么辦?這時(shí)候就需要使用pod hook(pod 鉤子),pod hook有兩個(gè)選項(xiàng):
- postStart:容器啟動(dòng)之后執(zhí)行XXXX,和主進(jìn)程是同時(shí)運(yùn)行起來(lái)的,并沒(méi)有先后順序;
- preStop:在容器關(guān)閉之前執(zhí)行XXXX
postStart例子:容器啟動(dòng)之后執(zhí)行"/bin/sh","-c","date >> /tmp/bb.txt",打印日期到/tmp/bb.txt文件
[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
查看文件可以發(fā)現(xiàn),/tmp/aa.txt /tmp/bb.txt 時(shí)間是一致的,就說(shuō)明兩個(gè)命令是同時(shí)運(yùn)行的,證明了postStart:容器啟動(dòng)之后執(zhí)行XXXX,和主進(jìn)程是同時(shí)運(yùn)行起來(lái)的,并沒(méi)有先后順序。
[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
現(xiàn)在添加preStop處理函數(shù):在容器關(guān)閉之前執(zhí)行"/bin/sh","-c","date >> /tmp/bb.txt ; sleep 100",打印日期到/tmp/bb.txt文件,并休眠100秒。
[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
運(yùn)行一段時(shí)間后,刪除pod,在容器關(guān)閉之前執(zhí)行preStop的命令,preStop執(zhí)行完成之后,主程序還要運(yùn)行10000秒,但是寬限期terminationGracePeriodSeconds只有600s,所以600秒之后pod被刪除
[root@k8scloude1 pod]# kubectl delete pod pod3 pod "pod3" deleted ^C #強(qiáng)制刪除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
四.如何優(yōu)雅的關(guān)閉nginx pod
說(shuō)明: 當(dāng)一個(gè) Pod 被刪除時(shí),執(zhí)行kubectl get pod 命令會(huì)展示這個(gè) Pod 的狀態(tài)為 Terminating(終止)。 這個(gè) Terminating 狀態(tài)并不是 Pod 階段之一。 Pod 被賦予一個(gè)可以體面終止的期限,默認(rèn)為 30 秒。 你可以使用 --force 參數(shù)來(lái)強(qiáng)制終止 Pod。
由于nginx默認(rèn)是fast shutdown,關(guān)閉的時(shí)間一般小于30秒,如果想優(yōu)雅的關(guān)閉nginx,可以在關(guān)閉容器之前運(yùn)行nginx -s quit ,達(dá)到優(yōu)雅的關(guān)閉nginx的效果
[root@k8scloude1 pod]# vim pod5.yaml
#preStop處理函數(shù)指定在容器關(guān)閉之前執(zhí)行"/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以上就是nginx pod hook鉤子優(yōu)雅關(guān)閉示例詳解的詳細(xì)內(nèi)容,更多關(guān)于nginx pod hook鉤子關(guān)閉的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nginx的location配置導(dǎo)致網(wǎng)關(guān)返回404問(wèn)題
這篇文章主要介紹了nginx的location配置導(dǎo)致網(wǎng)關(guān)返回404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Nginx開(kāi)啟一個(gè)參數(shù)就能讓你的WEB性能提升3倍的方法
這篇文章主要介紹了Nginx開(kāi)啟一個(gè)參數(shù)就能讓你的WEB性能提升3倍的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
Nginx使用if指令實(shí)現(xiàn)多個(gè)proxy_pass方式
這篇文章主要介紹了Nginx使用if指令實(shí)現(xiàn)多個(gè)proxy_pass方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置
ubuntu上配置Nginx+PHP5 FastCGI服務(wù)器配置方法, 需要的朋友可以參考下。2010-06-06
Nginx之Http模塊系列之a(chǎn)utoindex模塊的具體使用
這篇文章主要介紹了Nginx之Http模塊系列之a(chǎn)utoindex模塊的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Nginx?部署的虛擬主機(jī)使用?Let's?Encrypt?加密?https的方法
HTTPS 是現(xiàn)在網(wǎng)站的標(biāo)配了,很多服務(wù)都是必須使用 https,如果你不使用的話,瀏覽器可能就不會(huì)對(duì)你非常友好了,這篇文章主要介紹了Nginx?部署的虛擬主機(jī)如何使用?Let's?Encrypt?來(lái)進(jìn)行加密?https,需要的朋友可以參考下2022-07-07
Nginx之location匹配和Rewrite重寫跳轉(zhuǎn)方式
這篇文章主要介紹了Nginx之location匹配和Rewrite重寫跳轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

