本页面介绍如何在 GKE on AWS 中创建节点池,以及如何使用配置文件自定义节点配置。
如需创建节点池,您必须提供以下资源:
- 要在其中创建节点池的现有 AWS 集群的名称
- 适用于节点池虚拟机的 IAM 实例配置文件
- 将在其中运行节点池虚拟机的子网
如果您希望通过 SSH 访问节点,则可以创建 EC2 密钥对。
本页面适用于想要设置、监控和管理云基础设施的 IT 管理员和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
创建标准节点池
这些资源可用后,您可以使用以下命令创建节点池:
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
:要将节点池连接到的集群的名称INSTANCE_TYPE
:此节点池所需的 AWS 机器实例类型,例如m5.large
ROOT_VOLUME_SIZE
:每个节点的根卷的所需大小(以 GB 为单位)NODEPOOL_PROFILE
:适用于节点池虚拟机的 IAM 实例配置文件。如需详细了解如何更新 IAM 实例配置文件,请参阅更新 AWS IAM 实例配置文件。NODE_VERSION
:要在节点池中的每个节点上安装的 Kubernetes 版本(例如,"1.32.4-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 范围
- 如果此子网位于 VPC 主要 CIDR 块之外,则需要执行一些额外的步骤。如需了解详情,请参阅安全群组。
SSH_KEY_PAIR_NAME
:为 SSH 访问创建的 AWS SSH 密钥对的名称(可选)CONFIG_KMS_KEY_ARN
:对用户数据进行加密的 AWS KMS 密钥的 Amazon 资源名称 (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
:分配给节点池的子网。CLUSTER_VERSION
:GKE on AWS 集群控制平面和节点的版本。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 关联方案,除了操作系统调度工具自动提供之外,没有其他关联性。将该值设置为 static 可允许将具有整数 CPU 请求的保证 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 实例节点池是 AWS 上提供的费用更低的 Amazon EC2 Spot 实例池。
Spot 实例可以为灵活、无状态的容错型应用节省费用。但是,它们不适合不灵活、有状态的非容错型工作负载,也不适合在实例节点之间紧密耦合的工作负载。当 EC2 需要要回容量时,Spot 实例可能会被 Amazon EC2 中断,因此它们受 Spot 市场中波动的影响。如果您的工作负载需要保证容量,并且不能容忍偶尔的不可用,请选择标准节点池而不是 Spot 实例节点池。
GKE on AWS 中采用的分配策略侧重于选择容量可用性最高的 Spot 实例池,从而最大限度地降低中断风险。此方法对于中断费用较高的工作负载(例如图片和媒体渲染或深度学习)特别有益。具体而言,实现了 Spot 实例的分配策略中所述的 capacityOptimized
分配策略。
创建 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
:适用于节点池虚拟机的 IAM 实例配置文件NODE_VERSION
:要在节点池中的每个节点上安装的 Kubernetes 版本(例如,"1.32.4-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 范围
- 如果此子网位于 VPC 主要 CIDR 块之外,则需要执行一些额外的步骤。如需了解详情,请参阅安全群组。
SSH_KEY_PAIR_NAME
:为 SSH 访问创建的 AWS SSH 密钥对的名称(可选)CONFIG_KMS_KEY_ARN
:对用户数据进行加密的 AWS KMS 密钥的 Amazon 资源名称 (ARN)
最佳实践是在 INSTANCE_TYPE_LIST 字段中列出多个实例类型。此最佳实践非常重要,因为如果节点池仅配置了一个实例类型,并且该实例类型在所需的所有可用区中不可用,则节点池无法预配任何新节点。这会影响应用的可用性,并可能导致服务中断。
请注意,spot-instance-types
字段与 instance-type
字段互斥。这意味着您只能提供其中一个字段,不能同时提供两者。