在 GKE 中运行您自己的证书授权机构和密钥


本页介绍了如何使用您管理的证书颁发机构 (CA) 和密钥配置 Google Kubernetes Engine (GKE) 集群控制平面。本指南适用于有特定组织合规性或政策要求来控制凭据签发和签名的安全管理员。

本页介绍了 GKE 中一组可选控制平面功能的一部分,可让您执行各种任务,例如验证控制平面安全状况,或使用您管理的密钥在控制平面中配置加密和凭据签名。 如需了解详情,请参阅 GKE 控制平面授权简介

默认情况下, Google Cloud 会对托管式控制平面应用各种安全措施。 本页介绍了一些可选功能,可让您更好地了解 GKE 控制平面或对其进行控制。

您应该已经熟悉以下概念:

控制平面凭据组件

GKE 集群使用特定的 CA 和密钥在集群中颁发凭据,例如 X.509 证书或 ServiceAccount 令牌。您可以在 Cloud Key Management Service (Cloud KMS) 中创建密钥,并在 Certificate Authority Service (CA Service) 中创建 CA,然后将集群配置为使用这些资源,而不是使用 Google Cloud管理的 CA 和密钥。

如需详细了解您创建的具体组件,请参阅自行管理的 CA 和密钥

与其他 GKE 控制平面权限功能搭配使用

GKE 控制平面权限提供与自有密钥相关的以下功能:

目标

  • 在 Cloud KMS 中创建密钥
  • 在 CA Service 中创建 CA
  • 向 GKE 服务代理授予 Identity and Access Management (IAM) 角色
  • 创建使用您的 CA 和密钥的 GKE 集群
  • 验证集群是否使用您的 CA 和密钥

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Make sure that billing is enabled for your Google Cloud project.

  5. Enable the Kubernetes Engine, Certificate Authority Service, and Cloud Key Management Service APIs:

    gcloud services enable container.googleapis.com privateca.googleapis.com cloudkms.googleapis.com
  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Kubernetes Engine, Certificate Authority Service, and Cloud Key Management Service APIs:

    gcloud services enable container.googleapis.com privateca.googleapis.com cloudkms.googleapis.com
  10. 确保您的环境符合使用 GKE 控制平面授权功能的条件。如需选择启用这些功能,请与您的 Google Cloud 销售团队联系。
  11. 如需可靠地跟踪凭据签发和使用情况,请确保启用了以下数据访问审核日志:
    • Cloud KMS:DATA_READ
    • CA 服务:ADMIN_READADMIN_WRITE

    如需启用这些日志类型,请参阅启用数据访问审核日志

所需的角色和权限

如需获得运行您自己的 CA 和密钥所需的权限,请让管理员向您授予以下 IAM 角色:

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

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

使用要求

您必须使用 GKE 1.31.1-gke.1846000 或更高版本。

限制

存在以下限制:

  • 您只能使用来自 Cloud KMS 的密钥。您不能使用其他 KMS 提供程序或其他加密提供程序。
  • 不支持 Cloud External Key Manager (Cloud EKM) 密钥。
  • 您只能使用 CA Service 中的 CA。

准备环境

在本部分中,您将确定要在此教程中使用的 Google Cloud 项目,并在 Cloud KMS 中创建一个密钥环来存放密钥。

标识项目

我们建议您分别使用 Google Cloud 项目,如下所示:

  • 密钥项目:包含所有密钥和 CA。
  • 集群项目:包含您的 GKE 集群。

您可以选择为密钥、CA 和 GKE 集群使用同一项目,但我们建议您使用单独的项目,以便组织中管理加密操作的团队与管理集群操作的团队分开。

创建密钥环

在密钥项目中创建一个密钥环,用于存放特定集群的所有密钥。您必须在 GKE 集群所在的位置创建密钥环。

运行以下命令:

gcloud kms keyrings create KEY_RING_NAME \
    --location=us-central1 \
    --project=KEY_PROJECT_ID

替换以下内容:

  • KEY_RING_NAME:密钥环的名称。
  • KEY_PROJECT_ID:您的密钥项目的项目 ID。

创建密钥

对于每个凭据授权机构(例如服务账号密钥和 CA),您都需要使用 Cloud KMS 创建一个密钥。本部分介绍了如何创建 GKE 用于在集群中对凭据进行签名和验证的密钥。根据贵组织的需求,您可以为这些密钥指定自己的属性。如需了解详情,请参阅创建密钥页面和 projects.locations.keyRings.cryptoKeys API 参考文档。

在 Cloud KMS 中创建这些资源时,请考虑以下事项:

  • 如果您的密钥项目中已有密钥环,您可以使用该密钥环存储您创建的所有密钥,以便与集群搭配使用。
  • 您的密钥串必须与集群位于同一 Google Cloud 位置,以最大限度地减少延迟时间。
  • 密钥必须将 asymmetric-signing 指定为密钥用途。
  • 根据密钥类型使用以下算法:
    • 服务账号签名密钥:强大的 RSA 签名 PKCS1 算法,例如 rsa-sign-pkcs1-4096-sha256rsa-sign-pkcs1-3072-sha256
    • 证书颁发机构密钥:ec-sign-p256-sha256 等强大算法。
  • 支持 Cloud HSM 硬件密钥,但对于大多数用例,software 保护级别已足够。如需详细了解硬件密钥,请参阅 Cloud HSM
  • 请勿修改密钥销毁的默认时长
  • GKE 不会阻止您删除集群正在使用的 Cloud KMS 密钥(包括 CA 服务密钥)。在删除密钥或 CA 之前,请确保这些资源未被使用。

如需创建密钥,请运行以下命令:

  1. 创建 Kubernetes ServiceAccount 签名密钥,您还可以在创建集群期间将其指定为服务账号验证密钥:

    gcloud kms keys create sa-signing-key \
        --keyring=KEY_RING_NAME \
        --location=us-central1\
        --purpose="asymmetric-signing" \
        --protection-level=hsm \
        --default-algorithm=rsa-sign-pkcs1-4096-sha256 \
        --project=KEY_PROJECT_ID
    

    KEY_PROJECT_ID 替换为专用密钥项目的项目 ID。

  2. 创建集群根 CA 密钥:

    gcloud kms keys create cluster-ca-key \
        --keyring=KEY_RING_NAME \
        --location=us-central1\
        --purpose="asymmetric-signing" \
        --protection-level=hsm \
        --default-algorithm=ec-sign-p256-sha256 \
        --project=KEY_PROJECT_ID
    
  3. 创建 etcd 对等根 CA 密钥:

    gcloud kms keys create etcd-peer-ca-key \
        --keyring=KEY_RING_NAME \
        --location=us-central1\
        --purpose="asymmetric-signing" \
        --protection-level=hsm \
        --default-algorithm=ec-sign-p256-sha256 \
        --project=KEY_PROJECT_ID
    
  4. 创建 etcd API 根 CA 密钥:

    gcloud kms keys create etcd-api-ca-key \
        --keyring=KEY_RING_NAME \
        --location=us-central1\
        --purpose="asymmetric-signing" \
        --protection-level=hsm \
        --default-algorithm=ec-sign-p256-sha256 \
        --project=KEY_PROJECT_ID
    
  5. 创建汇总根 CA 密钥:

    gcloud kms keys create aggregation-ca-key \
        --keyring=KEY_RING_NAME \
        --location=us-central1\
        --purpose="asymmetric-signing" \
        --protection-level=hsm \
        --default-algorithm=ec-sign-p256-sha256 \
        --project=KEY_PROJECT_ID
    

创建 CA

为每个控制平面函数创建密钥后,使用每个密钥使用 CA Service 创建 CA 池和相应的根 CA:

  1. 创建集群 CA 池:

    gcloud privateca pools create cluster-ca-pool \
        --location=us-central1 \
        --tier=enterprise \
        --project=KEY_PROJECT_ID \
        --no-publish-crl --no-publish-ca-cert
    

    --no-publish-crl 标志和 --no-publish-ca-cert 标志是可选的。忽略这些标志会将证书发布到 Cloud Storage 存储桶。如需了解详情,请参阅为 CA 池中的 CA 启用 CA 证书和 CRL 发布

  2. 创建集群根 CA:

    gcloud privateca roots create cluster-root-ca \
        --pool=cluster-ca-pool \
        --location=us-central1 \
        --kms-key-version=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/cluster-ca-key/cryptoKeyVersions/1 \
        --subject="CN=cluster-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID \
        --auto-enable
    

    ORGANIZATION 替换为您的组织名称。

  3. 创建 etcd 对等 CA 池:

    gcloud privateca pools create etcd-peer-ca-pool \
        --location=us-central1 \
        --tier=enterprise \
        --project=KEY_PROJECT_ID \
        --no-publish-crl --no-publish-ca-cert
    
  4. 创建 etcd 对等根 CA:

    gcloud privateca roots create etcd-peer-root-ca \
        --pool=etcd-peer-ca-pool \
        --location=us-central1 \
        --kms-key-version=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/etcd-peer-ca-key/cryptoKeyVersions/1 \
        --subject="CN=etcd-peer-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID \
        --auto-enable
    
  5. 创建 etcd API CA 池:

    gcloud privateca pools create etcd-api-ca-pool \
        --location=us-central1 \
        --tier=enterprise \
        --project=KEY_PROJECT_ID \
        --no-publish-crl --no-publish-ca-cert
    
  6. 创建 etcd API 根 CA:

    gcloud privateca roots create etcd-api-root-ca \
        --pool=etcd-api-ca-pool \
        --location=us-central1 \
        --kms-key-version=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/etcd-api-ca-key/cryptoKeyVersions/1 \
        --subject="CN=etcd-api-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID \
        --auto-enable
    
  7. 创建汇总 CA 池:

    gcloud privateca pools create aggregation-ca-pool \
        --location=us-central1 \
        --tier=enterprise \
        --project=KEY_PROJECT_ID \
        --no-publish-crl --no-publish-ca-cert
    
  8. 创建汇总根 CA:

    gcloud privateca roots create aggregation-root-ca \
        --pool=aggregation-ca-pool \
        --location=us-central1 \
        --kms-key-version=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/aggregation-ca-key/cryptoKeyVersions/1 \
        --subject="CN=aggregation-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID \
        --auto-enable
    

向 GKE 服务代理授予 IAM 角色

GKE 服务代理需要访问您在 Cloud KMS 和 CA 服务中创建的资源。服务代理会使用这些资源在集群中签名、验证和颁发凭据。您可以使用以下预定义 IAM 角色:

如需向 GKE 服务代理授予这些角色,请执行以下操作:

  1. 查找集群项目的项目编号:

    gcloud projects describe CLUSTER_PROJECT_ID \
        --format='value(projectNumber)'
    

    CLUSTER_PROJECT_ID 替换为集群项目的项目 ID。

  2. 为您在创建密钥中创建的服务账号签名密钥授予 Kubernetes Engine KMS Crypto Key User 角色:

    gcloud kms keys add-iam-policy-binding sa-signing-key \
      --location=us-central1 \
      --keyring=KEY_RING_NAME \
      --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
      --role=roles/container.cloudKmsKeyUser \
      --project=KEY_PROJECT_ID
    

    CLUSTER_PROJECT_NUMBER 替换为集群项目的项目编号。

  3. 为您在创建 CA 中创建的 CA 池授予 CA Service Certificate Manager 角色:

    gcloud privateca pools add-iam-policy-binding cluster-ca-pool \
        --location=us-central1 \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/privateca.certificateManager \
        --project=KEY_PROJECT_ID
    
    gcloud privateca pools add-iam-policy-binding etcd-peer-ca-pool \
        --location=us-central1 \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/privateca.certificateManager \
        --project=KEY_PROJECT_ID
    
    gcloud privateca pools add-iam-policy-binding etcd-api-ca-pool \
        --location=us-central1 \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/privateca.certificateManager \
        --project=KEY_PROJECT_ID
    
    gcloud privateca pools add-iam-policy-binding aggregation-ca-pool \
        --location=us-central1 \
        --member="serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com" \
        --role=roles/privateca.certificateManager \
        --project=KEY_PROJECT_ID
    

在新集群上设置 CA 和密钥

创建密钥、CA 池、根 CA 并向 GKE 服务代理授予 IAM 角色后,创建一个使用这些资源的新集群。

您在集群创建命令中指定的标志需要以下资源路径作为值:

  • 您在创建密钥中创建的服务账号签名密钥在 Cloud KMS 中的密钥版本的路径。您可以为 service-account-signing-keys 标志和 service-account-verification-keys 标志指定此路径。
  • 您在创建 CA 中创建的每个 CA 池的路径。

如需配置新的集群以使用您的密钥和 CA,请执行以下步骤:

  1. 找到已启用的最新服务账号签名密钥版本的路径:

    gcloud kms keys versions list \
        --key=sa-signing-key \
        --keyring=KEY_RING_NAME \
        --location=us-central1 \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ --format="value(name)" | sed 1q
    

    KEY_PROJECT_ID 替换为关键项目的项目 ID。

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1
    
  2. 找到您创建的每个 CA 池的路径:

    gcloud privateca pools list --format="get(name)" \
        --project=KEY_PROJECT_ID
    

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool
    projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool
    projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool
    projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool
    

    确保输出包含您为 GKE 创建的所有 CA 池。

创建集群

在本部分中,您将创建一个集群,并根据要配置的 GKE 控制平面授权功能指定不同的选项。您只能在创建集群期间在集群上配置这些功能。以下命令可创建 Autopilot 模式集群。如需改为创建标准模式集群,请将相同的标志与 gcloud container clusters create 命令搭配使用。

  • 如需仅配置您在本教程中创建的 CA 和密钥,请运行以下命令:

    gcloud container clusters create-auto example-cluster \
        --location=us-central1 \
        --project=CLUSTER_PROJECT_ID \
        --cluster-version=VERSION \
        --service-account-signing-keys=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \
        --service-account-verification-keys=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \
        --cluster-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool \
        --etcd-peer-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool \
        --etcd-api-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool \
        --aggregation-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool
    

    替换以下内容:

    • CLUSTER_PROJECT_ID:集群项目的项目 ID。
    • VERSION:集群的 GKE 版本。必须为 1.31.1-gke.1846000 或更高版本。
  • 如需配置 CA 和密钥以及控制平面启动磁盘加密和 etcd 加密,请执行以下操作:

    1. 执行对 etcd 和控制平面启动磁盘进行加密中的所有密钥配置步骤。
    2. 按照在集群中使用加密密钥中的说明,找到每个密钥的路径。
    3. 创建集群:

      gcloud container clusters create-auto example-cluster \
          --location=us-central1 \
          --project=CLUSTER_PROJECT_ID \
          --cluster-version=VERSION \
          --service-account-signing-keys=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \
          --service-account-verification-keys=projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1 \
          --cluster-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool \
          --etcd-peer-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool \
          --etcd-api-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool \
          --aggregation-ca=projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool \
          --control-plane-disk-encryption-key=PATH_TO_DISK_KEY \
          --gkeops-etcd-backup-encryption-key=PATH_TO_ETCD_BACKUP_KEY
      

      替换以下内容:

      • CLUSTER_PROJECT_ID:集群项目的项目 ID。
      • VERSION:集群的 GKE 版本。必须为 1.31.1-gke.1846000 或更高版本。
      • PATH_TO_DISK_KEY:磁盘加密密钥的路径。
      • PATH_TO_ETCD_BACKUP_KEY:etcd 内部备份加密密钥的路径。

    您还可以在创建新的标准模式集群时使用这些标志。

验证集群是否使用您指定的密钥和 CA

本部分介绍了如何验证在创建集群期间使用的密钥和 CA。您可以使用 Cloud Logging 或 Google Cloud CLI 执行此验证。

使用日志记录功能验证密钥和 CA

如需使用 Logging 验证密钥和 CA,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 Logs Explorer 页面:

    转到 Logs Explorer

  2. 指定以下查询:

    resource.type="gke_cluster"
    resource.labels.cluster_name="CLUSTER_NAME"
    resource.labels.location="CLUSTER_LOCATION"
    protoPayload.serviceName="container.googleapis.com"
    protoPayload.methodName=~"google.container.v(1|1alpha1|1beta1).ClusterManager.CreateCluster"
    protoPayload.request.cluster.userManagedKeysConfig:*
    

    protoPayload.request.cluster.userManagedKeysConfig:* 会过滤包含您管理的密钥和 CA 的集群创建日志的结果。

  3. 点击运行查询

在结果中,展开集群创建日志。验证密钥和 CA 的路径是否与您为该集群创建的路径相同,如以下示例所示:

# lines omitted for clarity
userManagedKeysConfig: {
  aggregationCa: "projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool"
  clusterCa: "projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool"
  etcdApiCa: "projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool"
  etcdPeerCa: "projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool"
  serviceAccountSigningKeys: [
    0: "projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1"
  ]
  serviceAccountVerificationKeys: [
    0: "projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1"
  ]
}

使用 gcloud CLI 验证密钥和 CA

如需验证集群是否使用您创建的 CA 和密钥,请运行以下命令:

gcloud container clusters describe example-cluster \
    --location=us-central1 \
    --project=CLUSTER_PROJECT_ID

输出应包含 userManagedKeysConfig 字段,如下例所示:

# lines omitted for clarity
userManagedKeysConfig:
  sa-signing-key: projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1
  sa-verification-key: projects/KEY_PROJECT_ID/locations/us-central1/keyRings/KEY_RING_NAME/cryptoKeys/sa-signing-key/cryptoKeyVersions/1
  cluster-ca: projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool
  etcd-peer-ca: projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool
  etcd-api-ca: projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool
  aggregation-ca: projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

删除项目

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

删除各个资源

  1. 删除集群:

    gcloud container clusters delete example-cluster \
        --location=us-central1 \
        --project=CLUSTER_PROJECT_ID
    
  2. 停用根 CA:

    gcloud privateca roots disable cluster-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool \
        --project=KEY_PROJECT_ID
    
    gcloud privateca roots disable etcd-peer-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool \
        --project=KEY_PROJECT_ID
    
    gcloud privateca roots disable etcd-api-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool \
        --project=KEY_PROJECT_ID
    
    gcloud privateca roots disable aggregation-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool \
        --project=KEY_PROJECT_ID
    
  3. 删除根 CA:

    gcloud privateca roots delete cluster-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/cluster-ca-pool \
        --project=KEY_PROJECT_ID
    
    gcloud privateca roots delete etcd-peer-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-peer-ca-pool \
        --project=KEY_PROJECT_ID
    
    gcloud privateca roots delete etcd-api-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/etcd-api-ca-pool \
        --project=KEY_PROJECT_ID
    
    gcloud privateca roots delete aggregation-root-ca \
        --location=us-central1 \
        --pool=projects/KEY_PROJECT_ID/locations/us-central1/caPools/aggregation-ca-pool \
        --project=KEY_PROJECT_ID
    
  4. 删除 CA 池:

    gcloud privateca pools delete cluster-ca-pool --location=us-central1 \
        --project=KEY_PROJECT_ID
    
    gcloud privateca pools delete etcd-peer-ca-pool --location=us-central1 \
        --project=KEY_PROJECT_ID
    
    gcloud privateca pools delete etcd-api-ca-pool --location=us-central1 \
        --project=KEY_PROJECT_ID
    
    gcloud privateca pools delete aggregation-ca-pool --location=us-central1 \
        --project=KEY_PROJECT_ID
    
  5. 删除密钥:

    gcloud kms keys versions destroy 1 \
        --location=us-central1 \
        --keyring=KEY_RING_NAME \
        --key=sa-signing-key \
        --project=KEY_PROJECT_ID
    
    gcloud kms keys versions destroy 1 \
        --location=us-central1 \
        --keyring=KEY_RING_NAME \
        --key=cluster-ca-key \
        --project=KEY_PROJECT_ID
    
    gcloud kms keys versions destroy 1 \
        --location=us-central1 \
        --keyring=KEY_RING_NAME \
        --key=etcd-peer-ca-key \
        --project=KEY_PROJECT_ID
    
    gcloud kms keys versions destroy 1 \
        --location=us-central1 \
        --keyring=KEY_RING_NAME \
        --key=etcd-api-ca-key \
        --project=KEY_PROJECT_ID
    
    gcloud kms keys versions destroy 1 \
        --location=us-central1 \
        --keyring=KEY_RING_NAME \
        --key=aggregation-ca-key \
        --project=KEY_PROJECT_ID
    

您无法从 Cloud KMS 中删除密钥环。不过,密钥环不会产生额外费用。

后续步骤