1.重啟策略(restartPolicy)
指的是容器什么時候才會被重啟,如果沒有健康檢查的話,默認(rèn)是根據(jù)pod的status來判斷的
有三個值,分別是:
-
Always
: 只要容器被終止退出后,總是重啟容器,默認(rèn)策略;
應(yīng)用場景:常駐進(jìn)程(例如nginx,tomcat、mysql等) -
OnFailure
:只有當(dāng)容器異常退出(退出狀態(tài)碼非0)時,才重啟容器;
應(yīng)用場景:預(yù)期性終止的程序,如果執(zhí)行失敗,進(jìn)行重啟(例如定時任務(wù)) -
Never
:只要當(dāng)容器終止退出時,不管什么原因,從不重啟容器;
應(yīng)用場景:預(yù)期性終止的程序,如果執(zhí)行失敗,不進(jìn)行重啟(例如一次性任務(wù) 需要修改數(shù)據(jù)庫里的數(shù)據(jù)時,如果執(zhí)行失敗則不能重新執(zhí)行,否則將會對數(shù)據(jù)庫里的數(shù)據(jù)造成影響、產(chǎn)生臟數(shù)據(jù)等等)
查看Pod的重啟策略:kubectl get pod名稱 -o yaml [-n 所在命名空間] | grep restartPolicy
[root@k8s-master ~]# kubectl get pod/nginx-9456bbbf9-zdccj -o yaml | grep restartPolicy
restartPolicy: Always
2.健康檢查類型
檢測容器中應(yīng)用程序的工作狀態(tài)
,為了防止那些進(jìn)程顯示正常但是又不能正常工作的應(yīng)用,例如tomcat的堆內(nèi)存溢出等等;
有三個值,分別是:
-
livenessProbe
(存活檢查):如果檢查容器中的應(yīng)用失?。☉?yīng)用不可用),將殺死容器,根據(jù)Pod的restartPlicy來操作; -
readinessProbe
(就緒檢查):如果檢查失敗,Kubernetes會把Pod從service endpoints中剔除; -
startupProbe
(啟動檢查):檢查成功后才會由存活檢查/就緒檢查接手,用于保護(hù)那些啟動慢的容器還沒起來就被存活檢查干掉;
存活檢查和就緒檢查,也是實(shí)現(xiàn)k8s實(shí)現(xiàn)自動化的兩個緯度/行為,一個是失敗后重啟pod,一個是剔除不健康的pod;
支持的健康檢查方法有:
-
httpGet
:發(fā)送HTTP請求,返回200-400范圍的狀態(tài)碼為成功;(例curl、wget命令) -
exec
:執(zhí)行Shell命令返回狀態(tài)碼是0為成功;(執(zhí)行一段命令) -
tcpSocket
:發(fā)起TCP Socket建立成功;(探測端口是否已經(jīng)打開并可以建立連接,例如nc、netstat、telnet命令)
service endpoints解釋:
如下圖:瀏覽器/客戶端需要訪問我們的應(yīng)用, 首先應(yīng)該去訪問service,service會將客戶端的請求轉(zhuǎn)發(fā)給后端關(guān)聯(lián)的一個/一組pod上,所以service在這里可以說是充當(dāng)了一個虛擬負(fù)載均衡器(LB)的角色,那么service和一個/一組pod之間的關(guān)聯(lián)就是service endpoints,當(dāng)就緒檢查發(fā)現(xiàn)pod失敗時,會將檢查失敗的pod從service endpoints中剔除,不讓service將流量轉(zhuǎn)發(fā)至檢查失敗的pod中去,只留下可以正常工作的pod來處理service轉(zhuǎn)發(fā)過來的請求;
可以通過kubectl get endpoints [-n 命名空間]
來查看service關(guān)聯(lián)的容器如上圖:存活和就緒的檢查動作都是由kubelet完成的;
因?yàn)閗ubelet是分布在每個節(jié)點(diǎn)運(yùn)行的,相當(dāng)于是一個每個節(jié)點(diǎn)都運(yùn)行了一個agent;而容器也是在每個節(jié)點(diǎn)都運(yùn)行的,所以kubelet是有直接的條件去接觸/探測容器的;
- kubelet 通過使用 liveness probe 來確定你的應(yīng)用程序是否正在運(yùn)行,通俗點(diǎn)將就是是否還活著。一般來說,如果你的程序一旦崩潰了, Kubernetes 就會立刻知道這個程序已經(jīng)終止了,然后就會重啟這個程序。而我們的 liveness probe 的目的就是來捕獲到當(dāng)前應(yīng)用程序還沒有終止,還沒有崩潰,如果出現(xiàn)了這些情況,那么就重啟處于該狀態(tài)下的容器,使應(yīng)用程序在存在 bug 的情況下依然能夠繼續(xù)運(yùn)行下去。
- kubelet 使用 readiness probe 來確定容器是否已經(jīng)就緒可以接收流量過來了。這個探針通俗點(diǎn)講就是說是否準(zhǔn)備好了,現(xiàn)在可以開始工作了。只有當(dāng) Pod 中的容器都處于就緒狀態(tài)的時候 kubelet 才會認(rèn)定該 Pod 處于就緒狀態(tài),因?yàn)橐粋€ Pod 下面可能會有多個容器。當(dāng)然 Pod 如果處于非就緒狀態(tài),那么我們就會將他從 Service 的 Endpoints 列表中移除出來,這樣我們的流量就不會被路由到這個 Pod 里面來了。
3.存活、就緒探針使用方法(httpGet)如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
labels:
app: web
spec:
selector:
matchLabels:
app: web
replicas: 3
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:latest
#存活檢查
livenessProbe:
httpGet:
#進(jìn)行探測的地址/頁面,一般都是由開發(fā)寫一個簡單的用于健康檢查的頁面
#如果沒有的話就找一個url頁面內(nèi)容較少的,盡量不要找頁面里業(yè)務(wù)邏輯多的 因?yàn)榻】禉z查也會不斷的去請求這個頁面來判斷是否可以訪問,在請求的過程中,也會不斷的進(jìn)行處理,消耗一定的cpu和內(nèi)存
path: /index.html
#指定健康檢查的端口,就是程序使用的端口【例如nginx80 tomcat8080 mysql3306】
port: 80
#啟動容器后多少秒開始進(jìn)行健康檢查【根據(jù)自己應(yīng)用的啟動時間來設(shè)置】
initialDelaySeconds: 5
#以后每間隔多少秒檢查一次
periodSeconds: 10
#就緒檢查【就緒檢查和存活檢查配置項(xiàng)一樣,根據(jù)自己應(yīng)用相對應(yīng)調(diào)整參數(shù)即可】
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: web
namespace: default
spec:
selector:
app: web
type: ClusterIP
ports:
- name: web
protocol: TCP
port: 80
targetPort: 80
[root@k8s-master ~]# kubectl apply -f probe-web.yaml
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS[重啟次數(shù)] AGE IP NODE NOMINATED NODE READINESS GATES
web-6c5678449f-ddkpd 1/1 Running 0 9m22s 10.244.36.94 k8s-node1 <none> <none>
web-6c5678449f-pj9xn 1/1 Running 0 9m22s 10.244.36.93 k8s-node1 <none> <none>
web-6c5678449f-rqbf9 1/1 Running 0 9m22s 10.244.36.91 k8s-node1 <none> <none>
[root@k8s-master ~]# kubectl get ep
NAME ENDPOINTS AGE
kubernetes 10.8.0.2:6443 78d
web 10.244.36.91:80,10.244.36.93:80,10.244.36.94:80 13m
#此時我們的nginx副本已經(jīng)創(chuàng)建好了,通過kubectl get ep 也可以查看道service關(guān)聯(lián)的副本的pod;
(1).驗(yàn)證存活檢查
(存活檢查的行為是當(dāng)容器里的服務(wù)掛了之后會進(jìn)行重啟)
大家可以通過 kubectl logs -f [pod名稱] [-n 命名空間] 看下正常的容器日志輸出為:
每隔10秒會出現(xiàn)兩條健康檢查的日志,分別是由kubelet的組件kube-proxy發(fā)起的存活檢查和就緒檢查的日志,探測的頁面地址就是我們上面配置的index.html;
此時模擬存活檢查失敗,也就是將狀態(tài)碼變成非200
,才可以觸發(fā)這個條件;
最簡單的方法就是進(jìn)入nginx容器將index.html頁面刪掉即可將狀態(tài)碼變?yōu)?04;
[root@k8s-master ~]# kubectl exec -it pod/web-6c5678449f-ddkpd bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@web-6c5678449f-ddkpd:/# cd /usr/share/nginx/html/
root@web-6c5678449f-ddkpd:/usr/share/nginx/html# ls
50x.html index.html
root@web-6c5678449f-ddkpd:/usr/share/nginx/html# rm index.html
root@web-6c5678449f-ddkpd:/usr/share/nginx/html# exit
現(xiàn)在已經(jīng)將index.html頁面刪掉了,再次查看容器日志
可以看到探測失敗以及關(guān)閉此容器的的錯誤日志;
同時我們可以使用kubectl describe [pod名稱] [-n 命名空間] 來查看下容器的事件
可以看到里面有kubelet發(fā)出的兩個事件“Liveness probe failed: HTTP probe failed with statuscode: 404”
,“Container web failed liveness probe, will be restarted”
代表存活檢查探測HTTP失敗狀態(tài)碼為404
,容器網(wǎng)絡(luò)活動探測失敗將重啟啟動
;
使用kubectl get [pod名稱] [-n 命名空間] 查看pod內(nèi)容器的重啟次數(shù)(restart列)
可以看有一個pod內(nèi)的容器在37分鐘前被重啟了,這是因?yàn)榻】禉z查失敗導(dǎo)致的;注:這里重啟的是pod內(nèi)的容器,而不是重建的pod;只是用新的鏡像又重新拉起了容器,所以pod名和IP不會發(fā)生變化,如果是重建的pod的話,那么pod名和IP就會發(fā)生改變;
(2).驗(yàn)證就緒檢查
(就緒檢查的行為是當(dāng)容器里的服務(wù)未就緒或者掛了之后會將pod在service endpoints列表里剔除,不再將流量轉(zhuǎn)發(fā)至pod)
首先使用kubectl get ep查看一下關(guān)聯(lián)的pod
然后使用kubectl get ep -w 實(shí)時觀察一下,同時新建立一個終端并開始模擬故障(這里就緒檢查用的也是httpGet所以,只需要將index.html這個頁面刪除即可改變狀態(tài)碼為404)
[root@k8s-master ~]# kubectl exec -it web-6c5678449f-pj9xn bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@web-6c5678449f-pj9xn:/# cd /usr/share/nginx/html/
root@web-6c5678449f-pj9xn:/usr/share/nginx/html# ls
50x.html index.html
root@web-6c5678449f-pj9xn:/usr/share/nginx/html# rm index.html
root@web-6c5678449f-pj9xn:/usr/share/nginx/html# exit
exit
如上圖,大家可以發(fā)現(xiàn)由最開始的3個IP變成了2個,這就是就緒檢查失敗造成的,就緒檢查失敗就會把不可用的pod剔除,此時再去訪問service就不會再把請求轉(zhuǎn)發(fā)至失敗的pod了;最后又變成了3個,是因?yàn)榕渲昧舜婊顧z查將pod的容器重啟了、就緒檢查沒問題了之后,就會再把pod加入到enpoints列表中;
4.存活、就緒探針其它使用方法
示例:tcpSocket端口探測
:
livenessProbe:
tcpSocket:
#要探測的端口號;
port: 80
initialDelaySeconds: 120
periodSeconds: 30
示例:exec執(zhí)行命令探測
:
livenessProbe:
exec:
#執(zhí)行的shell命令,如果執(zhí)行后返回值為0則成功(可以執(zhí)行完成命令后使用 echo $? 來查看命令返回值);
command:
- cat
- /tmp/healthy
initialDelaySeconds: 120
periodSeconds: 30
注:存活檢查和就緒檢查是沒有先后順序的,如果一個項(xiàng)目都配置了這兩個探針的話,配置的時間參數(shù)也一致 是可以同時去進(jìn)行檢測的;
文章來源:http://www.zghlxwxcb.cn/news/detail-774240.html
總結(jié):
我們可以把k8s的健康檢查
和nacos/eureka
結(jié)合起來實(shí)現(xiàn)真正的優(yōu)雅上下線
;
具體方案可以參考如下地址:
https://blog.csdn.net/Dream_Weave/article/details/126379544文章來源地址http://www.zghlxwxcb.cn/news/detail-774240.html
到了這里,關(guān)于Kubernetes Pod的重啟策略+健康檢查(實(shí)現(xiàn)應(yīng)用自修復(fù));的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!