1. 資源調(diào)度
官方文檔: 概念 | 策略 | 限制范圍
官方文檔: 概念 | 策略 | 資源配額
1.1 資源限制
-
默認情況下, Kubernetes 集群上的容器運行使用的計算資源沒有限制。 使用資源配額,集群管理員可以以名字空間為單位,限制其資源的使用與創(chuàng)建。 在命名空間中,一個 Pod 或 Container 最多能夠使用命名空間的資源配額所定義的 CPU 和內(nèi)存用量。 有人擔心,一個 Pod 或 Container 會壟斷所有可用的資源。 LimitRange 是在命名空間內(nèi)限制資源分配(給多個 Pod 或 Container)的策略對象。
-
一個 LimitRange(限制范圍) 對象提供的限制能夠做到:
- 在一個命名空間中實施對每個 Pod 或 Container 最小和最大的資源使用量的限制。
- 在一個命名空間中實施對每個 PersistentVolumeClaim 能申請的最小和最大的存儲空間大小的限制。
- 在一個命名空間中實施對一種資源的申請值和限制值的比值的控制。
- 設(shè)置一個命名空間中對計算資源的默認申請/限制值,并且自動的在運行時注入到多個 Container 中。
-
限制范圍總覽
- 管理員在一個命名空間內(nèi)創(chuàng)建一個 LimitRange 對象。
- 用戶在命名空間內(nèi)創(chuàng)建 Pod ,Container 和 PersistentVolumeClaim 等資源。
- LimitRanger 準入控制器對所有沒有設(shè)置計算資源需求的 Pod 和 Container 設(shè)置默認值與限制值, 并跟蹤其使用量以保證沒有超出命名空間中存在的任意 LimitRange 對象中的最小、最大資源使用量以及使用量比值。
- 若創(chuàng)建或更新資源(Pod、 Container、PersistentVolumeClaim)違反了 LimitRange 的約束, 向 API 服務(wù)器的請求會失敗,并返回 HTTP 狀態(tài)碼 403 FORBIDDEN 與描述哪一項約束被違反的消息。
- 若命名空間中的 LimitRange 啟用了對 cpu 和 memory 的限制, 用戶必須指定這些值的需求使用量與限制使用量。否則,系統(tǒng)將會拒絕創(chuàng)建 Pod。
- LimitRange 的驗證僅在 Pod 準入階段進行,不對正在運行的 Pod 進行驗證。
1.1.1 namespace 設(shè)置 資源限制
- 設(shè)置資源限制
- 內(nèi)存中不能有 swap 分區(qū)
- 內(nèi)存是不可壓縮的資源,而 CPU 可以壓縮。如果內(nèi)存超出了限制,那么會被直接殺死,但是 CPU 不會
[root@k8s-1 ~]# vim limitrange.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: limitrange-demo
spec:
limits: // 上限
- default: // 當 limit 不設(shè)置時,cpu 和 memory 的上限默認為 0.5 和 512Mi
cpu: 0.5
memory: 512Mi
defaultRequest: // 當默認不設(shè)置時,cpu 和 memory 最小為 0.1 和 256Mi
cpu: 0.1
memory: 256Mi
max: // 最大不能超過這個值
cpu: 1
memory: 1Gi
min: // 最小不能低于這個值
cpu: 0.1
memory: 100Mi
type: Container
- 生效后,查看資源限制的狀態(tài)信息
[root@k8s-1 ~]# kubectl apply -f limitrange.yaml
limitrange/limitrange-demo created
[root@k8s-1 ~]# kubectl get limitranges
NAME CREATED AT
limitrange-demo 2022-05-11T12:19:14Z
- 限制的信息就是 YAML 清單中設(shè)置的
[root@k8s-1 ~]# kubectl describe limitranges
Name: limitrange-demo
Namespace: default
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 100m 1 100m 500m -
Container memory 100Mi 1Gi 256Mi 512Mi -
- 測試資源限制,創(chuàng)建名為 demo 的 Pod
[root@k8s-1 ~]# kubectl run demo --image=nginx
pod/demo created
[root@k8s-1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 90s
-
查看 Pod 的上線狀態(tài),發(fā)現(xiàn) Pod 的資源被限制
-
因為 Pod 沒有設(shè)定 limit 和 request,所以,限制是跟著 Default 走的
-
上限為 500m 的 CPU 和 512Mi 的 內(nèi)存
-
最小的請求量為 100m 的 CPU 和 256Mi 的 內(nèi)存
-
以上限制內(nèi)容都是 資源限制 limitranger 中設(shè)置的
[root@k8s-1 ~]# kubectl describe pod demo
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 100m
memory: 256Mi
Volumes:
kube-api-access-j8c98:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: Burstable
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
- 刪除該 Pod 后,創(chuàng)建設(shè)置了資源限制的 Pod
- 快速生成 Pod 的 YAML 模板
[root@k8s-1 ~]# kubectl run demo --image=nginx --dry-run=client -o yaml > pod.yaml
[root@k8s-1 ~]# kubectl run demo --image=nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: demo
name: demo
spec:
containers:
- args:
- pod.yaml
image: nginx
name: demo
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
- 修改 Pod.yaml
- CPU 最小不能低于 1
- CPU 最大不能超過 2
[root@k8s-1 ~]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo
name: demo
spec:
containers:
- image: nginx
name: demo
resources:
requests:
cpu: 1
limits:
cpu: 2
- 生效時,出現(xiàn)報錯。
- 因為 Pod 的 request 設(shè)置的是 1 ,limit 設(shè)置的是 2
- 而 資源限制 limitranger 要求當Pod 設(shè)置限制時, 其 CPU 最小不能低于 100m,最大不能超過 1
- 當前 Pod 的 CPU limit 超出了 limitranger 的限制
[root@k8s-1 ~]# kubectl apply -f pod.yaml
Error from server (Forbidden): error when creating "pod.yaml": pods "demo" is forbidden: maximum cpu usage per Container is 1, but limit is 2
[root@k8s-1 ~]# kubectl describe limitranges
Name: limitrange-demo
Namespace: default
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container cpu 100m 1 100m 500m -
Container memory 100Mi 1Gi 256Mi 512Mi -
- LimitRange 在 namespace 中施加的最小和最大內(nèi)存限制只有在創(chuàng)建和更新 Pod 時才會被應(yīng)用。改變 LimitRange 不會對之前創(chuàng)建的 Pod 造成影響。
1.2 資源配額
-
當多個用戶或團隊共享具有固定節(jié)點數(shù)目的集群時,人們會擔心有人使用超過其基于公平原則所分配到的資源量。
-
資源配額是幫助管理員解決這一問題的工具。
-
資源配額,通過 ResourceQuota 對象來定義,對每個命名空間的資源消耗總量提供限制。 它可以限制命名空間中某種類型的對象的總數(shù)目上限,也可以限制命令空間中的 Pod 可以使用的計算資源的總上限。
-
資源配額的工作方式如下:
-
不同的團隊可以在不同的命名空間下工作,目前這是非約束性的,在未來的版本中可能會通過 ACL (Access Control List 訪問控制列表) 來實現(xiàn)強制性約束。
-
集群管理員可以為每個命名空間創(chuàng)建一個或多個 ResourceQuota 對象。
-
當用戶在命名空間下創(chuàng)建資源(如 Pod、Service 等)時,Kubernetes 的配額系統(tǒng)會 跟蹤集群的資源使用情況,以確保使用的資源用量不超過 ResourceQuota 中定義的硬性資源限額。
-
如果資源創(chuàng)建或者更新請求違反了配額約束,那么該請求會報錯(HTTP 403 FORBIDDEN), 并在消息中給出有可能違反的約束。文章來源:http://www.zghlxwxcb.cn/news/detail-481070.html
-
如果命名空間下的計算資源 (如 cpu 和 memory)的配額被啟用,則用戶必須為 這些資源設(shè)定請求值(request)和約束值(limit),否則配額系統(tǒng)將拒絕 Pod 的創(chuàng)建。 提示: 可使用 LimitRanger 準入控制器來為沒有設(shè)置計算資源需求的 Pod 設(shè)置默認值。文章來源地址http://www.zghlxwxcb.cn/news/detail-481070.html
-
1.2.1 namespace 設(shè)置 資源配額
1.2.1.1 限制 內(nèi)存 和 CPU
- 設(shè)置資源配額
- CPU 最少不能低于 1
- 內(nèi)存 最少不能低于 1Gi
- CPU 最大不能超過 2
- 內(nèi)存 最大不能超過 2Gi
[root@k8s-1 ~]# vim quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
- 生效 資源配額
[root@k8s-1 ~]# kubectl apply -f quota.yaml
resourcequota/mem-cpu-demo created
- 對 namespace 加了 資源配額 之后,創(chuàng)建的 Pod 都必須設(shè)置 資源限制 limitranger ,不設(shè)置會報錯
- 模擬故障:刪除 limitranger 資源限制,令當前處于只有 資源配額 ,沒有 資源限制 的狀態(tài)
- 假設(shè)刪除了 limitranger ,那么當前 namespace 是沒有任何 資源限制 的
[root@k8s-1 ~]# kubectl delete -f limitrange.yaml
limitrange "limitrange-demo" deleted
[root@k8s-1 ~]# kubectl get limitranges
No resources found in default namespace.
- 創(chuàng)建 Pod 發(fā)現(xiàn)報錯,無法創(chuàng)建
- 因為 Pod 沒有 資源限制
[root@k8s-1 ~]# kubectl run demo --image=nginx
Error from server (Forbidden): pods "demo" is forbidden: failed quota: mem-cpu-demo: must specify limits.cpu,limits.memory,requests.cpu,requests.memory
- 生效 資源限制
[root@k8s-1 ~]# kubectl apply -f limitrange.yaml
limitrange/limitrange-demo created
- 再次 創(chuàng)建 Pod ,發(fā)現(xiàn)創(chuàng)建成功
- 因為創(chuàng)建了 資源限制 limitrange 的 namespace 會自動為 Pod 施加限制
- limitranger 限制 Pod 的 資源如下,在 資源配額 的要求范圍內(nèi)
[root@k8s-1 ~]# kubectl run demo --image=nginx
pod/demo created
[root@k8s-1 ~]# kubectl describe pod demo
Limits:
cpu: 500m
memory: 512Mi
Requests:
cpu: 100m
memory: 256Mi
- 查看 資源配額 中 已使用部分和未使用部分
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 500m 2
limits.memory 512Mi 2Gi
requests.cpu 100m 1
requests.memory 256Mi 1Gi
- 資源配額也限制了 Pod 的數(shù)量
[root@k8s-1 ~]# kubectl run demo2 --image=nginx
pod/demo2 created
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 1 2
limits.memory 1Gi 2Gi
requests.cpu 200m 1
requests.memory 512Mi 1Gi
[root@k8s-1 ~]# kubectl run demo3 --image=nginx
pod/demo3 created
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 1500m 2
limits.memory 1536Mi 2Gi
requests.cpu 300m 1
requests.memory 768Mi 1Gi
- 當前已經(jīng)有 4 個 Pod 了,資源配額已使用完
[root@k8s-1 ~]# kubectl run demo4 --image=nginx
pod/demo4 created
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 2 2
limits.memory 2Gi 2Gi
requests.cpu 400m 1
requests.memory 1Gi 1Gi
- 再次創(chuàng)建 Pod 會報錯,因為已經(jīng)沒有足夠的資源配額了
[root@k8s-1 ~]# kubectl run demo5 --image=nginx
Error from server (Forbidden): pods "demo5" is forbidden: exceeded quota: mem-cpu-demo, requested: limits.cpu=500m,limits.memory=512Mi,requests.memory=256Mi, used: limits.cpu=2,limits.memory=2Gi,requests.memory=1Gi, limited: limits.cpu=2,limits.memory=2Gi,requests.memory=1Gi
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 2 2
limits.memory 2Gi 2Gi
requests.cpu 400m 1
requests.memory 1Gi 1Gi
- 留下一個 Pod
[root@k8s-1 ~]# kubectl delete pod demo2 --force
[root@k8s-1 ~]# kubectl delete pod demo3 --force
[root@k8s-1 ~]# kubectl delete pod demo4 --force
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 500m 2
limits.memory 512Mi 2Gi
requests.cpu 100m 1
requests.memory 256Mi 1Gi
-
配額資源限制 比 資源限制 范圍大。
資源限制 是指限制 Pod 每次使用的資源;
而 配額資源限制 是指限制所有 Pod 使用的資源總和;
如果只創(chuàng)建了 配額資源限制,沒有創(chuàng)建 資源限制,
那么可能創(chuàng)建的第一個 Pod 就把所有的 配額資源 使用了,導致不能再創(chuàng)建多余的 Pod
1.2.1.2 限制 Pod 數(shù)量
- 修改 資源配額 的 YAML 清單
- 限制只能創(chuàng)建 2 個 Pod
[root@k8s-1 ~]# vim quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
pods: "2"
- 生效后,查看資源配額
- 總共可以創(chuàng)建 2 個 Pod,已經(jīng)存在了 1 個 Pod
[root@k8s-1 ~]# kubectl apply -f quota.yaml
resourcequota/mem-cpu-demo configured
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 500m 2
limits.memory 512Mi 2Gi
pods 1 2
requests.cpu 100m 1
requests.memory 256Mi 1Gi
- 再次創(chuàng)建一個 Pod,可以創(chuàng)建成功。當前已經(jīng)有 2 個 Pod 了
[root@k8s-1 ~]# kubectl run demo2 --image=nginx
pod/demo2 created
[root@k8s-1 ~]# kubectl describe resourcequotas
Name: mem-cpu-demo
Namespace: default
Resource Used Hard
-------- ---- ----
limits.cpu 1 2
limits.memory 1Gi 2Gi
pods 2 2
requests.cpu 200m 1
requests.memory 512Mi 1Gi
- 再創(chuàng)建第 3 個 Pod,發(fā)現(xiàn)創(chuàng)建失敗。已經(jīng)超出 資源配額 的限制了
[root@k8s-1 ~]# kubectl run demo3 --image=nginx
Error from server (Forbidden): pods "demo3" is forbidden: exceeded quota: mem-cpu-demo, requested: pods=1, used: pods=2, limited: pods=2
到了這里,關(guān)于CKA 10_Kubernetes工作負載與調(diào)度 資源調(diào)度 資源限制 LimitRanger 資源配額 ResourceQuota的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!