本文档介绍了如何在 Google Distributed Cloud 中为用户集群配置准备的凭据。
有了准备好的凭据,您就可以将用户集群的凭据存储在管理员集群内的 Secret 中。这样做可以提供安全保障,因为在创建用户集群时无需在管理员工作站上保留密码和服务账号密钥。
请注意高级集群的以下限制:
- 版本 1.31:高级集群不支持准备好的凭证。
- 版本 1.32 及更高版本:高级集群支持准备好的凭证。
您可以提前在管理员集群中准备 Secret。然后,在创建用户集群时,您可以指定应从在管理员集群中准备好的 Secret 中获取某些凭据。您也可以在用户集群中轮替凭据时使用准备好的 Secret。
准备工作
如果您还没有管理员集群,请创建管理员集群。
过程概览
- 填写 Secret 配置文件。 
- 在管理员集群中,创建 Secret 组。每个 Secret 组都位于自己的 Kubernetes 命名空间中。 
- 创建用户集群。在用户集群配置文件中,指明您希望从管理员集群内的特定命名空间中的 Secret 中获取凭据。 
- 根据需要创建其他 Secret 组和其他版本的 Secret。 
- 根据需要更新现有用户集群的凭据。 
- 根据需要创建其他用户集群。在每个用户集群配置文件中,指定 Secret 命名空间。您还可以指定要用于特定凭据的 Secret 版本。 
填写 Secret 配置文件
为 Secret 配置文件生成模板。
gkectl create-config secrets
上述命令会生成一个名为 secrets.yaml 的文件。如果您愿意,可以更改此文件的名称和位置。
阅读 Secret 配置文件文档,熟悉配置文件。您可能希望在单独的标签页或窗口中打开此文档。
在 Secret 配置文件中,填写与您的情况相关的值。您必须填写以 gke-onprem-secrets- 开头的 namespace 值。
以下是具有一个 Secret 组的 Secret 配置文件的示例。该组具有 vCenter 凭据和四个服务账号密钥的值:
apiVersion: v1
kind: ClusterSecrets
secretGroups:
- namespace: "gke-onprem-secrets-user-cluster-1"
  secrets
    vCenter:
      username: "my-vcenter-account"
      password: "U$icUKEW#INE"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "my-key-folder/component-access-key.json"
    registerServiceAccount:
      serviceAccountKeyPath: "my-key-folder/connect-register-key.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "my-key-folder/log-mon-key.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "my-key-folder/audit-log-key.json"
创建准备好的 Secret
在管理员集群中创建准备好的 Secret:
gkectl prepare secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG --secret-config SECRETS_CONFIG
替换以下内容:
- ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径 
- SECRETS_CONFIG:Secret 配置文件的路径 
查看准备好的 Secret
列出管理员集群中准备好的 Secret:
gkectl list secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG
输出示例:
The following secrets have been found:
- namespace: gke-onprem-secrets-user-cluster-1
  - secrets with name prefix: component-access-sa-creds
    name: component-access-sa-creds.1, version 1, age: 58s
  - secrets with name prefix: cloud-audit-logging-service-account-creds
    name: cloud-audit-logging-service-account-creds.1, version: 1, age: 58s
  - secrets with name prefix: register-service-account-creds
    name: register-service-account-creds.1, version: 1, age: 58s
  - secrets with name prefix: stackdriver-service-account-creds
    name: stackdriver-service-account-creds.1, version: 1, age: 58s
  - secrets with name prefix: vsphere-creds
    name: vsphere-creds.1, version: 1, age: 58s
您还可以运行 kubectl get secrets 以列出命名空间中的 Secret。例如:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get secrets --namespace gke-onprem-secrets-user-cluster-1
输出示例:
component-access-sa-creds ... cloud-audit-logging-service-account-creds ... register-service-account-creds.1 ... stackdriver-service-account-creds.1 ... vsphere-creds.1 ...
在上面的输出结果中,您可以看到每个 Secret 名称都有一个表示该 Secret 的版本的扩展。在此示例中,所有 Secret 的版本均为 1。
创建用户集群
按照创建用户集群中的说明操作。
填写用户集群配置文件时,请为 preparedSecrets.namespace 输入值。此值必须与您之前在 Secret 配置文件中指定的命名空间匹配。
示例:
preparedSecrets: namespace: "gke-onprem-secrets-user-cluster-1"
在用户集群配置文件中,请勿为以下字段指定值。这些字段不是必需字段,因为 Google Distributed Cloud 会从您准备好的 Secret 中获取凭据和密钥。
- vCenter.credentials.fileRef.path
- componentAccessServiceAccountKeyPath
- loadBalancer.f5BigIP.credentials.fileRef.path
- gkeConnect.registerServiceAccountKeyPath
- stackdriver.serviceAccountKeyPath
- usageMetering.bigQueryServiceAccountKeyPath
- cloudAuditLogging.serviceAccountKeyPath
- privateRegistry.credentials.fileRef.path
在用户集群配置文件中,为您要使用的准备好的 Secret 指定版本。以下示例为 5 个 Secret 中的每一个指定版本 1:
vCenter:
  credentials:
    secretRef:
      version "1"
...
componentAccessServiceAccountKey:
  secretRef:
    version: "1"
...
gkeConnect:
  registerServiceAccountKey:
    secretRef:
      version: "1"
...
stackdriver:
  serviceAccountKey:
    secretRef:
      version: "1"
...
cloudAuditLogging:
  serviceAccountKey:
    secretRef:
      version: "1"
version 的值必须是整数字符串或字符串“latest”。如果您没有为 version 指定值,则使用最新版本。
按照创建用户集群中的说明完成用户集群的创建。
创建其他准备好的 Secret
本部分介绍如何在现有命名空间中创建部分 Secret 的版本 2。
创建名为 secrets-2.yaml 的新 Secret 配置文件。指定现有命名空间,并为所选 Secret 提供凭据。
示例:
apiVersion: v1
kind: ClusterSecrets
secretGroups:
- namespace: "gke-onprem-secrets-user-cluster-1"
  secrets:
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-2.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-2.json"
上面的示例提供 gke-onprem-secrets-user-cluster-1 命名空间中的以下 Secret 的密钥路径。
- stackdriver-service-account-credsSecret 的版本 2
- cloud-audit-logging-service-account-credsSecret 的版本 2
创建新的 Secret:
gkectl prepare secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG --secret-config secrets-2.yaml
列出管理员集群中准备好的 Secret:
gkectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG list secrets
输出示例:
The following secrets have been found:
- namespace: gke-onprem-secrets-user-cluster-1
  - secrets with name prefix: component-access-sa-creds
    name: component-access-sa-creds.1, version 1, age: 11h
  - secrets with name prefix: cloud-audit-logging-service-account-creds
    name: cloud-audit-logging-service-account-creds.1, version: 1, age: 11h
    name: cloud-audit-logging-service-account-creds.2, version: 2, age: 33m
  - secrets with name prefix: register-service-account-creds
    name: register-service-account-creds.1, version: 1, age: 11h
  - secrets with name prefix: stackdriver-service-account-creds
    name: stackdriver-service-account-creds.1, version: 1, age: 11h
    name: stackdriver-service-account-creds.2, version: 2, age: 33m
  - secrets with name prefix: vsphere-creds
    name: vsphere-creds.1, version: 1, age: 11h
在上面的输出结果中,您可以看到 stackdriver-service-account-creds Secret 有两个版本,cloud-audit-logging-service-account-creds Secret 也有两个版本。
轮替用户集群的凭据
本部分介绍如何轮替现有用户集群的选定凭据。
在轮替凭据之前,请检查在集群中使用的当前 Secret 版本:
gkectl list secrets cluster --cluster-name USER_CLUSTER_NAME kubeconfig ADMIN_CLUSTER_KUBECONFIG
输出示例:
The following prepared secrets have been used for cluster "user-cluster-1": - namespace: gke-onprem-secrets-user-cluster-1 secret: vsphere-creds.1, version: 1 secret: f5-creds.1, version: 1 secret: component-access-sa-creds.1, version 1 secret: register-service-account-creds.1, version: 1 secret: stackdriver-service-account-creds.1, version: 1 secret: cloud-audit-logging-service-account-creds.1, version: 1
将您的用户集群配置文件复制到名为 user-cluster-update.yaml 的文件中。
在 user-cluster-update.yaml 中,添加 serviceAccountKey 部分。例如,以下示例在 stackdriver 和 cloudAuditLogging 下包含 serviceAccountKey 部分:
stackdriver:
  projectID: "my-project-123"
  clusterLocation: "us-central1"
  serviceAccountKey:
    secretRef:
      version: "2"
cloudAuditLogging:
  projectID: "my-project-123"
  clusterLocation: "us-central-1"
  serviceAccountKey:
    secretRef:
      version: "latest"
上面的示例指定更新用户集群时,它会使用:
- stackdriver-service-account-credsSecret 的版本 2
- cloud-audit-logging-service-account-credsSecret 的最新版本。在此示例中,这是版本 2。
更新用户集群的凭据:
gkectl update credentials stackdriver --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config user-cluster-2.yaml gkectl update credentials cloudauditlogging --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config user-cluster-2.yaml
现在,用户集群使用以下准备好的 Secret:
- vsphere-creds的版本 1
- component-access-sa-creds的版本 1
- register-service-account-creds的版本 1
- stackdriver-service-account-creds的版本 2
- cloud-audit-logging-service-account-creds的版本 2
创建其他 Secret 和用户集群
如果您计划创建其他用户集群,请想想您希望如何组织准备好的 Secret。您可能希望在管理员集群中为每个用户集群创建单独的命名空间。或者,您可能希望为多个或所有用户集群共享相同的准备的 Secret 命名空间。
例如,假设 Alice、Bob 和 Carol 各有一个用户集群。您可以创建三个 Secret 组,如以下示例所示:
apiVersion: v1
kind: ClusterSecrets
secretGroups:
- namespace: "gke-onprem-secrets-alice"
  secrets:
    vCenter:
      username: "alice"
      password: "zC7r^URDPq2t"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "component-access-sa-a.json"
    registerServiceAccount:
      serviceAccountKeyPath: "register-sa-a.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-a.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-a.json"
- namespace: "gke-onprem-secrets-bob"
  secrets:
    vCenter:
      username: "bob"
      password: "zC8r^URDPq2t"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "component-access-sa-b.json"
    registerServiceAccount:
      serviceAccountKeyPath: "register-sa-b.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-b.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-b.json"
- namespace: "gke-onprem-secrets-carol"
  secrets:
    vCenter:
      username: "carol"
      password: "zC9r^URDPq2t"
    componentAccessServiceAccount:
      serviceAccountKeyPath: "component-access-sa-c.json"
    registerServiceAccount:
      serviceAccountKeyPath: "register-sa-c.json"
    stackdriverServiceAccount:
      serviceAccountKeyPath: "log-mon-sa-c.json"
    cloudAuditLoggingServiceAccount:
      serviceAccountKeyPath: "audit-log-sa-c.json"
随着时间的推移,您可以在每个 Secret 组中创建 Secret 的另一个版本。
在用户集群配置文件中,为 serviceAccountKey.secretRef.version 提供值以指定要使用的 Secret 版本。您可以将该值设置为 "latest"、空字符串或整数字符串。
例如,假设您所有的 Secret 都有版本 1、2 和 3。假设这是 Alice 的用户集群配置文件的一部分。
apiVersion: v1
kind: UserCluster
name: "user-cluster-alice"
preparedSecrets:
  namespace: "gke-onprem-secrets-alice"
...
vCenter:
  credentials:
gkeConnect:
  projectID: "project-a"
  serviceAccountKey:
    secretRef:
      version: "2"
stackdriver:
  projectID: "project-a"
  clusterLocation: "us-central1"
  serviceAccountKey:
    secretRef:
      version: "latest"
cloudAuditLogging:
  projectID: "project-a"
  clusterLocation: "us-central-1"
  serviceAccountKey:
    secretRef:
      version: ""
在前面的示例中,我们可以看到:
- 没有为 vCenter 指定 - secretRef,因此集群将使用- gke-onprem-secrets-alice命名空间中最新版本的- vsphere-credsSecret。
- 集群将使用 - gke-onprem-secrets-alice命名空间中- register-service-account-credsSecret 的版本 2。
- 集群将使用 - gke-onprem-secrets-alice命名空间中- stackdriver-service-account-credsSecret 的最新版本。在此示例中,最新版本是版本 3。
- cloudAuditLogging的版本是空字符串,因此集群将使用- gke-onprem-secrets-alice命名空间中- cloud-audit-logging-service-account-credsSecret 的最新版本。在此示例中,最新版本是版本 3。
- 没有为组件访问服务账号指定 - secretRef.version,因此集群将使用最新版本。
删除准备好的 Secret
如需列出所有准备好的 Secret 及其命名空间,请运行以下命令:
gkectl list secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG
如果准备好的 Secret 命名空间未被任何用户集群使用,您可以删除该命名空间。
如需删除准备好的 Secret 命名空间及其中的所有 Secret,请运行以下命令:
gkectl delete secret –namespace PREPARED_SECRET_NAMESPACE \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG
如果单个用户集群未使用任何准备好的 Secret,则可以删除 Secret。
如需删除单个准备的 Secret,请运行以下命令:
gkectl delete secret –namespace PREPARED_SECRET_NAMESPACE \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --secret-name SECRET