kubernetes資源排程之LimitRange
系列目錄
LimitRange從字面意義上來看就是對範圍進行限制,實際上是對cpu和記憶體資源使用範圍的限制
前面我們講到過資源配額,資源配額是對整個名稱空間的資源的總限制,是從整體上來限制的,而LimitRange則是對pod和container級別來做限制的
由於LimitRange是基於名稱空間的,因此為了測試,我們先建立一個名稱空間
kubectl create namespace default-mem-example
建立LimitRange和Pod物件
以下配置檔案聲明瞭記憶體的預設限制量和預設請求量
admin/resource/memory-defaults.yaml apiVersion: v1 kind: LimitRange metadata: name: mem-limit-range spec: limits: - default: memory: 512Mi defaultRequest: memory: 256Mi type: Container
在default-mem-example名稱空間下建立它
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example
現在,如果有在容器在default-mem-example
名稱空間下建立,並且在建立的時候沒有指定記憶體申請值和記憶體限制值,則它會被預設分配256M的記憶體請求和512M的記憶體上限
下面是一個包含容器的pod的配置.容器沒有顯式宣告資源申請和記憶體限制
admin/resource/memory-defaults-pod.yaml apiVersion: v1 kind: Pod metadata: name: default-mem-demo spec: containers: - name: default-mem-demo-ctr image: nginx
下面建立這個pod
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example
檢視這個pod的詳細資訊
kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
containers: - image: nginx imagePullPolicy: Always name: default-mem-demo-ctr resources: limits: memory: 512Mi requests: memory: 256Mi
以上輸出資訊顯示pod的容器包含了一個256M的記憶體申請和一個512M的記憶體限制.它們是LimitRange
裡宣告的預設值
僅指定限制,沒指定申請
下面是一個pod的其中一個容器的宣告檔案,它聲明瞭記憶體限制,但是沒有記憶體申請
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo-2
spec:
containers:
- name: default-mem-demo-2-ctr
image: nginx
resources:
limits:
memory: "1Gi"
建立它
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example
檢視資訊
kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example
resources:
limits:
memory: 1Gi
requests:
memory: 1Gi
可以看到容器的記憶體申請值和限制值是一樣的.需要注意它並不是LimitRange裡的預設值256M
僅聲明瞭申請,沒有宣告限制
下面是一個包含一個容器的pod宣告,容器只申請了資源,沒有限制
apiVersion: v1
kind: Pod
metadata:
name: default-mem-demo-3
spec:
containers:
- name: default-mem-demo-3-ctr
image: nginx
resources:
requests:
memory: "128Mi"
建立pod
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example
檢視資訊
kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example
resources:
limits:
memory: 512Mi
requests:
memory: 128Mi
輸出資訊顯示容器的申請值被設定為宣告的值.而限制值被設定成了512M,這是LimitRange的預設設定
設定申請和限制值的動機
如果一個名稱空間包含有資源限額,那麼設定申請和限制預設值往往也是有幫助的.以下是資源配額對名稱空間施加的兩個限制
在名稱空間執行的每一個容器必須有它自己的記憶體限額(CPU限額)。
在名稱空間中所有的容器使用的記憶體總量(CPU總量)不能超出指定的限額。
完整示例
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: example
spec:
limits:
- default: # default limit
memory: 512Mi
cpu: 2
defaultRequest: # default request
memory: 256Mi
cpu: 0.5
max: # max limit
memory: 800Mi
cpu: 3
min: # min request
memory: 100Mi
cpu: 0.3
maxLimitRequestRatio: # max value for limit / request
memory: 2
cpu: 2
type: Container # limit type, support: Container / Pod / PersistentVolumeClaim
default為預設值,即pod不設定的時候的預設值.
defaultRequest 預設請求
max 請求上限
min請求下限
注意預設請求值即為建立pod的時候不指定resource申請時預設賦予的值,預設值即為預設限制的上限.即不指定的時候預設賦予的值.min和max是可以指定的最大值和最小值.並且需要注意的是以上都是
Pod
級別的.
-maxLimitRequestRatio
顧名思義,是一個比率值,它是限制值和請求值的比率.由於資源排程都是基於申請的值,因此可能會出現資源超售情況(當然,可以使用配額來限制總的量),這個比率顯示了超售的比