维护 Kubernetes 集群

借助 Google Distributed Cloud (GDC) 网闸隔离配置,您可以在创建 Kubernetes 集群后使用 GKE on GDC 对其进行管理。借助此服务,您可以通过以下工作流来适应不断变化的容器工作负载要求,并维护现有集群节点:

本文档适用于平台管理员群组中负责管理跨多个项目的集群中托管的容器工作负载的 IT 管理员,以及应用运维人员群组中负责在单个项目中创建应用工作负载的开发者。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

准备工作

如需完成本文档中的任务,您必须请求必要的权限并准备环境。

申请 IAM 角色

您必须拥有特定角色,才能获得维护 Kubernetes 集群所需的权限。您所需的角色取决于您是在组织级共享集群还是项目级标准集群中工作。如需了解详情,请参阅 Kubernetes 集群配置。

共享集群角色

如需查看和维护共享 Kubernetes 集群及其资源,请让您的 IAM 组织管理员根据要执行的任务向您授予以下角色:

  • Project Creator (project-creator):创建或查看项目资源。 需要此角色才能将共享集群附加到项目。

  • Project Editor (project-editor):删除、更新或查看项目资源。如需从项目中分离共享集群,必须拥有此角色。

  • User Cluster Viewer (user-cluster-viewer):查看共享集群及其资源。此角色提供对管理 API 服务器中托管的共享集群的管理平面 API 的访问权限。

这些角色未绑定到项目命名空间。

标准集群角色

如需查看标准 Kubernetes 集群及其资源,请让您的 IAM 项目管理员为您授予 Standard Cluster Viewer (standard-cluster-viewer) 角色。此角色提供对管理 API 服务器中托管的标准集群的管理平面 API 的访问权限。

此角色会绑定到您的项目命名空间。

准备环境

如需使用 API 对 Kubernetes 集群运行命令,请确保您拥有以下资源:

  • 找到 Kubernetes 集群名称,或向平台管理员群组的成员询问集群名称。

  • 在这些说明中,请使用 Kubernetes 集群名称替换 CLUSTER_NAME。

  • 登录并生成管理 API 服务器的 kubeconfig 文件。

  • 在这些说明中,请使用 Management API 服务器的 kubeconfig 路径替换 MANAGEMENT_API_SERVER。

在项目层次结构中移动集群

项目提供服务实例的逻辑分组。您可以在 GDC 项目层次结构中添加和移除共享 Kubernetes 集群,以便对服务进行适当分组。您无法在项目层次结构中移动标准集群,因为它们仅限定于单个项目。

将项目关联到共享集群

从 GDC 控制台创建共享集群时,您必须至少附加一个项目,然后才能成功将容器工作负载部署到该集群。如果您必须向现有集群添加其他项目,请完成以下步骤:

控制台

  1. 在导航菜单中,依次选择 Kubernetes Engine > 集群。
  2. 在集群列表中,点击集群名称以打开集群详情页面。
  3. 选择附加项目。
  4. 在可用项目列表中,点击要附加到集群的项目名称。
  5. 点击保存。

API

  • 为集群创建新的 ProjectBinding 自定义资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
    apiVersion: resourcemanager.gdc.goog/v1
    kind: ProjectBinding
    metadata:
      name: CLUSTER_NAME-PROJECT_NAME
      namespace: platform
      labels:
        resourcemanager.gdc.goog/projectbinding-for-user-project: "true"
    spec:
      clusterRef:
       name: CLUSTER_NAME
      selector:
        nameSelector:
          matchNames:
          - PROJECT_NAME
    EOF
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • CLUSTER_NAME:集群的名称。
    • PROJECT_NAME:要将集群绑定到的项目的名称。每个 ProjectBinding 资源只能映射到一个集群。如果项目需要访问多个集群,则必须为每个集群创建一个唯一的 ProjectBinding。

Terraform

  1. 在 Terraform 配置文件中,插入以下代码段以创建 ProjectBinding 自定义资源:

    provider "kubernetes" {
      config_path = "MANAGEMENT_API_SERVER"
    }
    
    resource "kubernetes_manifest" "PROJECT_BINDING_RESOURCE_NAME" {
      manifest = {
        "apiVersion" = "resourcemanager.gdc.goog/v1"
        "kind" = "ProjectBinding"
        "metadata" = {
          "name" = "CLUSTER_NAME-PROJECT_NAME"
          "namespace" = "platform"
          "labels" = {
            "resourcemanager.gdc.goog/projectbinding-for-user-project" = "true"
          }
        }
        "spec" = {
          "clusterRef" = {
            "name" = "CLUSTER_NAME"
          }
          "selector" = {
            "nameSelector" = {
              "matchNames" = [
                "PROJECT_NAME",
              ]
            }
          }
        }
      }
    }
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • PROJECT_BINDING_RESOURCE_NAME:项目绑定的 Terraform 资源名称,例如 CLUSTER_NAME-PROJECT_NAME-binding。Terraform 使用此名称来标识您的项目绑定,GDC 不会使用此名称。
    • CLUSTER_NAME:集群的名称。每个 ProjectBinding 资源只能映射到一个集群。如果项目需要访问多个集群,则必须为每个集群创建一个唯一的 ProjectBinding。
    • PROJECT_NAME:要绑定到的项目的名称。每个 ProjectBinding 资源只能映射到一个集群。如果项目需要访问多个集群,则必须为每个集群创建一个唯一的 ProjectBinding。
  2. 应用新的项目绑定:

    terraform apply
    

从共享集群中分离项目

将项目与共享集群分离可能会带来重大变化,例如删除在集群中运行的工作负载。在将项目与共享集群分离之前,请务必了解其后果。

如需从现有共享集群中分离项目,请完成以下步骤:

控制台

  1. 在导航菜单中,依次选择 Kubernetes Engine > 集群。
  2. 在集群列表中点击相应集群,打开集群详情页面。
  3. 点击要从集群中分离的项目的 分离。

API

  • 删除关联项目和集群的 ProjectBinding 资源:

    kubectl --kubeconfig MANAGEMENT_API_SERVER delete projectbinding \
        CLUSTER_NAME-PROJECT_NAME -n platform
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • CLUSTER_NAME:集群的名称。
    • PROJECT_NAME:要与集群分离的项目的名称。

Terraform

  • 删除项目绑定资源:

    terraform destroy -target kubernetes_manifest.PROJECT_BINDING_RESOURCE_NAME
    

    将 PROJECT_BINDING_RESOURCE_NAME 替换为要删除的项目绑定的 Terraform 资源名称,例如 CLUSTER_NAME-PROJECT_NAME-binding。Terraform 使用此名称来标识您的项目绑定,GDC 不会使用此名称。

查看项目或组织中的所有集群

您可以查看项目或组织中所有可用的 Kubernetes 集群,包括其状态、Kubernetes 版本和其他详细信息。

由于 Kubernetes 集群是可用区级资源,因此您只能按可用区列出集群。

控制台

  1. 在项目选择器中,选择您的项目或组织。

    标准集群属于项目级范围,共享集群属于组织级范围。选择正确的范围以查看适当的 Kubernetes 集群类型。

  2. 在导航菜单中,依次选择 Kubernetes Engine > 集群。

    系统会显示组织中所有可用的共享集群及其状态和其他信息:

    “集群详情”页面,其中显示了组织中每个共享集群的状态和其他信息。

gdcloud

  • 列出该可用区中可用的 Kubernetes 集群:

    gdcloud clusters list
    

    输出类似于以下内容:

    CLUSTERREF.NAME   READINESS.STATE   TYPE   CURRENTVERSION.USERCLUSTERVERSION     CURRENTVERSION.SUPPORT.STATUS
    user-vm-1         Ready             user   1.15.0-gdch.394225-1.28.15-gke.1200   In Support
    user-vm-2         Ready             user   1.15.0-gdch.394225-1.29.12-gke.800    In Support
    

API

  • 列出该可用区中可用的 Kubernetes 集群:

    kubectl get clusters.cluster.gdc.goog -n KUBERNETES_CLUSTER_NAMESPACE \
        --kubeconfig MANAGEMENT_API_SERVER
    

    替换以下内容:

    • MANAGEMENT_API_SERVER:可用区级 API 服务器的 kubeconfig 路径。
    • KUBERNETES_CLUSTER_NAMESPACE:集群的命名空间。对于共享集群,请使用 platform 命名空间。对于标准集群,请使用集群的项目命名空间。

    输出类似于以下内容:

    NAME        STATE     K8S VERSION
    user-vm-1   Running   1.25.10-gke.2100
    user-test   Running   1.26.5-gke.2100
    

列出集群可用的 Kubernetes 版本

您可以列出 GDC 区域中可用的 Kubernetes 版本,以验证您可以在集群中访问的 Kubernetes 功能。

  • 列出可用区中可用的 Kubernetes 版本:

    kubectl get userclustermetadata.upgrade.private.gdc.goog \
        -o=custom-columns=K8S-VERSION:.spec.kubernetesVersion \
        --kubeconfig MANAGEMENT_API_SERVER
    

    将 MANAGEMENT_API_SERVER 替换为集群可用区级 API 服务器的 kubeconfig 文件。

    输出类似于以下内容:

    K8S-VERSION
    1.25.10-gke.2100
    1.26.5-gke.2100
    1.27.4-gke.500
    

查看可更新的属性

对于每个 Kubernetes 集群,都有一组属性可在创建后进行更改。您只能更改 Cluster 自定义资源的 spec 中的可变属性。在预配集群后,并非 spec 中的所有属性都可以更新。如需查看这些可更新的属性,请完成以下步骤:

控制台

  1. 在导航菜单中,依次选择 Kubernetes Engine > 集群。

  2. 在 Kubernetes 集群列表中,点击集群名称以查看其属性。

  3. 可修改的属性会显示 修改图标。

API

  • 查看 Cluster 规范的属性列表以及每个属性对应的有效值:

    kubectl explain clusters.cluster.gdc.goog.spec \
        --kubeconfig MANAGEMENT_API_SERVER
    

    将 MANAGEMENT_API_SERVER 替换为可用区级 API 服务器的 kubeconfig 路径。

    输出类似于以下内容:

    KIND:     Cluster
    VERSION:  cluster.gdc.goog/v1
    
    RESOURCE: spec <Object>
    
    DESCRIPTION:
        <empty>
    
    FIELDS:
      clusterNetwork    <Object>
        The cluster network configuration. If unset, the default configurations
        with pod and service CIDR sizes are used. Optional. Mutable.
    
      initialVersion    <Object>
        The GDC air-gapped version information of the user cluster during cluster creation.
        Optional. Default to use the latest applicable version. Immutable.
    
      loadBalancer  <Object>
        The load balancer configuration. If unset, the default configuration with
        the ingress service IP address size is used. Optional. Mutable.
    
      nodePools <[]Object>
        The list of node pools for the cluster worker nodes. Optional. Mutable.
    
      releaseChannel    <Object>
        The release channel a cluster is subscribed to. When a cluster is
        subscribed to a release channel, GDC maintains the cluster versions for
        users. Optional. Mutable.
    

    您可以使用 GDC 控制台或 kubectl CLI 更新这些设置。 例如,您可以调整节点池的大小。

后续步骤