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/