配置 Pod 的服務質量
本頁面展示瞭如何配置 Pod,使其被分配特定的服務質量 (QoS) 類別。Kubernetes 使用 QoS 類別來決定在節點資源超出時驅逐 Pod。
當 Kubernetes 建立 Pod 時,它會為 Pod 分配以下 QoS 類別之一
準備工作
你需要有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個非控制平面主機節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練環境之一
你還需要能夠建立和刪除名稱空間。
建立名稱空間
建立一個名稱空間,以便你在本練習中建立的資源與叢集的其餘部分隔離。
kubectl create namespace qos-example
建立一個被分配 Guaranteed QoS 類的 Pod
對於被分配 Guaranteed
QoS 類的 Pod,
- Pod 中的每個容器都必須有記憶體限制和記憶體請求。
- 對於 Pod 中的每個容器,記憶體限制必須等於記憶體請求。
- Pod 中的每個容器都必須有 CPU 限制和 CPU 請求。
- 對於 Pod 中的每個容器,CPU 限制必須等於 CPU 請求。
這些限制對初始化容器和應用容器同樣適用。臨時容器不能定義資源,因此這些限制不適用。
這是一個包含一個容器的 Pod 的清單。該容器的記憶體限制和記憶體請求都等於 200 MiB。該容器的 CPU 限制和 CPU 請求都等於 700 milliCPU
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"
建立 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod.yaml --namespace=qos-example
檢視 Pod 的詳細資訊
kubectl get pod qos-demo --namespace=qos-example --output=yaml
輸出顯示 Kubernetes 為 Pod 分配了 Guaranteed
QoS 類。輸出還驗證了 Pod 容器的記憶體請求與其記憶體限制匹配,並且其 CPU 請求與其 CPU 限制匹配。
spec:
containers:
...
resources:
limits:
cpu: 700m
memory: 200Mi
requests:
cpu: 700m
memory: 200Mi
...
status:
qosClass: Guaranteed
注意
如果容器指定了自己的記憶體限制,但未指定記憶體請求,Kubernetes 會自動分配一個與限制匹配的記憶體請求。同樣,如果容器指定了自己的 CPU 限制,但未指定 CPU 請求,Kubernetes 會自動分配一個與限制匹配的 CPU 請求。清理
刪除你的 Pod
kubectl delete pod qos-demo --namespace=qos-example
建立一個被分配 Burstable QoS 類的 Pod
如果 Pod 滿足以下條件,則被分配 Burstable
QoS 類:
- Pod 不符合 QoS 類
Guaranteed
的標準。 - Pod 中至少有一個容器具有記憶體或 CPU 請求或限制。
這是一個包含一個容器的 Pod 的清單。該容器的記憶體限制為 200 MiB,記憶體請求為 100 MiB。
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
檢視 Pod 的詳細資訊
kubectl get pod qos-demo-2 --namespace=qos-example --output=yaml
輸出顯示 Kubernetes 為 Pod 分配了 Burstable
QoS 類。
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: qos-demo-2-ctr
resources:
limits:
memory: 200Mi
requests:
memory: 100Mi
...
status:
qosClass: Burstable
清理
刪除你的 Pod
kubectl delete pod qos-demo-2 --namespace=qos-example
建立一個被分配 BestEffort QoS 類的 Pod
要為 Pod 分配 BestEffort
QoS 類,Pod 中的容器不得有任何記憶體或 CPU 限制或請求。
這是一個包含一個容器的 Pod 的清單。該容器沒有記憶體或 CPU 限制或請求。
apiVersion: v1
kind: Pod
metadata:
name: qos-demo-3
namespace: qos-example
spec:
containers:
- name: qos-demo-3-ctr
image: nginx
建立 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-3.yaml --namespace=qos-example
檢視 Pod 的詳細資訊
kubectl get pod qos-demo-3 --namespace=qos-example --output=yaml
輸出顯示 Kubernetes 為 Pod 分配了 BestEffort
QoS 類。
spec:
containers:
...
resources: {}
...
status:
qosClass: BestEffort
清理
刪除你的 Pod
kubectl delete pod qos-demo-3 --namespace=qos-example
建立一個包含兩個容器的 Pod
這是一個包含兩個容器的 Pod 的清單。一個容器指定了 200 MiB 的記憶體請求。另一個容器沒有指定任何請求或限制。
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
請注意,此 Pod 符合 Burstable
QoS 類的標準。也就是說,它不符合 Guaranteed
QoS 類的標準,並且其一個容器具有記憶體請求。
建立 Pod
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-4.yaml --namespace=qos-example
檢視 Pod 的詳細資訊
kubectl get pod qos-demo-4 --namespace=qos-example --output=yaml
輸出顯示 Kubernetes 為 Pod 分配了 Burstable
QoS 類。
spec:
containers:
...
name: qos-demo-4-ctr-1
resources:
requests:
memory: 200Mi
...
name: qos-demo-4-ctr-2
resources: {}
...
status:
qosClass: Burstable
檢索 Pod 的 QoS 類
你可以只檢視所需的欄位,而不是檢視所有欄位
kubectl --namespace=qos-example get pod qos-demo-4 -o jsonpath='{ .status.qosClass}{"\n"}'
Burstable
清理
刪除你的名稱空間
kubectl delete namespace qos-example