前言
鉤子函數(shù)對于程序員來說并不陌生,比如我們java中常用的過濾器冯丙、攔截器都可以稱作為一個鉤子函數(shù)船老。指在自身生命周期過程中需要做的事情。
K8s對于Pod中的主容器提供了兩個鉤子函數(shù)
Post start容器創(chuàng)建后執(zhí)行
Pre stop容器終止前執(zhí)行
與Pod的健康檢查一樣滚躯〕牛可以使用 exec、tcpSocket掸掏、httpGet
下面我們來使用一下鉤子函數(shù)茁影。
使用
在生產(chǎn)環(huán)境中,應(yīng)用啟動后通常需要將服務(wù)注冊才能使用丧凤。應(yīng)用終止前募闲,由于可能有大量的用戶正在辦理業(yè)務(wù)。需要等他們辦理完才能停止愿待。這段期間需要阻止有新的業(yè)務(wù)進(jìn)來浩螺。通常我們把它叫做優(yōu)雅停機(jī)靴患。
在這里就不寫java程序來演示,直接使用nginx鏡像模擬年扩,容器啟動后生成一個running.html內(nèi)容為Runnning蚁廓,容器終止前修改running.html內(nèi)容為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厨幻,觀察服務(wù)狀態(tài)相嵌,停止Pod觀察服務(wù)狀態(tài)與停止過程
# 啟動
[root@master cycle]# kubectl create -f kube-nginx.yml
pod/nginx created
# 查看當(dāng)前服務(wù)狀態(tài)
[root@master ~]# kubectl exec -it nginx -- curl 127.0.0.1/running.html
Running
# 停止,注意這里停止我們設(shè)置了休眠10s况脆,所以新打開一個終端查看狀態(tài)
[root@master cycle]# kubectl delete -f kube-nginx.yml
# 新打開一個終端查看狀態(tài)
[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
從上面結(jié)果可以看出格了,容器運(yùn)行后postStart也運(yùn)行了看铆,在delete Pod時。等待了十秒鐘才刪除盛末,并且這十秒期間服務(wù)狀態(tài)為Stopping弹惦,不在對外提供流量。
Pod的鉤子函數(shù)就介紹到這里了悄但,下期對Pod的生命周期做一個總結(jié)棠隐。
歡迎關(guān)注,學(xué)習(xí)不迷路檐嚣!