Istio 服務的健康檢查 === Kubernetes 存活和就緒探針描述了幾種配置存活和就緒探針的方法: 命令 HTTP 請求 TCP 探針 命令方式無需更改即可工作,但 HTTP 請求和 TCP 探針需要 Istio 更改 Pod 的配置。 對服務的健康檢查請求由 Kubelet 發送。 當啟用雙向 TLS 時,這會成為一個問題,因為 Kubelet 沒有 Istio 頒發的證書。 因此,健康檢查請求將失敗。liveness-http TCP 探針檢查需要特殊處理,因為 Istio 將所有傳入的流量重定向到 Sidecar,所以所有 TCP 連接埠都顯示為開放。 Kubelet 僅檢查某個進程是否正在監聽指定的埠,因此只要 Sidecar 正在運行,該探針就總會成功。 Istio 通過重寫應用程式 就緒/存活探針來解決這兩個問題,以便將探針請求發送到 Sidecar 代理PodSpec。 對於 HTTP 請求,Sidecar 代理將請求重定向到應用程式並剝離響應體,僅返回響應代碼。 對於 TCP 探針,Sidecar 代理會在避免流量重定向的同時進行埠檢查。 在所有內置的 Istio 配置檔中,有問題的探針的重寫是默認啟用的,但可以如下所述禁用。 # 使用命令方式的存活和就緒探針 Istio 提供了一個存活示例來實現這種方式。 為了演示該探針在啟用雙向 TLS 的情況下如何工作,本例先創建一個命名空間: $ kubectl create ns istio-io-health 要設定 雙向 TLS,請執行:STRICT ``` $ kubectl apply -f - <<EOF apiVersion: security.istio.io/v1beta1 kind: PeerAuthentication metadata: name: "default" namespace: "istio-io-health" spec: mtls: mode: STRICT EOF ``` 接下來,運行以下命令來部署範例服務: ``` $ kubectl -n istio-io-health apply -f <(istioctl kube-inject -f samples/health-check/liveness-command.yaml) ``` 要確認存活探針是否正常工作,請檢查範例 Pod 的狀態以驗證它是否正在運行。 ``` $ kubectl -n istio-io-health get pod NAME READY STATUS RESTARTS AGE liveness-6857c8775f-zdv9r 2/2 Running 0 4m ``` 使用 HTTP 或 TCP 方式的存活和就緒探針 如上所述,Istio 預設使用探針重寫來實現 HTTP/TCP 探針。 您可以為特定 Pod 或全域禁用此特性。 為 Pod 禁用探針重寫 您可以使用 來為 Pod 加入註解sidecar.istio.io/rewriteAppHTTPProbers: "false" 以禁用探針重寫選項。 確保將註解添加到 Pod 資源,因為它會在其他任何地方被忽略(例如,在封閉的 Deployment 資源上)。 ``` kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: liveness-http spec: selector: matchLabels: app: liveness-http version: v1 template: metadata: labels: app: liveness-http version: v1 annotations: sidecar.istio.io/rewriteAppHTTPProbers: "false" spec: containers: - name: liveness-http image: docker.io/istio/health:example ports: - containerPort: 8001 livenessProbe: httpGet: path: /foo port: 8001 initialDelaySeconds: 5 periodSeconds: 5 EOF ``` 這種方式允許您在單個 Deployment 上逐步禁用健康檢查探針重寫,而無需重新安裝 Istio。 全域禁用探針重寫 安裝 Istio 時使用 全域禁用探針重寫。 或者,更新 Istio Sidecar 注入器的配置映射:--set values.sidecarInjectorWebhook.rewriteAppHTTPProbe=false ``` $ kubectl get cm istio-sidecar-injector -n istio-system -o yaml | sed -e 's/"rewriteAppHTTPProbe": true/"rewriteAppHTTPProbe": false/' | kubectl apply -f - ``` 清理 移除這些範例所用的命名空間: ``` $ kubectl delete ns istio-io-health ``` https://istio.io/latest/zh/docs/ops/configuration/mesh/app-health-check/