LimitRange(限制范圍)
1饭聚,介紹
默認情況下, Kubernetes 集群上的容器運行使用的計算資源沒有限制搁拙。 使用資源配額秒梳,集群管理員可以以名字空間為單位,限制其資源的使用與創(chuàng)建感混。 在命名空間中端幼,一個 Pod 或 Container 最多能夠使用命名空間的資源配額所定義的 CPU 和內存用量。 有人擔心弧满,一個 Pod 或 Container 會壟斷所有可用的資源婆跑。 LimitRange 是在命名空間內限制資源分配(給多個 Pod 或 Container)的策略對象。
一個 LimitRange(限制范圍) 對象提供的限制能夠做到:
- 在一個命名空間中實施對每個 Pod 或 Container 最小和最大的資源使用量的限制庭呜。
- 在一個命名空間中實施對每個 PersistentVolumeClaim 能申請的最小和最大的存儲空間大小的限制滑进。
- 在一個命名空間中實施對一種資源的申請值和限制值的比值的控制。
- 設置一個命名空間中對計算資源的默認申請/限制值募谎,并且自動的在運行時注入到多個 Container 中扶关。
2,限制范圍
管理員在一個命名空間內創(chuàng)建一個 LimitRange 對象数冬。
用戶在命名空間內創(chuàng)建 Pod 节槐,Container 和 PersistentVolumeClaim 等資源。
LimitRanger 準入控制器對所有沒有設置計算資源需求的 Pod 和 Container 設置默認值與限制值拐纱, 并跟蹤其使用量以保證沒有超出命名空間中存在的任意 LimitRange 對象中的最小铜异、最大資源使用量以及使用量比值。
若創(chuàng)建或更新資源(Pod秸架、 Container揍庄、PersistentVolumeClaim)違反了 LimitRange 的約束, 向 API 服務器的請求會失敗东抹,并返回 HTTP 狀態(tài)碼 403 FORBIDDEN 與描述哪一項約束被違反的消息蚂子。
若命名空間中的 LimitRange 啟用了對 cpu 和 memory 的限制, 用戶必須指定這些值的需求使用量與限制使用量缭黔。否則食茎,系統(tǒng)將會拒絕創(chuàng)建 Pod。
LimitRange 的驗證僅在 Pod 準入階段進行馏谨,不對正在運行的 Pod 進行驗證别渔。
示例:
apiVersion: v1
kind: LimitRange
metadata:
name: limit-container
spec:
limits:
- max:
cpu: "2000m"
memory: "3Gi"
min:
cpu: "300m"
memory: "300Mi"
maxLimitRequestRatio:
cpu: 3
memory: 2
type: Pod
- max:
cpu: "500m"
memory: "1Gi"
min:
cpu: "100m"
memory: "100Mi"
default:
cpu: "300m"
memory: "200Mi"
defaultRequest:
cpu: "200m"
memory: "100Mi"
maxLimitRequestRatio:
cpu: 3
memory: 2
type: Container
參數(shù)說明:
pod部分:
max表示pod中所有容器資源的Limit值和的上限,也就是整個pod資源的最大Limit,如果pod定義中的Limit值大于LimitRange中的值钠糊,則pod無法成功創(chuàng)建。
min表示pod中所有容器資源請求總和的下限壹哺,也就是所有容器request的資源總和不能小于min中的值抄伍,否則pod無法成功創(chuàng)建。
maxLimitRequestRatio:表示pod中所有容器資源請求的Limit值和request值比值的上限管宵,例如該pod中cpu的Limit值為3截珍,而request為0.5,此時比值為6箩朴,創(chuàng)建pod將會失敗岗喉。
container部分:
在container的部分,max炸庞、min和maxLimitRequestRatio的含義和pod中的類似钱床,只不過是針對單個的容器而言
如果container設置了max、pod中的容器必須設置limit埠居,如果未設置查牌,則使用defaultlimt的值,如果defaultlimit也沒有設置滥壕,則無法成功創(chuàng)建
如果設置了container的min纸颜,創(chuàng)建容器的時候必須設置request的值,如果沒有設置绎橘,則使用defaultrequest胁孙,如果沒有defaultrequest,則默認等于容器的limit值称鳞,如果limit也沒有涮较,啟動就會報錯
注意:Pod級別沒有default值
創(chuàng)建一個正常容器限制的容器
apiVersion: v1
kind: Pod
metadata:
name: limit
namespace: test
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "200m"
memory: "200Mi"
創(chuàng)建一個超出限制的容器
apiVersion: v1
kind: Pod
metadata:
name: limit
namespace: test
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "500m"
memory: "500Mi"
[root@k8s-master limit]# kubectl apply -f pod.yaml
Error from server (Forbidden): error when creating "pod.yaml": pods "limit" is forbidden: [cpu max limit to request ratio per Container is 3, but provided ratio is 5.000000, memory max limit to request ratio per Container is 2, but provided ratio is 5.000000]