Kubernetes(K8s)提供了幾種類型的探針(Probes),用于運(yùn)行時(shí)檢查容器中運(yùn)行的應(yīng)用程序的健康狀態(tài)。這些探針使得Kubernetes能夠更加智能地管理容器,例如自動(dòng)重啟失敗的容器、不將流量發(fā)送到未準(zhǔn)備好接收流量的容器等。探針可以配置為執(zhí)行三種類型的檢查:HTTP GET請(qǐng)求、TCP Socket檢查、以及執(zhí)行容器內(nèi)的命令。
探針類型
Kubernetes定義了三種主要類型的探針:
-
存活探針(Liveness Probe):
- 目的:確保應(yīng)用程序正在運(yùn)行。如果存活探針失敗,表示應(yīng)用不再活動(dòng),Kubernetes會(huì)根據(jù)策略重啟該容器。
- 應(yīng)用場(chǎng)景:當(dāng)應(yīng)用因死鎖或其他原因卡住時(shí),自動(dòng)重啟可能恢復(fù)應(yīng)用。
-
就緒探針(Readiness Probe):
- 目的:檢查容器是否準(zhǔn)備好接受流量。如果就緒探針失敗,表示應(yīng)用雖然正在運(yùn)行,但不應(yīng)接收請(qǐng)求,Kubernetes會(huì)停止向該容器發(fā)送請(qǐng)求,直到它準(zhǔn)備就緒。
- 應(yīng)用場(chǎng)景:用于控制那些需要加載大量數(shù)據(jù)或配置文件的應(yīng)用,直到應(yīng)用準(zhǔn)備好接受流量前,不將請(qǐng)求路由到該容器。
-
啟動(dòng)探針(Startup Probe):
- 目的:檢查容器應(yīng)用程序是否已啟動(dòng)。如果啟動(dòng)探針失敗,Kubernetes會(huì)重啟容器。一旦啟動(dòng)探針成功,就緒和存活探針將接管后續(xù)的檢查。
- 應(yīng)用場(chǎng)景:對(duì)于啟動(dòng)時(shí)間較長(zhǎng)的應(yīng)用,確保不會(huì)因?yàn)閱?dòng)慢而被誤判為失敗狀態(tài)。
探針檢查類型
每種探針都可以配置為執(zhí)行以下類型的檢查之一:
- HTTP GET:對(duì)指定的端口和路徑執(zhí)行HTTP GET請(qǐng)求。如果返回的狀態(tài)碼在成功的范圍內(nèi)(默認(rèn)為200-399),則認(rèn)為檢查成功。
- TCP Socket:嘗試建立TCP連接到容器的指定端口。如果連接成功建立,則認(rèn)為檢查成功。
- Exec:在容器內(nèi)執(zhí)行指定的命令。如果命令退出狀態(tài)碼為0,則認(rèn)為檢查成功。
配置示例
下面是一個(gè)配置存活探針和就緒探針的YAML示例:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: myimage
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
timeoutSeconds: 2
periodSeconds: 5
failureThreshold: 3
readinessProbe:
exec:
command:
- cat
- /tmp/ready
initialDelaySeconds: 5
periodSeconds: 5
在這個(gè)例子中,存活探針通過(guò)對(duì)/healthz
路徑執(zhí)行HTTP GET請(qǐng)求來(lái)檢查應(yīng)用的存活狀態(tài),而就緒探針通過(guò)執(zhí)行cat /tmp/ready
命令來(lái)檢查容器是否準(zhǔn)備好接受流量。
通過(guò)合理配置這些探針,可以提高應(yīng)用的穩(wěn)定性和可靠性,確保Kubernetes集群能夠更加智能地管理容器。
一個(gè)自動(dòng)檢測(cè)容器健康狀況的shell腳本例子
下面實(shí)現(xiàn)一個(gè)基于啟動(dòng)探針和存活探針的健康檢測(cè)腳本,同時(shí)包括讀取配置文件獲取IP和端口信息,以及在檢測(cè)到容器不健康時(shí)重啟容器的邏輯文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-826362.html
#!/bin/bash
# 定義變量
namespace="your-namespace"
config_path="/path/to/your/config"
pod_label_selector="app=your-app-label"
# 讀取配置文件獲取IP和端口
ip=$(grep 'ip' $config_path | cut -d'=' -f2)
port=$(grep 'port' $config_path | cut -d'=' -f2)
# 獲取Pod名字列表
pod_names=$(kubectl get pods -n $namespace -l $pod_label_selector -o=jsonpath='{.items[*].metadata.name}')
for pod_name in $pod_names; do
echo "Checking health for Pod: $pod_name"
# 使用kubectl exec執(zhí)行健康檢查命令
health_check_cmd="curl -s -o /dev/null -w '%{http_code}' http://$ip:$port/health"
result=$(kubectl exec $pod_name -n $namespace -- bash -c "$health_check_cmd")
# 檢查健康狀態(tài)
if [ "$result" != "200" ]; then
echo "Pod $pod_name is unhealthy. Restarting..."
kubectl delete pod $pod_name -n $namespace
# 注意:重啟Pod應(yīng)謹(jǐn)慎操作,確保符合你的應(yīng)用邏輯
# Kubernetes的部署(Deployment)會(huì)自動(dòng)重新創(chuàng)建Pod以保持所需的副本數(shù)量
else
echo "Pod $pod_name is healthy."
fi
done
說(shuō)明
-
配置讀取:腳本首先從指定的配置文件路徑讀取應(yīng)用的IP和端口信息。這里假設(shè)配置文件中有
ip=...
和port=...
這樣的行。 -
Pod檢索:通過(guò)
kubectl get pods
命令和標(biāo)簽選擇器獲取目標(biāo)應(yīng)用Pod的名稱列表。 -
健康檢查:對(duì)每個(gè)Pod執(zhí)行健康檢查命令。這個(gè)示例使用
curl
命令檢查應(yīng)用的/health
端點(diǎn)。 -
容器重啟:如果檢測(cè)到容器不健康(即HTTP狀態(tài)碼不是200),腳本會(huì)使用
kubectl delete pod
命令刪除該P(yáng)od。在Deployment等控制器管理下的Pod會(huì)自動(dòng)被重新創(chuàng)建,從而達(dá)到重啟的目的。
注意事項(xiàng)
- 權(quán)限:執(zhí)行這個(gè)腳本需要對(duì)Kubernetes集群有足夠的權(quán)限,包括讀取Pod信息和刪除Pod的能力。
- 安全性:在生產(chǎn)環(huán)境中,直接刪除Pod以觸發(fā)重啟可能不是最佳實(shí)踐,特別是對(duì)于那些沒(méi)有正確配置探針的應(yīng)用。最好是在應(yīng)用的Deployment配置中正確設(shè)置啟動(dòng)探針和存活探針。
- 配置文件:確保配置文件的路徑和格式與腳本中的邏輯相匹配。如果使用不同的配置管理方式(如ConfigMap或環(huán)境變量),需要相應(yīng)調(diào)整腳本。
-
錯(cuò)誤處理:在實(shí)際使用中,腳本應(yīng)包含更詳細(xì)的錯(cuò)誤處理邏輯,比如檢查
kubectl
命令的執(zhí)行結(jié)果,處理未找到Pod的情況等。
這個(gè)腳本提供了一個(gè)基礎(chǔ)的框架,可以根據(jù)實(shí)際需求進(jìn)行調(diào)整和擴(kuò)展。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-826362.html
到了這里,關(guān)于Kubernetes(K8s)探針的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!