Kubernetes K8S之CPU和內存資源限制詳解linux
備註:CPU單位換算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超過 1m。1000m CPU = 1 CPU。api
官網地址:app
1 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/ 2 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/
Kubernetes對資源的限制其實是經過cgroup來控制的,cgroup是容器的一組用來控制內核如何運行進程的相關屬性集合。針對內存、CPU和各類設備都有對應的cgroup。spa
默認狀況下,Pod運行沒有CPU和內存的限額。這意味着系統中的任何Pod將可以像執行Pod所在節點機器同樣,能夠消耗足夠多的CPU和內存。通常會針對某些應用的Pod資源進行資源限制,這個資源限制是經過resources的requests【要分配的資源】和limits【最大使用資源】來實現的。code
1 # cat cpu-request-limit.yaml 2 apiVersion: v1 3 kind: Pod 4 metadata: 5 name: cpu-demo 6 namespace: cpu-example 7 spec: 8 containers: 9 - name: cpu-demo-ctr 10 image: vish/stress 11 resources: 12 limits: 13 cpu: "1" 14 requests: 15 cpu: "0.5" 16 args: 17 - -cpus 18 - "2"
配置文件的 args 部分提供了容器啓動時的參數。-cpus 「2」
參數告訴容器嘗試使用 2 個 CPU。對象
1 # memory-request-limit.yaml 2 apiVersion: v1 3 kind: Pod 4 metadata: 5 name: memory-demo 6 namespace: mem-example 7 spec: 8 containers: 9 - name: memory-demo-ctr 10 image: polinux/stress 11 resources: 12 limits: 13 memory: "200Mi" 14 requests: 15 memory: "100Mi" 16 command: ["stress"] 17 args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
配置文件的 args 部分提供了容器啓動時的參數。 "--vm-bytes", "150M"
參數告知容器嘗試分配 150 MiB 內存。不容許args中的啓動內存大於limits限制內存。blog
備註:CPU單位換算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超過 1m。1000m CPU = 1 CPU。進程
官網地址:內存
https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/
怎麼爲命名空間設置容器可用的內存和 CPU 總量。你能夠經過 ResourceQuota 對象設置配額,使用 ResourceQuota 限制命名空間中全部容器的內存請求總量、內存限制總量、CPU 請求總量和CPU 限制總量。資源
若是你想對單個容器而不是全部容器進行限制,就請使用 LimitRange。
示例:
1 # cat quota-mem-cpu.yaml 2 apiVersion: v1 3 kind: ResourceQuota 4 metadata: 5 name: mem-cpu-demo 6 spec: 7 hard: 8 requests.cpu: "1" 9 requests.memory: 1Gi 10 limits.cpu: "2" 11 limits.memory: 2Gi
應用以下【命名空間quota-mem-cpu-example已提早建立完畢】:
kubectl create -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example
查看 ResourceQuota 詳情:
kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml
輸出部分結果以下:
1 spec: 2 hard: 3 limits.cpu: "2" 4 limits.memory: 2Gi 5 requests.cpu: "1" 6 requests.memory: 1Gi 7 status: 8 hard: 9 limits.cpu: "2" 10 limits.memory: 2Gi 11 requests.cpu: "1" 12 requests.memory: 1Gi 13 used: 14 limits.cpu: "0" 15 limits.memory: "0" 16 requests.cpu: "0" 17 requests.memory: "0"
ResourceQuota 在 quota-mem-cpu-example 命名空間中設置了以下要求:
示例:
1 # cat memory-defaults.yaml 2 apiVersion: v1 3 kind: LimitRange 4 metadata: 5 name: mem-limit-range 6 spec: 7 limits: 8 - default: 9 memory: 512Mi 10 defaultRequest: 11 memory: 256Mi 12 type: Container
default相似於以前的limit;defaultRequest相似於以前的request。
應用以下:
kubectl create -f memory-defaults.yaml --namespace=default-mem-example
命名空間default-mem-example已提早建立完畢
如今,若是在 default-mem-example 命名空間建立容器,而且該容器沒有聲明本身的內存請求和限制值,那麼它將被指定一個默認的內存請求256 MiB和一個默認的內存限制512 Mib。
示例:
1 # cpu-defaults.yaml 2 apiVersion: v1 3 kind: LimitRange 4 metadata: 5 name: cpu-limit-range 6 spec: 7 limits: 8 - default: 9 cpu: 1 10 defaultRequest: 11 cpu: 0.5 12 type: Container
應用以下:
kubectl create -f cpu-defaults.yaml --namespace=default-cpu-example
其中default-cpu-example名稱空間已被提早建立
如今若是在 default-cpu-example 命名空間建立一個容器,該容器沒有聲明本身的 CPU 請求和限制時,那麼將會給它指定默認的 CPU 請求0.5和默認的 CPU 限制值1。
示例:
1 # cat memory-constraints.yaml 2 apiVersion: v1 3 kind: LimitRange 4 metadata: 5 name: mem-min-max-demo-lr 6 spec: 7 limits: 8 - max: 9 memory: 1Gi 10 min: 11 memory: 500Mi 12 type: Container
應用以下:
kubectl create -f memory-constraints.yaml --namespace=constraints-mem-example
其中constraints-mem-example名稱空間已被提早建立
查看 LimitRange 的詳情:
kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml
輸出顯示預期的最小和最大內存約束。但請注意,即便您沒有在 LimitRange 的配置文件中指定默認值,默認值也會被自動建立。
1 limits: 2 - default: 3 memory: 1Gi 4 defaultRequest: 5 memory: 1Gi 6 max: 7 memory: 1Gi 8 min: 9 memory: 500Mi 10 type: Container
如今,只要在 constraints-mem-example 命名空間中建立容器,Kubernetes 就會執行下面的步驟:
示例:
1 # cpu-constraints.yaml 2 apiVersion: v1 3 kind: LimitRange 4 metadata: 5 name: cpu-min-max-demo-lr 6 spec: 7 limits: 8 - max: 9 cpu: "800m" 10 min: 11 cpu: "200m" 12 type: Container
應用以下:
kubectl create -f cpu-constraints.yaml --namespace=constraints-cpu-example
其中constraints-cpu-example名稱空間已被提早建立
查看 LimitRange 詳情:
kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example
輸出結果顯示 CPU 的最小和最大限制符合預期。但須要注意的是,儘管你在 LimitRange 的配置文件中你沒有聲明默認值,默認值也會被自動建立。
1 limits: 2 - default: 3 cpu: 800m 4 defaultRequest: 5 cpu: 800m 6 max: 7 cpu: 800m 8 min: 9 cpu: 200m 10 type: Container
如今無論何時在 constraints-cpu-example 命名空間中建立容器,Kubernetes 都會執行下面這些步驟:
示例:
1 # cat quota-pod.yaml 2 apiVersion: v1 3 kind: ResourceQuota 4 metadata: 5 name: pod-demo 6 spec: 7 hard: 8 pods: "2"
應用以下【命名空間quota-pod-example已提早建立完畢】:
kubectl apply -f quota-pod.yaml --namespace=quota-pod-example
查看資源配額的詳細信息:
kubectl get resourcequota pod-demo --namespace=quota-pod-example --output=yaml
從輸出的信息咱們能夠看到,該命名空間下pod的配額是2個,目前建立的pods數爲0,配額使用率爲0。
1 spec: 2 hard: 3 pods: "2" 4 status: 5 hard: 6 pods: "2" 7 used: 8 pods: "0"
完畢!
———END———
若是以爲不錯就關注下唄 (-^O^-) !