iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0

今天來把 readinessProbe 路徑改成一個不存在的位置

          readinessProbe:
            httpGet:
              path: /healthz
              port: 80
kubectl apply -f manifests/base
kubectl get pods -n ithome-lab

https://ithelp.ithome.com.tw/upload/images/20261003/201761543FPdo5UzXP.png

前面說過 READY 那個分數是通過 Readiness 檢查的 Container 數量,現在檢查失敗,所以分子是 0。Pod 本身活著,nginx 也正常在跑,只是 K8s 認定它還沒準備好

還有一個現象,部署會卡住

kubectl rollout status deployment/web -n ithome-lab

https://ithelp.ithome.com.tw/upload/images/20261003/20176154CABW5myKJI.png

滾動更新的規則是新 Pod 要 ready 了才繼續往下換,但這批新的永遠不會 ready,所以整個更新停在那裡,舊的 Pod 還在,服務還活著,只是新版本永遠上不去

原因在 Events 裡面寫得很清楚

kubectl describe pod <POD_NAME> -n ithome-lab

https://ithelp.ithome.com.tw/upload/images/20261003/20176154pkZWPvlU6r.png

看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

https://ithelp.ithome.com.tw/upload/images/20261003/20176154eiLm4a9ZOj.png

最後那個 + 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


上一篇
Day 18 Service selector
下一篇
Day 20 Pending
系列文
讓Claude Code當我的 K8s 助教:部署、故障排查與入門可觀測性 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言