建立及自訂節點集區

本頁面說明如何在 GKE on AWS 中建立節點集區,以及如何使用設定檔自訂節點設定。

如要建立節點集區,請提供下列資源:

如要透過 SSH 存取節點,可以建立 EC2 金鑰組

本文適用於想要設定、監控及管理雲端基礎架構的 IT 管理員和操作人員。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。

建立標準節點集區

這些資源可用後,您可以使用下列指令建立節點集區:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --instance-type INSTANCE_TYPE \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

更改下列內容:

  • NODE_POOL_NAME:您為節點集區選擇的名稱
  • CLUSTER_NAME:要將節點集區附加至的叢集名稱
  • :這個節點集區所需的 AWS 機器執行個體類型,例如 m5.largeINSTANCE_TYPE
  • ROOT_VOLUME_SIZE:每個節點根磁碟區的所需大小 (單位為 Gb)
  • NODEPOOL_PROFILE:節點集區 VM 的 IAM 執行個體設定檔。如要瞭解如何更新 IAM 執行個體設定檔,請參閱「更新 AWS IAM 執行個體設定檔」。
  • NODE_VERSION:要在節點集區中每個節點上安裝的 Kubernetes 版本 (例如 「1.31.6-gke.200」)
  • MIN_NODES:節點集區可包含的節點數量下限
  • MAX_NODES:節點集區可包含的節點數量上限
  • MAX_PODS_PER_NODE:集區中任何單一節點可建立的 Pod 數量上限
  • GOOGLE_CLOUD_LOCATION:管理這個節點集區的 Google Cloud位置名稱
  • NODEPOOL_SUBNET:節點集區將在其中執行的子網路 ID。
    • 叢集的 Pod/Service IP 範圍不得與節點集區子網路網路重疊。如要進一步瞭解如何為叢集選取 Pod 和 Service IP 範圍,請參閱「為叢集選取 CIDR 範圍」一文。
    • 如果這個子網路不在虛擬私有雲主要 CIDR 區塊內,則需要執行一些額外步驟。詳情請參閱安全性群組
  • SSH_KEY_PAIR_NAME:為 SSH 存取權建立的 AWS SSH 金鑰組名稱 (選用)
  • CONFIG_KMS_KEY_ARN:用於加密使用者資料的 AWS KMS 金鑰 Amazon Resource Name (ARN)

如果存在,--tags 參數會將指定標記套用至節點集區中的所有節點。這個範例會為集區中的所有節點加上標記,標記名稱為節點所屬的叢集和節點集區。

自訂節點系統設定

您可以使用各種方法自訂節點設定。舉例來說,您可以在建立節點集區時,指定 Pod 的 CPU 限制等參數。

您可以使用節點系統設定,在節點集區中為 Kubernetes 節點代理程式 (kubelet) 和低階 Linux 核心設定 (sysctl) 指定自訂設定。

設定 kubelet 代理程式

如要使用 kubelet 自訂節點設定,請使用 Google Cloud CLI 或 Terraform。

gcloud

建立節點集區時,您可以為 Kubernetes 節點代理程式 (kubelet) 指定自訂設定。舉例來說,如要將 kubelet 設定為使用靜態 CPU 管理政策,請執行下列指令:

  gcloud container aws node-pools create POOL_NAME \
       --cluster CLUSTER_NAME \
       --location=LOCATION \
       --kubelet_config_cpu_manager_policy=static

更改下列內容:

  • POOL_NAME:節點集區的名稱。
  • CLUSTER_NAME:要新增節點集區的叢集名稱。
  • LOCATION:叢集的運算可用區或區域。

如需可新增至上述指令的完整欄位清單,請參閱 Kubelet 設定選項

Terraform

如要進一步瞭解 AWS 環境中的 Terraform,請參閱 Terraform 節點集區參考資料

  1. variables.tf 檔案中加入下列區塊,設定 Terraform 變數:

    variable "node_pool_kubelet_config_cpu_manager" {
      default     = "none"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota" {
      default     = "true"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota_period" {
      default     = "100ms"
    }
    
    variable "node_pool_kubelet_config_pod_pids_limit" {
      default     = -1
    }
    
  2. 在 Terraform 設定中新增下列區塊:

    resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" {
     provider           = google
     cluster            = CLUSTER_NAME
     name               = POOL_NAME
     subnet_id          = SUBNET_ID
     version            = CLUSTER_VERSION
     location           = CLUSTER_LOCATION
    
     kubelet_config {
       cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager
       cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota
       cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period
       pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit
     }
    }
    

    更改下列內容:

    • NODE_POOL_RESOURCE_NAME:Terraform 範本中的節點集區資源名稱。
    • CLUSTER_NAME:現有叢集的名稱。
    • POOL_NAME:要自訂的節點集區名稱。
    • SUBNET_ID:指派給節點集區的子網路。
    • :GKE on AWS 叢集控制層和節點的版本。CLUSTER_VERSION
    • CLUSTER_LOCATION:叢集的 Compute Engine 區域或可用區

設定 sysctl 公用程式

如要使用 sysctl 自訂節點系統設定,請對 awsClusters.awsNodePools.create 方法發出 POST 請求。這項 POST 要求會建立具有指定自訂項目的節點集區。在下列範例中,busy_pollbusy_read 參數各設定為 5,000 微秒:

POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools

{
    "name": NODE_POOL_NAME,
    "version": CLUSTER_VERSION,
    "config": {
        "linuxNodeConfig": {
            "sysctls": {
                "net.core.busy_poll": "5000",
                "net.core.busy_read": "5000",
            }
        }
    }
}

更改下列內容:

  • ENDPOINT:您的 Google Cloud 服務端點
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • GOOGLE_CLOUD_LOCATION:叢集的Google Cloud 位置
  • CLUSTER_NAME:要新增節點集區的叢集名稱。
  • NODE_POOL_NAME:節點集區的名稱。
  • CLUSTER_VERSION:叢集的版本號碼,例如 1.31.0-gke.500。

如需可新增至上述 JSON 要求的鍵/值組合完整清單,請參閱「Sysctl 設定選項」。

kubelet 代理程式的設定選項

下表列出可修改的 kubelet 選項。

Kubelet 設定 限制 預設設定 說明
kubelet_config_cpu_manager_policy 值必須為 nonestatic "none" 這項設定會控管 kubelet 的 CPU 管理工具政策。預設值為 none,這是預設的 CPU 親和性配置,除了 OS 排程器自動執行的親和性之外,不會提供任何親和性。

將這個值設為 static,即可為 CPU 要求為整數的 Guaranteed QoS 類別 Pod 指派專屬 CPU。
kubelet_config_cpu_cfs_quota 值必須為 truefalse true 這項設定會強制執行 Pod 的 CPU 限制。將這個值設為 false,表示系統會忽略 Pod 的 CPU 限制。

在某些情況下,Pod 對 CPU 限制很敏感,因此忽略 CPU 限制可能較為理想。停用 cpuCFSQuota 的風險在於,惡意 Pod 可能會耗用超出預期的 CPU 資源。
kubelet_config_cpu_cfs_quota_period 值必須是時間長度 "100ms" 這項設定會設定 CPU CFS 配額週期值 cpu.cfs_period_us,指定 cgroup 存取 CPU 資源的重新分配週期。這個選項可讓您調整 CPU 節流行為。
kubelet_config_pod_pids_limit 值必須介於 1024 至 4194304 之間 -1 這項設定會為每個 Pod 設定可使用的程序 ID (PID) 數量上限。如果設為預設值,系統會根據基礎機器大小自動調整 PID 限制。

sysctl 公用程式的設定選項

如要調整系統效能,可以修改下列屬性:

Spot 執行個體節點集區

GKE on AWS 支援AWS Spot 執行個體節點集區,目前為預先發布版功能。Spot 執行個體節點集區是 Amazon EC2 Spot 執行個體集區,可在 AWS 上以較低的成本使用。

Spot 執行個體可為無狀態、容錯和彈性應用程式節省成本。不過,對於彈性不足、有狀態、無法容錯,或例項節點之間緊密耦合的工作負載,則不適合使用這些服務。當 EC2 需要回收容量時,Amazon EC2 可能會中斷 Spot Instance,因此 Spot Instance 的價格會受到 Spot Market 波動的影響。如果工作負載需要保證容量,且無法容忍偶爾無法使用的情況,請選擇標準節點集區,而非 Spot 執行個體節點集區。

在 AWS 上的 GKE 中採用的分配策略,著重於選取容量可用性最高的 Spot 執行個體集區,盡量降低中斷風險。對於中斷成本較高的工作負載 (例如圖片和媒體算繪或深度學習),這個方法特別實用。具體來說,我們已實作 capacityOptimized 分配策略,詳情請參閱「Spot 執行個體的分配策略」。

建立 Spot 節點集區

如要建立 Spot 執行個體節點集區,請執行下列指令:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --spot-instance-types INSTANCE_TYPE_LIST \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

更改下列內容:

  • NODE_POOL_NAME:您要指派給這個節點集區的名稱。
  • CLUSTER_NAME:要將這個節點集區附加至的叢集名稱。
  • INSTANCE_TYPE_LIST:以半形逗號分隔的 AWS EC2 執行個體類型清單。節點集區會使用這些執行個體類型佈建 Spot 執行個體。執行個體類型必須具有相同的 CPU 架構、CPU 數量和記憶體大小。例如:「c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium」。您可以使用 Amazon EC2 執行個體選取器工具,找出具有相同 CPU 和記憶體設定的執行個體類型。
  • ROOT_VOLUME_SIZE:每個節點根磁碟區的所需大小 (單位為 Gb)
  • NODEPOOL_PROFILE:節點集區 VM 的 IAM 執行個體設定檔
  • NODE_VERSION:要在節點集區中每個節點上安裝的 Kubernetes 版本 (例如 「1.31.6-gke.200」)
  • MIN_NODES:節點集區可包含的節點數量下限
  • MAX_NODES:節點集區可包含的節點數量上限
  • MAX_PODS_PER_NODE:集區中任何單一節點可建立的 Pod 數量上限
  • GOOGLE_CLOUD_LOCATION:管理這個節點集區的 Google Cloud位置名稱
  • NODEPOOL_SUBNET:節點集區將在其中執行的子網路 ID。
    • 叢集的 Pod/Service IP 範圍不得與節點集區子網路網路重疊。如要進一步瞭解如何為叢集選取 Pod 和 Service IP 範圍,請參閱「為叢集選取 CIDR 範圍」一文。
    • 如果這個子網路不在虛擬私有雲主要 CIDR 區塊內,則需要執行一些額外步驟。詳情請參閱安全性群組
  • SSH_KEY_PAIR_NAME:為 SSH 存取權建立的 AWS SSH 金鑰組名稱 (選用)
  • CONFIG_KMS_KEY_ARN:用於加密使用者資料的 AWS KMS 金鑰 Amazon Resource Name (ARN)

最佳做法是在 INSTANCE_TYPE_LIST 欄位中列出多個執行個體類型。這項最佳做法非常重要,因為如果節點集區只設定單一執行個體類型,且該執行個體類型在任何所需可用區中都無法使用,節點集區就無法佈建任何新節點。這可能會影響應用程式的可用性,並導致服務中斷。

請注意,spot-instance-types 欄位與 instance-type 欄位互斥。也就是說,您只能提供其中一個欄位,不能同時提供兩個欄位。