今天來把 readinessProbe 路徑改成一個不存在的位置
readinessProbe:
httpGet:
path: /healthz
port: 80
kubectl apply -f manifests/base
kubectl get pods -n ithome-lab

前面說過 READY 那個分數是通過 Readiness 檢查的 Container 數量,現在檢查失敗,所以分子是 0。Pod 本身活著,nginx 也正常在跑,只是 K8s 認定它還沒準備好
還有一個現象,部署會卡住
kubectl rollout status deployment/web -n ithome-lab

滾動更新的規則是新 Pod 要 ready 了才繼續往下換,但這批新的永遠不會 ready,所以整個更新停在那裡,舊的 Pod 還在,服務還活著,只是新版本永遠上不去
原因在 Events 裡面寫得很清楚
kubectl describe pod <POD_NAME> -n ithome-lab

看log
kubectl logs <POD_NAME> -n ithome-lab
# 會有一串類似下面這樣的log
[error] 34#34: *21784 open() "/usr/share/nginx/html/healthz" failed (2: No such file or directory), client: 10.244.0.1, server: localhost, request: "GET /healthz HTTP/1.1", host: "10.244.0.9:80"
10.244.0.1 - -
"GET /healthz HTTP/1.1" 404 153 "-" "kube-probe/1.36" "-"
nginx 會把每一次探測都記下來了,每隔幾秒一筆 404,算是另一個線索,如果 log 裡面出現規律的、間隔固定的請求,那可能就是 Probe 在打
然後看 Service
kubectl get endpointslices -n ithome-lab

最後那個 + 1 more 是剛才 0/1 的新 Pod
not ready 的 Pod 還是會被寫進 EndpointSlice,只是那筆 endpoint 的 conditions.ready 是 false,而 get endpointslices 的 ENDPOINTS 欄位不看 ready,所有地址都照印。真正把它擋掉的是 kube-proxy,它只把 ready 的地址放進轉發表。所以它在名單上,卻沒有人會把流量送給它
昨天是 selector 沒選到 Pod,今天 Pod 選得到、只是沒 ready,名單有地址、舊的三顆照樣服務,上不去的只有新版本
EndpointSlice 這一層分兩種讀法,地址整個不見是 selector 的問題,地址在但 ready 是 false 是 Probe 的問題,最快的分辨方法還是 get pods 的 READY 欄位,1/1 配名單空的是前者,0/1 配名單有地址是後者
把路徑改回就可以恢復了
kubectl apply -f manifests/base
kubectl get pods -n ithome-lab
明天見 :D
