本頁面說明如何在 GKE on AWS 中建立節點集區,以及如何使用設定檔自訂節點設定。
如要建立節點集區,請提供下列資源:
- 要建立節點集區的現有 AWS 叢集名稱
- 節點集區 VM 的 IAM 執行個體設定檔
- 節點集區 VM 執行的子網路
如要透過 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.large
INSTANCE_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 節點集區參考資料。
在
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 }
在 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_poll
和 busy_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 |
值必須為 none 或 static
|
"none"
|
這項設定會控管 kubelet 的 CPU 管理工具政策。預設值為 none ,這是預設的 CPU 親和性配置,除了 OS 排程器自動執行的親和性之外,不會提供任何親和性。將這個值設為 static ,即可為 CPU 要求為整數的 Guaranteed QoS 類別 Pod 指派專屬 CPU。 |
kubelet_config_cpu_cfs_quota |
值必須為 true 或 false
|
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
公用程式的設定選項
如要調整系統效能,可以修改下列屬性:
net.core.busy_poll
net.core.busy_read
net.core.netdev_max_backlog
net.core.rmem_max
net.core.wmem_default
net.core.wmem_max
net.core.optmem_max
net.core.somaxconn
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.tcp_tw_reuse
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.default.disable_ipv6
vm.max_map_count
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
欄位互斥。也就是說,您只能提供其中一個欄位,不能同時提供兩個欄位。