轮替客户管理的控制平面 CA 和密钥


本页面向集群管理员和安全工程师介绍了如何轮替您为 GKE 控制平面授权配置的证书授权机构 (CA) 和服务账号签名密钥。

您应该熟悉以下概念:

规划凭据轮替

本页面介绍了如何轮换控制平面中的以下凭据组件:

  • 集群根 CA、汇总根 CA、etcd API 根 CA 和 etcd 对等根 CA。
  • Kubernetes ServiceAccount 签名和验证密钥。

您还可以轮换用于加密控制平面启动磁盘、etcd 磁盘以及 Google Cloud 用于灾难恢复的 etcd 内部备份的客户管理的加密密钥。如需了解详情,请参阅轮换 etcd 和控制平面启动磁盘加密密钥

轮替凭据,以避免 CA 过期、缓解密钥版本泄露风险,并作为组织安全实践的一部分。在规划特定 GKE control plane authority 资源的轮换频率时,请考虑以下事项:

  • 默认情况下,由 Certificate Authority Service (CA Service) 中的根 CA 签名的 GKE 证书会在创建日期一年后过期。
  • Cloud Key Management Service (Cloud KMS) 中的密钥不会过期。仅当组织有密钥轮替要求时,才执行手动密钥轮替。为尽量减少对正在运行的工作负载的干扰,请勿为这些密钥配置自动密钥轮替。

准备工作

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

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 拥有使用自行管理的 CA 和服务账号密钥的现有集群

  • 确定以下 Google Cloud 项目的项目 ID:

    • 密钥项目:包含 Cloud KMS 和 CA Service 资源的项目。
    • 集群项目:包含 GKE 集群的项目。
  • 如需执行此页面上的验证任务,请验证是否已启用以下数据访问审核日志:

    • Cloud Key Management Service (KMS) API:DATA_READ
    • Certificate Authority Service:ADMIN_READ

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

所需的角色和权限

如需获得轮换客户管理的 CA 和密钥所需的权限,请让您的管理员为您授予以下 IAM 角色:

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

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

限制

您用于服务账号签名和验证的非对称 Cloud KMS 密钥不支持自动密钥轮替。

轮替服务账号签名和验证密钥

设置 GKE 控制平面授权时,您需要向集群添加服务账号签名密钥和服务账号验证密钥。GKE 使用这些密钥来签署和验证 Kubernetes ServiceAccount 的不记名令牌。在轮替期间,您需要将新密钥添加到服务账号验证密钥列表中,等待更改传播,然后将服务账号签名密钥替换为新密钥。

如需轮替服务账号密钥,请按照以下步骤操作:

  1. 获取服务账号签名密钥的原始密钥版本的完整资源名称:

    gcloud container clusters describe CLUSTER_NAME \
        --project=CLUSTER_PROJECT_ID \
        --location=CONTROL_PLANE_LOCATION \
        --format="value(userManagedKeysConfig.serviceAccountSigningKeys)"
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • CONTROL_PLANE_LOCATION:集群的位置。
    • CLUSTER_PROJECT_ID:集群项目的项目 ID。

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/SIGNING_KEY_NAME/cryptoKeyVersions/ORIGINAL_SIGNING_KEY_VERSION
    

    在此输出中,SIGNING_KEY_NAME 是密钥的名称,ORIGINAL_SIGNING_KEY_VERSION 是原始签名密钥版本的编号。

  2. 为服务账号签名密钥创建新的密钥版本:

    gcloud kms keys versions create \
        --key=SIGNING_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • SIGNING_KEY_NAME:服务账号签名密钥的名称。
    • KEYRING_NAME:包含密钥的密钥环的名称。
    • CONTROL_PLANE_LOCATION:钥匙环的 Google Cloud 位置。
    • KEY_PROJECT_ID:您的密钥项目的项目 ID
  3. 获取新密钥版本的完整资源名称:

    gcloud kms keys versions list \
        --key=SIGNING_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/SIGNING_KEY_NAME/cryptoKeyVersions/NEW_SIGNING_KEY_VERSION
    

    在此输出中,SIGNING_KEY_NAME 是密钥的名称,NEW_SIGNING_KEY_VERSION 是新签名密钥版本的编号。

  4. 将新密钥版本添加到集群的服务账号验证密钥集中:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --service-account-verification-keys=ORIGINAL_KEY_VERSION_PATH,NEW_KEY_VERSION_PATH
    

    替换以下内容:

    • ORIGINAL_KEY_VERSION_PATH:本部分第一步的输出中原始签名密钥版本的完整资源名称。例如 projects/example-key-project/locations/us-central1/keyRings/example-keyring/cryptokeys/example-signing-key/cryptoKeyVersions/1
    • NEW_KEY_VERSION_PATH:上一步输出中新签名密钥版本的完整资源名称。例如,projects/example-key-project/locations/us-central1/keyRings/example-keyring/cryptokeys/example-signing-key/cryptoKeyVersions/2

    集群更新操作完成后,新的密钥版本路径可能需要长达 10 分钟才能传播到 Kubernetes API 服务器和每个 GKE API 端点。

  5. 如需确认新密钥版本路径已完全传播,请执行以下操作:

    1. 从 GKE API 获取集群签名密钥的公共组成部分(以 JSON Web 密钥集 [JWKS] 的形式):

      curl https://container.googleapis.com/v1/projects/CLUSTER_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/clusters/CLUSTER_NAME/jwks
      

      输出类似于以下内容:

      {
        "keys": [
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY1_ID",
            "n": "KEY1_MODULUS",
            "e": "KEY1_EXPONENT"
          },
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY2_ID",
            "n": "KEY2_MODULUS",
            "e": "KEY2_EXPONENT"
          }
        ]
      }
      

      此输出必须包含两个密钥条目,这表示两个密钥版本均可在 GKE API 中使用。如果您只看到一个密钥条目,请等待 10 分钟,然后重试该命令。

    2. 连接到集群,以便运行 kubectl 命令:

      gcloud container clusters get-credentials CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
      
    3. 从 Kubernetes API 服务器获取集群签名密钥的公共组成部分(以 JWKS 形式):

      kubectl get --raw /openid/v1/jwks | jq
      

      输出类似于以下内容:

      {
        "keys": [
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY1_ID",
            "n": "KEY1_MODULUS",
            "e": "KEY1_EXPONENT"
          },
          {
            "kty": "RSA",
            "alg": "RS256",
            "use": "sig",
            "kid": "KEY2_ID",
            "n": "KEY2_MODULUS",
            "e": "KEY2_EXPONENT"
          }
        ]
      }
      

      此输出必须包含两个键条目,这表示 Kubernetes API 服务器中提供了这两个密钥版本。如果您只看到一个密钥条目,请等待 10 分钟,然后重试该命令。

  6. 更新集群以使用新密钥版本作为服务账号签名密钥:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --service-account-signing-key=NEW_KEY_VERSION_PATH
    
  7. 验证新服务账号令牌是否使用新密钥版本:

    1. 创建服务账号:

      kubectl create serviceaccount test-sa-1
      
    2. 为 ServiceAccount 创建令牌:

      kubectl create token test-sa-1
      
    3. 从 Logging 中提取最近签名的摘要:

      export SIGNED_DIGEST=$(gcloud logging read \
          'resource.type="gke_cluster" '\
          'AND resource.labels.cluster_name="' CLUSTER_NAME '" '\
          'AND protoPayload.methodName="google.cloud.gkeauth.v1.Auth.SignServiceAccountJWT" '\
          'AND protoPayload.metadata.subject="system:serviceaccount:default:test-sa-1"' \
          --freshness=1h \
          --bucket=_Required \
          --location=global \
          --view=_AllLogs \
          --order=DESC \
          --limit=1 \
          --format="value(protoPayload.metadata.toBeSignedDigest)")
      
      1. 验证是否正在使用新的签名密钥版本:
        gcloud logging read \
            'resource.type="cloudkms_cryptokeyversion" '\
            'AND protoPayload.methodName="AsymmetricSign" '\
            'AND protoPayload.request.digest.sha256="'${SIGNED_DIGEST}'"' \
            --freshness=1h \
            --bucket=_Default \
            --location=global \
            --view=_AllLogs \
            --order=DESC \
            --limit=1 \
            --format="value(protoPayload.resourceName)"
        ```
      The output is the resource path of the new signing key version.
      
  8. 等待集群中每个使用原始服务账号签名密钥版本的令牌过期。默认情况下,令牌生命周期为 1 小时,可配置的最大生命周期为 24 小时。如需检查集群中配置的令牌生命周期,请运行以下命令:

    kubectl get pods -A -o json | jq -r '.items[]?.spec?.volumes[]?.projected?.sources[]?.serviceAccountToken?.expirationSeconds | select(. != null)' | sort -nr | head -n 1
    
  9. 等待上一步输出中配置的令牌生命周期结束。在此时间段过后,集群中的所有绑定令牌都将使用新的服务账号签名密钥版本。

  10. 从集群的验证密钥列表中移除原始密钥版本:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=CLUSTER_PROJECT_ID \
        --service-account-verification-keys=NEW_KEY_VERSION_PATH
    
  11. 可选:停用原始密钥版本。验证原始密钥版本未被使用且集群运行正常后,销毁该密钥版本。

    除非您是为了应对严重事件而轮替密钥,否则我们建议您等待几天,然后再销毁原始密钥版本。如需了解详情,请参阅销毁和恢复密钥版本

完成这些步骤后,集群中的每个新服务账号令牌和现有服务账号令牌都将由新密钥版本签名。API 服务器会拒绝使用具有原始密钥版本的不记名令牌的任何请求,因为集群配置中不存在原始密钥版本。

轮替 GKE control plane authority CA

以下部分介绍了如何轮换集群用于 GKE 控制平面授权的根 CA。

为 CA 创建新的密钥版本

  1. 为集群根 CA 密钥创建新的密钥版本:

    gcloud kms keys versions create \
        --key=CLUSTER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • CLUSTER_CA_KEY_NAME:集群的集群根 CA 密钥的名称。
    • KEYRING_NAME:包含密钥的密钥环的名称。
    • CONTROL_PLANE_LOCATION:钥匙环的 Google Cloud 位置。这与您的集群位置相同。
    • KEY_PROJECT_ID:您的密钥项目的项目 ID
  2. 为汇总根 CA 密钥创建新的密钥版本:

    gcloud kms keys versions create \
        --key=AGGREGATION_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    AGGREGATION_CA_KEY_NAME 替换为集群的汇总根 CA 密钥的名称。

  3. 为 etcd API 根 CA 密钥创建新的密钥版本:

    gcloud kms keys versions create \
        --key=ETCD_API_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ETCD_API_CA_KEY_NAME 替换为集群的 etcd API 根 CA 密钥的名称。

  4. 为 etcd 对等根 CA 密钥创建新的密钥版本:

    gcloud kms keys versions create \
        --key=ETCD_PEER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ETCD_PEER_CA_KEY_NAME 替换为集群的 etcd 对等根 CA 密钥的名称。

创建新的根 CA

  1. 获取新集群根 CA 密钥版本的完整资源名称:

    gcloud kms keys versions list \
        --key=CLUSTER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/CLUSTER_CA_KEY_NAME/cryptoKeyVersions/VERSION
    

    在此输出中,VERSION 是新密钥版本的编号。

  2. 在集群 CA 池中创建新的集群根 CA:

    gcloud privateca roots create CLUSTER_ROOT_CA_NAME \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=CLUSTER_CA_KEY_PATH \
        --subject="CN=cluster-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • CLUSTER_ROOT_CA_NAME:新根 CA 的名称。
    • CLUSTER_CA_POOL_NAME:集群 CA 池的名称。
    • CLUSTER_CA_KEY_PATH:上一步输出中新密钥版本的完整资源名称。
    • ORGANIZATION:您的组织名称。
  3. 获取新的汇总根 CA 密钥版本的完整资源名称:

    gcloud kms keys versions list \
        --key=AGGREGATION_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/AGGREGATION_CA_KEY_NAME/cryptoKeyVersions/VERSION
    
  4. 在汇总 CA 池中创建新的汇总根 CA:

    gcloud privateca roots create AGGREGATION_ROOT_CA_NAME \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=AGGREGATION_CA_KEY_PATH \
        --subject="CN=aggregation-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • AGGREGATION_ROOT_CA_NAME:新聚合根 CA 的名称。
    • AGGREGATION_CA_POOL_NAME:汇总 CA 池的名称。
    • AGGREGATION_CA_KEY_PATH:上一步输出中新密钥版本的完整资源名称。
  5. 获取新的 etcd API 根 CA 密钥版本的完整资源名称:

    gcloud kms keys versions list \
        --key=ETCD_API_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/ETCD_API_CA_KEY_NAME/cryptoKeyVersions/VERSION
    
  6. 在 etcd API CA 池中创建新的 etcd API 根 CA:

    gcloud privateca roots create ETCD_API_ROOT_CA_NAME \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=ETCD_API_CA_KEY_PATH \
        --subject="CN=etcd-api-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • ETCD_API_ROOT_CA_NAME:新 etcd API 根 CA 的名称。
    • ETCD_API_CA_POOL_NAME:etcd API CA 池的名称。
    • ETCD_API_CA_KEY_PATH:上一步输出中新密钥版本的完整资源名称。
  7. 获取新的 etcd 对等根 CA 密钥版本的完整资源名称:

    gcloud kms keys versions list \
        --key=ETCD_PEER_CA_KEY_NAME \
        --keyring=KEYRING_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
        --filter="STATE=ENABLED" --sort-by=~ \
        --format="value(name)" | sed 1q
    

    输出类似于以下内容:

    projects/KEY_PROJECT_ID/locations/CONTROL_PLANE_LOCATION/keyRings/KEYRING_NAME/cryptoKeys/ETCD_PEER_CA_KEY_NAME/cryptoKeyVersions/VERSION
    
  8. 在 etcd 对等 CA 池中创建新的 etcd 对等根 CA:

    gcloud privateca roots create ETCD_PEER_ROOT_CA_NAME \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --kms-key-version=ETCD_PEER_CA_KEY_PATH \
        --subject="CN=etcd-peer-ca, O=ORGANIZATION" \
        --project=KEY_PROJECT_ID
    

    替换以下内容:

    • ETCD_PEER_ROOT_CA_NAME:新 etcd 对等根 CA 的名称。
    • ETCD_PEER_CA_POOL_NAME:etcd 对等 CA 池的名称。
    • ETCD_PEER_CA_KEY_PATH:上一步输出中新密钥版本的完整资源名称。
  9. 在继续之前,请按照重启控制平面和节点部分中的说明,将根 CA 更改传播到集群信任软件包。

将原始根 CA 替换为新的根 CA

重启控制平面和节点后,请按以下步骤操作:

  1. 启用新的集群根 CA:

    gcloud privateca roots enable CLUSTER_ROOT_CA_NAME \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  2. 启用新的汇总根 CA:

    gcloud privateca roots enable AGGREGATION_ROOT_CA_NAME \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  3. 启用新的 etcd API 根 CA:

    gcloud privateca roots enable ETCD_API_ROOT_CA_NAME \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  4. 启用新的 etcd 对等根 CA:

    gcloud privateca roots enable ETCD_PEER_ROOT_CA_NAME \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    
  5. 停用原始集群根 CA:

    gcloud privateca roots disable ORIGINAL_CLUSTER_ROOT_CA \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_CLUSTER_ROOT_CA 替换为您要轮换的原始集群根 CA 的名称。

  6. 停用原始汇总根 CA:

    gcloud privateca roots disable ORIGINAL_AGGREGATION_ROOT_CA \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_AGGREGATION_ROOT_CA 替换为您要轮换的原始聚合根 CA 的名称。

  7. 停用原始 etcd API 根 CA:

    gcloud privateca roots disable ORIGINAL_ETCD_API_ROOT_CA \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_ETCD_API_ROOT_CA 替换为您要轮换的原始 etcd API 根 CA 的名称。

  8. 停用原始 etcd 对等根 CA:

    gcloud privateca roots disable ORIGINAL_ETCD_PEER_ROOT_CA \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID
    

    ORIGINAL_ETCD_PEER_ROOT_CA 替换为您要轮换的原始 etcd 对等根 CA 的名称。

  9. 此时,新的根 CA 会在集群中颁发所有新证书。如需为每个节点上的 kubelet 签发新证书,请重启控制平面和节点。此步骤是必需的,因为 kubelet 证书的有效期很长。

在集群保持健康状态多天后,您可以删除原始根 CA,如下一部分中所述。

删除原始根 CA

本部分介绍如何删除原始根 CA。在按照这些步骤操作之前,请验证以下内容:

  • 在您将原始根 CA 替换为新根 CA 后,集群在多天内保持健康状态。
  • 您已将原始根 CA 颁发的所有证书替换为新证书。

如需删除原始根 CA,请使用 gcloud privateca roots delete 命令,具体步骤如下所述。在这些命令中,--ignore-active-certificates 标志会在宽限期过后删除 CA,即使该 CA 具有未撤消或未过期的证书也是如此。

  1. 删除原始集群根 CA:

    gcloud privateca roots delete ORIGINAL_CLUSTER_ROOT_CA \
        --pool=CLUSTER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_CLUSTER_ROOT_CA 替换为您要轮换的原始集群根 CA 的名称。

  2. 删除原始汇总根 CA:

    gcloud privateca roots delete ORIGINAL_AGGREGATION_ROOT_CA \
        --pool=AGGREGATION_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_AGGREGATION_ROOT_CA 替换为您要轮换的原始聚合根 CA 的名称。

  3. 删除原始 etcd API 根 CA:

    gcloud privateca roots delete ORIGINAL_ETCD_API_ROOT_CA \
        --pool=ETCD_API_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_ETCD_API_ROOT_CA 替换为您要轮换的原始 etcd API 根 CA 的名称。

  4. 删除原始 etcd 对等根 CA:

    gcloud privateca roots delete ORIGINAL_ETCD_PEER_ROOT_CA \
        --pool=ETCD_PEER_CA_POOL_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --project=KEY_PROJECT_ID \
          --ignore-active-certificates
    

    ORIGINAL_ETCD_PEER_ROOT_CA 替换为您要轮换的原始 etcd 对等根 CA 的名称。

  5. 可选:将对根 CA 的更改传播到集群信任包。 如需查看相关说明,请参阅重启控制平面和节点部分。如果您跳过此步骤,系统会在下次控制平面和节点版本升级期间移除原始根 CA。

重启控制平面和节点

当您更改集群的根 CA 配置(例如启用根 CA、停用根 CA 或撤消证书)时,必须将这些更改传播到集群的信任文件包。如需将更改传播到集群的信任软件包,请重启控制平面和(在某些情况下)节点。

  1. 将集群控制平面升级到其已在使用的同一版本。

    1. 查找控制平面已在使用的 GKE 版本:

      gcloud container clusters describe CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --format="value(currentMasterVersion)"
      

      替换以下内容:

      • CLUSTER_NAME:GKE 集群的名称。
      • CLUSTER_VERSION:集群已运行的 GKE 版本。
      • CLUSTER_PROJECT_ID:您的集群项目的项目 ID。
    2. 升级控制平面:

      gcloud container clusters upgrade CLUSTER_NAME \
          --master \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION \
          --project=CLUSTER_PROJECT_ID
      
  2. 如果您使用 Kubernetes CertificateSigningRequests 手动生成证书,请重新颁发所有这些证书,并向 API 客户端提供新证书。

  3. 对于仅轮替集群根 CA 的情况,请通过将每个节点池升级到其已在使用的版本来触发节点重新创建。

    1. 查找节点池使用的 GKE 版本:

      gcloud container node-pools describe NODE_POOL_NAME \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --project=CLUSTER_PROJECT_ID \
          --format="value(version)"
      

      NODE_POOL_NAME 替换为要升级的节点池的名称。

    2. 升级节点池:

      gcloud container clusters upgrade CLUSTER_NAME \
          --node-pool=NODE_POOL_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION \
          --project=CLUSTER_PROJECT_ID
      

如果您在 CA 轮替期间执行了本部分中的步骤,请继续执行轮替的下一阶段,即本页面中的以下部分之一:

后续步骤