為 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

清理

刪除您的 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

接下來

給應用程式開發人員

給叢集管理員

上次修改時間:2023 年 8 月 24 日下午 6:38 PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)