配置 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

清理

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

下一步

致應用開發者

致叢集管理員

最後修改於 2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 簡碼代替 code 簡碼 (e8b136c3b3)