--- tags: Kubernetes, Pod Resource Limit and Behaviors description: Kubernetes Pod Resource Limit and Behaviors robots: index, follow --- <style> html, body, .ui-content { background-color: #333; color: #ddd; } .markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { color: #ddd; } .markdown-body h1, .markdown-body h2 { border-bottom-color: #ffffff69; } .markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { color: #fff; } .markdown-body img { background-color: transparent; } .ui-toc-dropdown .nav>.active:focus>a, .ui-toc-dropdown .nav>.active:hover>a, .ui-toc-dropdown .nav>.active>a { color: white; border-left: 2px solid white; } .expand-toggle:hover, .expand-toggle:focus, .back-to-top:hover, .back-to-top:focus, .go-to-bottom:hover, .go-to-bottom:focus { color: white; } .ui-toc-dropdown { background-color: #333; } .ui-toc-label.btn { background-color: #191919; color: white; } .ui-toc-dropdown .nav>li>a:focus, .ui-toc-dropdown .nav>li>a:hover { color: white; border-left: 1px solid white; } .markdown-body blockquote { color: #bcbcbc; } .markdown-body table tr { background-color: #5f5f5f; } .markdown-body table tr:nth-child(2n) { background-color: #4f4f4f; } .markdown-body code, .markdown-body tt { color: #eee; background-color: rgba(230, 230, 230, 0.36); } a, .open-files-container li.selected a { color: #5EB7E0; } </style> # Kubernetes Pod Resource Limit and Behaviors 在設計Pod的時候,大多的使用者不預期設置container的資源上限,使用上雖然不會有太大的問題,不過在特定的狀況下,一直讓container所使用的資源一路往主機的資源上限衝,不是一個好主意。 資源限制分成以下種類: 1. 運算資源 1. CPU 2. RAM 3. PID上限 2. 儲存資源 1. ephemeral Storage :::info 1. Persistent Volume Clims(PVC)限制不在pod resource limit,在[Limit Storage Consumption](https://kubernetes.io/docs/tasks/administer-cluster/limit-storage-consumption/ "Limit Storage Consumption")。 ::: container資源限制時有以下兩種: 1. requests 最基本的資源需求,不能低於這個限制,例如cpu=2, cpu=1不行,必須大於等於限制值。 2. limits 這個容器能夠使用的資源最大值。 以下將介紹CPU與RAM在超過資源時的行為。 ## CPU Limit 一個CPU在kubernetes中,等同各公有雲的1 vCPU/Core或Intel處理器實體機上的一個hyperthread。 可轉換為執行CPU時間,一個CPU可轉換為1000 millicpu簡寫為1000m,如果我們只想要0.5 CPU,可以寫成0.5或500m。 CPU Pod定義。 ```yaml= apiVersion: v1 kind: Pod metadata: name: cpu-demo-1 spec: containers: - name: cpu-demo-1 image: vish/stress resources: limits: cpu: "0.5" requests: cpu: "0.1" args: - -cpus - "2" ``` 建立這個pod與狀態確認 ```shell= inwin@master:~$ kubectl create -f cpu1.yaml pod/cpu-demo-1 created inwin@master:~$ kubectl get po NAME READY STATUS RESTARTS AGE cpu-demo-1 1/1 Running 0 29s ``` 確認這個pod可以執行,CPU單位會自動轉換為m。 ```shell= inwin@master:~$ kubectl describe po cpu-demo-1 .... .... cpu-demo-1: Container ID: docker://071146f3b85b1789358c5c9b90c98dbd7c75c7a3dc15a3b899df1ed4bd9fedb7 Image: vish/stress Image ID: docker-pullable://vish/stress@sha256:b6456a3df6db5e063e1783153627947484a3db387be99e49708c70a9a15e7177 Port: <none> Host Port: <none> Args: -cpus 2 State: Running Started: Wed, 11 Aug 2021 02:23:47 +0000 Ready: True Restart Count: 0 Limits: cpu: 500m Requests: cpu: 100m .... .... ``` :::info 1. stress image是壓測用的套件,在yaml中我們定義為2個cpu,雖然沒有達到stress的需求,但是pod不會因為這樣就異常。 ::: 修改定義,將資源增加到100 cpu ```yaml= apiVersion: v1 kind: Pod metadata: name: cpu-demo-2 spec: containers: - name: cpu-demo-2 image: vish/stress resources: limits: cpu: "100" requests: cpu: "100" args: - -cpus - "2" ``` ```shell= inwin@master:~$ kubectl get po cpu-demo-2 NAME READY STATUS RESTARTS AGE cpu-demo-2 0/1 Pending 0 6m19s inwin@master:~$ kubectl describe po cpu-demo-2 .... .... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 8m15s default-scheduler 0/4 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/controlplane: true}, that the pod didn't tolerate, 3 Insufficient cpu. Warning FailedScheduling 8m14s default-scheduler 0/4 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/controlplane: true}, that the pod didn't tolerate, 3 Insufficient cpu. .... .... ``` :::info 1. 這個時候我們會發現pod呈現pending狀態,因為worker node沒有100個cpu。 2. 等到有worker node擁有100個cpu時,[control loop](https://kubernetes.io/docs/concepts/architecture/controller/ "Controllers")會幫你把pod建立起來。 ::: ## RAM Limit RAM Pod定義,我們可以設定一個上限200MB的pod,最低需求為100MB。 stress的ram要求為150m,所以這個pod能夠正常的啟用。 ```yaml= apiVersion: v1 kind: Pod metadata: name: memory-demo-1 spec: containers: - name: memory-demo-1 image: polinux/stress resources: limits: memory: "200Mi" requests: memory: "100Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] ``` ```shell= inwin@master:~$ kubectl create -f ram1.yaml pod/memory-demo-1 created inwin@master:~$ kubectl get po memory-demo-1 NAME READY STATUS RESTARTS AGE memory-demo-1 1/1 Running 0 2m3s ``` 調整yaml定義,將ram需求改到300MB ```shell= apiVersion: v1 kind: Pod metadata: name: memory-demo-2 spec: containers: - name: memory-demo-2 image: polinux/stress resources: limits: memory: "200Mi" requests: memory: "100Mi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "300M", "--vm-hang", "1"] ``` 觀察一下pod狀態。 ```shell= inwin@master:~$ kubectl get po memory-demo-2 NAME READY STATUS RESTARTS AGE memory-demo-2 0/1 OOMKilled 0 45s inwin@master:~$ kubectl describe po memory-demo-2 .... .... State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: OOMKilled Exit Code: 1 .... .... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 89s default-scheduler Successfully assigned default/memory-demo-2 to worker1 Normal Pulled 72s kubelet Successfully pulled image "polinux/stress" in 5.076176467s Normal Pulled 49s kubelet Successfully pulled image "polinux/stress" in 5.896584257s Normal Pulling 22s (x3 over 77s) kubelet Pulling image "polinux/stress" Normal Pulled 17s kubelet Successfully pulled image "polinux/stress" in 5.061148098s Normal Created 11s (x3 over 65s) kubelet Created container memory-demo-2 Normal Started 5s (x3 over 56s) kubelet Started container memory-demo-2 Warning BackOff 3s (x4 over 37s) kubelet Back-off restarting failed container .... .... inwin@master:~$ kubectl get po memory-demo-2 NAME READY STATUS RESTARTS AGE memory-demo-2 0/1 CrashLoopBackOff 4 4m36s ``` :::info 1. 這個時候我們會發現超過ram限制的pod會被砍掉,進入無限重建狀態。 ::: ## recommand 1. 網頁類型應用,可以改成deploy與[HPA](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ "Horizontal Pod Autoscaler"),在資源快超過的時候再建立一個pod出來一起處理。 2. 日常排程應用,調整limit值即可。 ## Reference 1. [Offcial - Managing Resources for Containers](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ "") 2. [Offcial - Assign CPU Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/ "Assign CPU Resources to Containers and Pods") 3. [Offcial - Assign Memory Resources to Containers and Pods](https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/ "Assign Memory Resources to Containers and Pods") 4. [Offcial - Limit Storage Consumption](https://kubernetes.io/docs/tasks/administer-cluster/limit-storage-consumption/ "Limit Storage Consumption") 5. [Offcial - Controllers](https://kubernetes.io/docs/concepts/architecture/controller/ "Controllers") 6. [Offcial - Horizontal Pod Autoscaler](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ "Horizontal Pod Autoscaler")