本页面介绍了如何默认将计算类应用于未明确选择计算类的 Google Kubernetes Engine (GKE) Pod。本页面介绍了如何将计算类设置为命名空间和整个集群的默认计算类。这些说明适用于希望减少因单个工作负载和节点配置而导致的手动开销的集群管理员。
在阅读本页面之前,请先熟悉自定义计算类。
默认计算类简介
您可以将 GKE 集群或特定命名空间配置为具有默认计算类。您配置的默认类适用于相应集群或命名空间中未选择其他计算类的任何 Pod。当您部署未选择计算类的 Pod 时,GKE 会按以下顺序应用默认计算类:
- 如果命名空间具有默认计算类,GKE 会修改 Pod 规范以选择该计算类。
- 如果命名空间没有默认计算类,则应用集群级默认类。GKE 不会修改 Pod 规范。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
拥有一个 GKE Autopilot 或 Standard 集群,该集群运行的版本支持在集群级层或命名空间级层设置默认计算类。如需了解详情,请参阅要求部分。
如果您想将自定义计算类设置为命名空间的默认计算类,请部署自定义计算类。
要求
- 如需将计算类设置为集群级默认值,集群必须运行 GKE 1.33.1-gke.1744000 版或更高版本。
- 如需将计算类设置为仅适用于非 DaemonSet Pod 的命名空间级默认值,集群必须运行 GKE 1.33.1-gke.1788000 版或更高版本。
所需的角色和权限
如需获得配置集群级或命名空间级默认计算类所需的权限,请让管理员向您授予 Google Cloud 项目的以下 IAM 角色:
-
Kubernetes Engine Developer (
roles/container.developer
) -
更新集群级默认计算类:
Kubernetes Engine Cluster Admin (
roles/container.clusterAdmin
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含配置集群级或命名空间级默认计算类所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需配置集群级或命名空间级默认计算类,您需要拥有以下权限:
-
container.customResourceDefinitions.create
-
container.customResourceDefinitions.update
-
container.customResourceDefinitions.get
-
container.customResourceDefinitions.list
-
container.namespaces.get
-
container.namespaces.list
-
container.pods.get
-
container.nodes.get
-
container.nodes.list
-
container.deployments.create
-
container.deployments.get
-
向命名空间添加标签:
container.namespaces.update
-
启用集群级默认计算类:
container.clusters.update
为命名空间配置默认计算类
您可以使用计算类的名称为集群中的任何 Kubernetes 命名空间添加注释,以将其用作默认计算类。如果部署到该命名空间的 Pod 尚未选择计算类,GKE 会修改 Pod 规范以选择该命名空间中的默认类。您可以将任何自定义或内置计算类设置为默认计算类。
如需默认将计算类应用于命名空间中的所有 Pod,请向该命名空间添加
cloud.google.com/default-compute-class
标签:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class=COMPUTECLASS_NAME
替换以下内容:
NAMESPACE_NAME
:要更新的命名空间的名称。COMPUTECLASS_NAME
:要设置为命名空间的默认计算类的名称。
如果命令失败并显示以下错误消息,则表示相应命名空间已具有默认计算类:
error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is false
如需解决此错误,请更新命名空间的默认计算类。
如需默认将计算类应用于命名空间中的所有非 DaemonSet Pod,请向该命名空间添加
cloud.google.com/default-compute-class-non-daemonset
标签:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME
如果命令失败并显示以下错误消息,则表示相应命名空间已为非 DaemonSet Pod 设置默认计算类:
error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is false
如需解决此错误,请更新命名空间的默认计算类。
更新命名空间中的现有默认计算类
如需覆盖命名空间的现有默认计算类,请运行以下命令之一:
更新命名空间中所有 Pod 的默认计算类:
kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class=COMPUTECLASS_NAME \ --overwrite
替换以下内容:
NAMESPACE_NAME
:要更新的命名空间的名称。COMPUTECLASS_NAME
:要设置为命名空间的新默认值的计算类的名称。
覆盖命名空间中非 DaemonSet Pod 的默认计算类:
kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \ --overwrite
为集群配置默认计算类
本部分介绍如何将某个计算类设置为集群的默认计算类。对于集群级默认计算类,请勿为集群中的现有节点池手动指定节点污点和节点标签。GKE 不会扩缩具有计算类节点污点的节点池。如果您手动为 default
计算类添加标签,GKE 就可以扩缩该节点池。不过,您无需进行此手动配置即可使用默认的集群级计算类。
如需为集群启用设置集群级默认计算类的功能,请运行带有
--enable-default-compute-class
标志的gcloud container clusters update
命令:gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-default-compute-class
替换以下内容:
CLUSTER_NAME
:您的集群的名称。CONTROL_PLANE_LOCATION
:集群控制平面的位置,例如us-central1
。
您还可以在创建 Autopilot 或 Standard 集群时指定此标志。
保存以下清单,该清单定义了一个名为
default
的ComputeClass
:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: default spec: priorities: - machineFamily: n4 - machineFamily: n2 whenUnsatisfiable: ScaleUpAnyway nodePoolAutoCreation: enabled: true
此示例清单请求使用 N4 实例的节点。如果 N4 实例不可用,计算类会改为请求 N2 实例。您可以使用 ComputeClass CustomResourceDefinition 中的任何可用字段来配置
default
计算类。将清单应用到您的集群:
kubectl apply -f PATH_TO_MANIFEST
将
PATH_TO_MANIFEST
替换为计算类的清单的路径。
设置集群级默认计算类后,GKE 会扩缩满足以下两个要求的节点池:
- 节点配置与
default
计算类的配置相同。 - 节点池没有适用于其他计算类的污点或标签。
GKE 可以扩缩具有
default
计算类污点和标签的节点池。
例如,如果 default
计算类指定了 N4 机器系列,则 GKE 可以扩缩使用 N4 实例且没有其他计算类污点或标签的现有节点池。
验证默认计算类行为
如需检查您为命名空间或集群设置的默认计算类是否按预期工作,请执行以下操作:
请查看以下 Deployment 示例:
此部署未明确请求计算类。
创建 Deployment:
kubectl apply --namespace=NAMESPACE_NAME \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/refs/heads/main/quickstarts/hello-app/manifests/helloweb-deployment.yaml
根据您要验证的内容,将
NAMESPACE_NAME
替换为以下项之一:- 具有默认计算类的命名空间的名称。
- 没有默认计算类的命名空间的名称。
GKE 可能需要一些时间来创建新节点以运行 Pod。
确定运行示例 Deployment 中 Pod 的节点:
kubectl get pods --namespace=NAMESPACE_NAME \ --selector=app=hello -o=wide
输出类似于以下内容:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES helloweb-7795fbf856-58n5l 1/1 Running 0 9m21s 10.52.2.3 gke-cluster-1-nap-n2-highcpu-2-3muqi8-f213e529-rx7d <none> <none>
获取节点标签:
kubectl get node NODE_NAME --show-labels \ | grep "cloud.google.com/compute-class"
将
NODE_NAME
替换为上一步输出中的节点名称。输出类似于以下内容:
NODE_NAME Ready <none> 22m v1.32.4-gke.1236007 # lines are omitted from this output cloud.google.com/compute-class=COMPUTECLASS_NAME,cloud.google.com/gke-boot-disk=pd-balanced,cloud.google.com/gke-container-runtime=containerd
COMPUTECLASS_NAME
中的值可以是以下各项之一:- 集群级默认计算类:
default
,适用于由 GKE Autopilot 或节点自动预配创建的节点。现有手动创建的节点池中的节点可能没有cloud.google.com/compute-class
标签。 - 命名空间级默认计算类:配置为命名空间默认计算类的计算类的名称。
- 集群级默认计算类:
停用默认计算类
如需在命名空间或集群中停用默认计算类,请执行以下任一操作:
如需为所有 Pod 停用命名空间级默认计算类,请从命名空间中移除
cloud.google.com/default-compute-class
标签:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-
标签键末尾的
-
字符会从 Kubernetes API 中的Namespace
对象中移除具有该键的所有标签。如需为非 DaemonSet Pod 停用命名空间级默认计算类,请从命名空间中移除
cloud.google.com/default-compute-class-non-daemonset
标签:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset-
如需停用集群级默认计算类,请使用带有
--no-enable-default-compute-class
标志的gcloud container clusters update
命令:gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --no-enable-default-compute-class
后续步骤
- 详细了解 GKE 中的自定义计算类。