iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0

昨天是 requests 開太大排不進去,今天做 limits 設太小被砍掉

這次不動主要的 Deployment,另外開一個專門用來自殺的 Pod,比較好觀察

manifests/broken/memory-hog.yaml

apiVersion: v1
kind: Pod
metadata:
  name: memory-hog
  namespace: ithome-lab
spec:
  containers:
    - name: memory-hog
      image: python:3.12-alpine
      command:
        - python
        - -c
        - |
          import time
          data = "x" * 100 * 1024 * 1024
          print("allocated")
          time.sleep(3600)
      resources:
        limits:
          memory: "32Mi"

這段 Python 會配置大約 100MB 的字串,但我給的上限只有 32Mi。故意讓它超標

kubectl apply -f manifests/broken/memory-hog.yaml
kubectl get pods -n ithome-lab -w

https://ithelp.ithome.com.tw/upload/images/20261005/20176154gQLGArs08R.png

log

kubectl logs memory-hog -n ithome-lab --previous

https://ithelp.ithome.com.tw/upload/images/20261005/20176154NP9V8ODiy7.png

什麼都沒有,我寫的 print 也沒印出來

這就是記憶體超標跟一般崩潰的不同,記憶體超標是 kernel 在配置記憶體的當下直接把行程幹掉,程式沒有機會執行任何後續動作

describe

kubectl describe pod memory-hog -n ithome-lab

https://ithelp.ithome.com.tw/upload/images/20261005/20176154po2jTBDOTT.png

OOMKilled,Out Of Memory Killed。Exit Code 137 剛好是前幾天遇過的那個,128 + SIGKILL(9),也就是被砍掉

K8s 透過 cgroup 設定了這個 Container 的記憶體上限,超過瞬間 kernel 執行kill,K8s 事後發現並且記錄下來

跟昨天對照,requests 太大是直接進不去,狀態 Pending,卡在排程;limits 太小是進去了才被砍,狀態 OOMKilled 然後 CrashLoopBackOff,卡在執行。同樣是記憶體的問題,兩個欄位、兩種不同的症狀

修法:把 limit 調大,或是讓程式少吃一點。這裡我把上限改成 256Mi

kubectl delete -f manifests/broken/memory-hog.yaml
kubectl apply -f manifests/broken/memory-hog.yaml
kubectl get pods -n ithome-lab

https://ithelp.ithome.com.tw/upload/images/20261005/20176154riSLSjT5Be.png

但實務上調大 limit 之前要先想清楚,這個程式是本來就需要這麼多,還是它有記憶體洩漏。如果是後者,調大只是讓它晚一點掛,而且掛的時候會拖累更多東西

實驗做完把它清掉

kubectl delete -f manifests/broken/memory-hog.yaml

明天見 :D


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

尚未有邦友留言

立即登入留言