為 Pod 設定服務品質
此頁面說明如何設定 Pod,使其被指派特定的服務品質 (QoS) 類別。Kubernetes 使用 QoS 類別來決定在節點資源超出時驅逐 Pod。
當 Kubernetes 建立 Pod 時,它會將以下 QoS 類別之一指派給 Pod
準備開始
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個非作為控制平面主機的節點的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 練習場之一
您還需要能夠建立和刪除命名空間。
建立命名空間
建立命名空間,以便將您在此練習中建立的資源與叢集的其餘部分隔離。
kubectl create namespace qos-example
建立一個被指派為「保證」QoS 類別的 Pod
為了讓 Pod 被賦予 保證
的 QoS 類別
- 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 的 QoS 類別為 Guaranteed
。輸出結果也驗證了 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
建立一個被指派 QoS 類別為 Burstable 的 Pod
如果 Pod 符合以下條件,則會被賦予 Burstable
的 QoS 類別:
- Pod 不符合
Guaranteed
QoS 類別的標準。 - Pod 中至少有一個容器具有記憶體或 CPU 請求或限制。
這是一個 Pod 的 manifest 檔案範例,其中包含一個容器。該容器的記憶體限制為 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 的 QoS 類別為 Burstable
。
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
建立一個被指派 QoS 類別為 BestEffort 的 Pod
若要讓 Pod 被賦予 BestEffort
的 QoS 類別,Pod 中的容器必須沒有任何記憶體或 CPU 限制或請求。
這是一個 Pod 的 manifest 檔案範例,其中包含一個容器。該容器沒有任何記憶體或 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 的 QoS 類別為 BestEffort
。
spec:
containers:
...
resources: {}
...
status:
qosClass: BestEffort
清理
刪除您的 Pod
kubectl delete pod qos-demo-3 --namespace=qos-example
建立一個具有兩個容器的 Pod
這是一個 Pod 的 manifest 檔案範例,其中包含兩個容器。其中一個容器指定了 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 的 QoS 類別為 Burstable
。
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