使用 taint 和容許條件控制排程

本頁面提供 Google Distributed Cloud 的汙點和容許度總覽。當您排定工作負載以部署在叢集上時,節點 taint 可協助您控制工作負載能在哪些節點上執行。

總覽

將工作負載提交至叢集執行時,排程器會決定要將與工作負載相關聯的 Pod 放置在何處。排程器可將 Pod 放置在任何滿足 Pod CPU、記憶體和自訂資源需求的節點上。

如果您的叢集會執行各種工作負載,您可能會想要控制哪些工作負載可在特定的節點集區執行。

節點 taint 可讓您標示節點,避免或禁止排程器在特定 Pod 使用此節點。您可以使用互補功能「容許條件」,指定可在「taint」節點上使用的 Pod。

taint 和容許條件會搭配運作,確保 Pod 不會排程到不合適的節點上。

汙點是與「效果」相關聯的「鍵/值組合」。下表列出可用的效果:

效果 說明
NoSchedule 系統不會把無法容許此 taint 的 Pod 排程到節點上,也不會將現有的 Pod 自節點中移除。
PreferNoSchedule Kubernetes 會避免將無法容許此 taint 的 Pod 排程到節點上。
NoExecute 如果 Pod 已在節點運作,就會從節點中剔除;如果尚未在節點運作,則不會排定於節點運作。

在 Google Distributed Cloud 中設定節點汙點的優點

雖然您可以使用 kubectl taint 指令設定節點汙點,但使用 gkectl 或 Google Cloud 主控台設定節點汙點,相較於 kubectl 具有下列優點:

  • 重新啟動或替換節點時,系統會保留 taint。
  • 節點新增至節點集區時,系統會自動建立汙點。
  • 使用 gkectl 新增汙點時,系統會在叢集自動調度資源期間自動建立汙點。(目前無法為在Google Cloud 控制台中建立的節點集區啟用自動調度資源功能)。

設定節點 taint

您可以在建立使用者叢集時,或在叢集建立後,設定節點集區中的節點汙染。本節說明如何將汙點新增至已建立的叢集,但建立新叢集時的程序類似。

您可以新增節點集區並設定汙點,也可以更新現有節點集區並設定汙點。新增其他節點集區前,請先確認叢集有足夠的可用 IP 位址

如果您在 Google Cloud 控制台中建立叢集,可以使用Google Cloud 控制台新增或更新節點集區。

在新節點集區中設定汙點

控制台

  1. 在控制台中,前往「Google Kubernetes Engine clusters overview」(Google Kubernetes Engine 叢集總覽) 頁面。

    前往 GKE 叢集

  2. 選取使用者叢集所在的 Google Cloud 專案。

  3. 在叢集清單中,按一下叢集名稱,然後按一下「詳細資料」面板中的「查看詳細資料」

  4. 按一下 「Add node pool」(新增節點集區)

  5. 設定節點集區:

    1. 輸入「節點集區名稱」
    2. 輸入集區中每個節點的 vCPUs 數量 (每個使用者叢集工作站至少須有 4 個)。
    3. 輸入集區中每個節點的記憶體大小 (以 MiB 為單位,每個使用者叢集工作站節點至少須有 8192 MiB,且必須為 4 的倍數)。
    4. 在「副本」欄位中,輸入集區中的節點數量 (最少 3 個)。
    5. 選取「OS image type」(作業系統映像檔類型):Ubuntu ContainerdCOS

    6. 以 GiB 為單位輸入開機磁碟大小 (預設為 40 GiB)。

  6. 在「節點集區中繼資料 (選用)」部分,按一下「+ 新增 Taint」。 輸入汙染的「鍵」、「值」和「效果」。視需要重複執行這個步驟。

  7. (選用) 按一下「+ Add Kubernetes Labels」(新增 Kubernetes 標籤)。輸入標籤的「Key」(鍵) 和「Value」(值)。視需要重複上述步驟。

  8. 點選「建立」

  9. Google Cloud 控制台會顯示「叢集狀態:變更進度」。按一下「顯示詳細資料」,即可查看資源狀態條件狀態訊息

指令列

  1. 使用者叢集設定檔中,填寫nodePools部分。

    您必須指定下列欄位:

    • nodePools.[i].name
    • nodePools[i].cpus
    • nodePools.[i].memoryMB
    • nodePools.[i].replicas

    以下欄位為選填項目。如未加入 nodePools[i].bootDiskSizeGBnodePools[i].osImageType, 系統會使用預設值。

  2. 填寫「nodePools[i].taints」部分。例如:

    nodePools:
    - name: "my-node-pool"
      taints:
      - key: "staging"
        value: "true"
        effect: "NoSchedule"
    
  3. 視需要填寫下列部分:

    • nodePools[i].labels
    • nodePools[i].bootDiskSizeGB
    • nodePools[i].osImageType
    • nodePools[i].vsphere.datastore
    • nodePools[i].vsphere.tags
  4. 執行下列指令:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    更改下列內容:

    • [ADMIN_CLUSTER_KUBECONFIG],並提供管理員叢集的 kubeconfig 檔案路徑。

    • [USER_CLUSTER_CONFIG],並提供使用者叢集設定檔的路徑。

在現有節點集區中設定汙點

控制台

  1. 在控制台中,前往「Google Kubernetes Engine clusters overview」(Google Kubernetes Engine 叢集總覽) 頁面。

    前往 GKE 叢集

  2. 選取使用者叢集所在的 Google Cloud 專案。

  3. 在叢集清單中,按一下叢集名稱,然後按一下「詳細資料」面板中的「查看詳細資料」

  4. 按一下「Nodes」(節點) 分頁標籤。

  5. 按一下要修改的節點集區名稱。

  6. 按一下「節點集區中繼資料 (選用)」部分旁的「編輯」,然後按一下「+ 新增汙點」。 輸入汙染的「鍵」、「值」和「效果」。視需要重複執行這個步驟。

  7. 按一下 [完成]

  8. 按一下 即可返回上一頁。

  9. Google Cloud 控制台會顯示「叢集狀態:變更進度」。按一下「顯示詳細資料」,即可查看資源狀態條件狀態訊息

指令列

  1. 使用者叢集設定檔中,前往要更新的節點集區的 nodePools 區段。

  2. 填入 nodePools[i].taints 例如:

    nodePools:
    - name: "my-node-pool"
      taints:
      - key: "staging"
        value: "true"
        effect: "NoSchedule"
    
  3. 執行下列指令:

    gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
    

    更改下列內容:

    • [ADMIN_CLUSTER_KUBECONFIG],並提供管理員叢集的 kubeconfig 檔案路徑。

    • [USER_CLUSTER_CONFIG],並提供使用者叢集設定檔的路徑。

設定 Pod 容許汙點

您可以在 Pod 的規格中加入 tolerations 欄位,將 Pod 設定為容許汙點。在下列範例中,Pod 可排入具有 dedicated=experimental:NoSchedule 汙染的節點:

tolerations:
- key: dedicated
  operator: Equal
  value: experimental
  effect: NoSchedule

如需其他範例,請參閱「Taints and Tolerations」。