为用户集群配置准备好的凭据

本文档介绍如何在 GKE on VMware 中为用户集群配置准备好的凭据。

有了准备好的凭据,您就可以将用户集群的凭据存储在管理员集群内的 Secret 中。这样做可以提供安全保障,因为在创建用户集群时无需在管理员工作站上保留密码和服务账号密钥。

您可以提前在管理员集群中准备 Secret。然后,在创建用户集群时,您可以指定应从在管理员集群中准备好的 Secret 中获取某些凭据。您也可以在用户集群中轮替凭据时使用准备好的 Secret。

准备工作

如果您还没有管理员集群,请创建管理员集群

过程概览

  1. 填写 Secret 配置文件。

  2. 在管理员集群中,创建 Secret 组。每个 Secret 组都位于自己的 Kubernetes 命名空间中。

  3. 创建用户集群。在用户集群配置文件中,指明您希望从管理员集群内的特定命名空间中的 Secret 中获取凭据。

  4. 根据需要创建其他 Secret 组和其他版本的 Secret。

  5. 根据需要更新现有用户集群的凭据。

  6. 根据需要创建其他用户集群。在每个用户集群配置文件中,指定 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"

在用户集群配置文件中,请勿为以下字段指定值。您不需要这些字段,因为 GKE on VMware 会从您准备好的 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-creds Secret 的版本 2
  • cloud-audit-logging-service-account-creds Secret 的版本 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 部分。例如,以下示例在 stackdrivercloudAuditLogging 下包含 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-creds Secret 的版本 2

  • cloud-audit-logging-service-account-creds Secret 的最新版本。在此示例中,这是版本 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-creds Secret。

  • 集群将使用 gke-onprem-secrets-alice 命名空间中 register-service-account-creds Secret 的版本 2。

  • 集群将使用 gke-onprem-secrets-alice 命名空间中 stackdriver-service-account-creds Secret 的最新版本。在此示例中,最新版本是版本 3。

  • cloudAuditLogging 的版本是空字符串,因此集群将使用 gke-onprem-secrets-alice 命名空间中 cloud-audit-logging-service-account-creds Secret 的最新版本。在此示例中,最新版本是版本 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