上節提到過,QoS影響pod的調度和驅離,本節講解如何通過配置pod來使它自動被賦予一個QoS
實際上是pod的配置達到一定標准,則kubernetes會自動為其它添加一個QoS類
QoS類型
當一個pod被創建,kubernetes會賦予它們以下類型的值之一
-
Guaranteed
-
Burstable
-
BestEffor
並且上一節我們講過,從上到下,他們的質量依次降低.
創建示例名稱空間
kubectl create namespace qos-example
創建一個會被賦予Guaranteed
類型QoS的pod
滿足以下條件的pod將會被賦予Guaranteed
QoS類型
-
pod中每個容器都必須包含內存請求和限制,並且值相等
-
pod中每個容器都必須包含cpu請求和限制,並且值相等
下面是一個pod中的container的配置.它包含內存請求和限制,並且值都等於200M;都包含cpu請求和限制,值都是700milliCPU
apiVersion: v1
kind: Pod
metadata:
name: qos-demo
namespace: qos-example
spec:
containers:
- name: qos-demo-ctr
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "700m"
requests:
memory: "200Mi"
cpu: "700m"
我們創建它
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod.yaml --namespace=qos-example
我們來查看它的信息
kubectl get pod qos-demo --namespace=qos-example --output=yaml
spec:
containers:
...
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
qosClass: Guaranteed
輸出信息顯示kubernetes給它了一個Guaranteed
類型的QoS.同時也驗證了它的內存請求與限制相同,cpu請求與限制也相同.
請注意,如果pod僅聲明了內存限制,而沒聲明內存請求,則kubernetes會自動賦予它與限制相同的內存請求.對於cpu也是這樣的.
還要注意的是前面我們講過
LimitRange
會自動賦予默認值,但是本篇我們並沒有設置LimitRange,因此以上行為是kubernetes的默認行為,而非由LimitRange
超作用.同時,即便設置了LimitRange,當僅設置了限制的時候,kubernetes也會自動將請求設置為與限制一樣的值,而不是默認值.當然,當僅僅設置了請求而沒設置限制,kubernetes在沒有LimitRange的情況下為會有自動行為,當有LimitRange會自動設置為默認值.
創建一個會被賦予Burstable
QoS類型的pod
當符合以下條件時,一個pod會被賦予Burstable類型的QoS
-
Pod不符合
Guaranteed
類型的QoS要求 -
pod至少設置了內存或者cpu請任一
以下是配置文件
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-2
namespace: qos-example
spec:
containers:
- name: qos-demo-2-ctr
image: nginx
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
創建pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-2.yaml --namespace=qos-example
查看它的信息
kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: qos-demo-2-ctr
resources:
limits:
memory: 200Mi
requests:
memory: 100Mi
...
qosClass: Burstable
輸出信息顯示kubernetes給它了一個Burstable
類型的QoS
創建一個會被賦予BestEffort
QoS類型的pod
一個pod即沒有內存限制或請求也沒有cpu限制或請求,則會被賦予BestEffort
以上可以翻譯為pod的資源里沒有任何關於cpu和內存的配置.
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-3
namespace: qos-example
spec:
containers:
- name: qos-demo-3-ctr
image: nginx
創建它
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-3.yaml --namespace=qos-example
查看信息
kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml
spec:
containers:
...
resources: {}
...
qosClass: BestEffort
創建一個包含兩個容器的pod
以下配置的pod包含兩個容器,其中一個聲明了內存限制為200M.另一個則沒有聲明任何請求或者限制
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-4
namespace: qos-example
spec:
containers:
- name: qos-demo-4-ctr-1
image: nginx
resources:
requests:
memory: "200Mi"
- name: qos-demo-4-ctr-2
image: redis
創建后查看輸出信息
spec:
containers:
...
name: qos-demo-4-ctr-1
resources:
requests:
memory: 200Mi
...
name: qos-demo-4-ctr-2
resources: {}
...
qosClass: Burstable