默认情况下将计算类应用于 Pod


本页面介绍了如何默认将计算类应用于未明确选择计算类的 Google Kubernetes Engine (GKE) Pod。本页面介绍了如何将计算类设置为命名空间和整个集群的默认计算类。这些说明适用于希望减少因单个工作负载和节点配置而导致的手动开销的集群管理员。

在阅读本页面之前,请先熟悉自定义计算类

默认计算类简介

您可以将 GKE 集群或特定命名空间配置为具有默认计算类。您配置的默认类适用于相应集群或命名空间中未选择其他计算类的任何 Pod。当您部署未选择计算类的 Pod 时,GKE 会按以下顺序应用默认计算类:

  1. 如果命名空间具有默认计算类,GKE 会修改 Pod 规范以选择该计算类。
  2. 如果命名空间没有默认计算类,则应用集群级默认类。GKE 不会修改 Pod 规范。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 拥有一个 GKE Autopilot 或 Standard 集群,该集群运行的版本支持在集群级层或命名空间级层设置默认计算类。如需了解详情,请参阅要求部分。

    对于 Standard 集群,请启用节点自动预配集群自动扩缩器

  • 如果您想将自定义计算类设置为命名空间的默认计算类,请部署自定义计算类

要求

  • 如需将计算类设置为集群级默认值,集群必须运行 GKE 1.33.1-gke.1744000 版或更高版本。
  • 如需将计算类设置为仅适用于非 DaemonSet Pod 的命名空间级默认值,集群必须运行 GKE 1.33.1-gke.1788000 版或更高版本。

所需的角色和权限

如需获得配置集群级或命名空间级默认计算类所需的权限,请让管理员向您授予 Google Cloud 项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含配置集群级或命名空间级默认计算类所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需配置集群级或命名空间级默认计算类,您需要拥有以下权限:

  • 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 就可以扩缩该节点池。不过,您无需进行此手动配置即可使用默认的集群级计算类。

  1. 如需为集群启用设置集群级默认计算类的功能,请运行带有 --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 集群时指定此标志。

  2. 保存以下清单,该清单定义了一个名为 defaultComputeClass

    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 计算类。

  3. 将清单应用到您的集群:

    kubectl apply -f PATH_TO_MANIFEST
    

    PATH_TO_MANIFEST 替换为计算类的清单的路径。

设置集群级默认计算类后,GKE 会扩缩满足以下两个要求的节点池:

  • 节点配置与 default 计算类的配置相同。
  • 节点池没有适用于其他计算类的污点或标签。 GKE 可以扩缩具有 default 计算类污点和标签的节点池。

例如,如果 default 计算类指定了 N4 机器系列,则 GKE 可以扩缩使用 N4 实例且没有其他计算类污点或标签的现有节点池。

验证默认计算类行为

如需检查您为命名空间或集群设置的默认计算类是否按预期工作,请执行以下操作:

  1. 请查看以下 Deployment 示例:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
          tier: web
      template:
        metadata:
          labels:
            app: hello
            tier: web
        spec:
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: 200m

    此部署未明确请求计算类。

  2. 创建 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。

  3. 确定运行示例 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>
    
  4. 获取节点标签:

    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
    

后续步骤