為使用者叢集設定準備好的憑證

本文說明如何為 Google Distributed Cloud 中的使用者叢集設定準備好的憑證。

準備好憑證後,您就可以將使用者叢集的憑證儲存在管理員叢集的 Secrets 中。這樣做可確保安全,因為您不必在建立使用者叢集時,將密碼和服務帳戶金鑰保留在管理工作站上。

請注意,進階叢集有下列限制:

  • 1.31 版:進階叢集不支援準備好的憑證。
  • 1.32 以上版本:進階叢集支援準備好的憑證。

請預先在管理員叢集中準備密鑰。然後在建立使用者叢集時,您可以指定要從管理員叢集中準備好的 Secret 取得特定憑證。您也可以在使用者叢集中輪替憑證時,使用準備好的 Secrets。

事前準備

如果還沒有管理員叢集,請建立一個

程序總覽

  1. 填入 Secrets 設定檔。

  2. 在管理員叢集中建立密鑰群組。每個 Secret 群組都位於自己的 Kubernetes 命名空間中。

  3. 建立使用者叢集。在使用者叢集設定檔中,指出您希望從管理員叢集特定命名空間的密鑰取得憑證。

  4. 視需要建立其他密鑰群組和密鑰版本。

  5. 視需要更新現有使用者叢集的憑證。

  6. 視需要建立其他使用者叢集。在每個使用者叢集設定檔中,指定 Secrets 命名空間。您也可以指定要用於特定憑證的 Secret 版本。

填寫密鑰設定檔

產生 Secrets 設定檔的範本:

gkectl create-config secrets

上述指令會產生名為 secrets.yaml 的檔案。您可以視需要變更這個檔案的名稱和位置。

請先閱讀「Secrets 設定檔」文件,熟悉設定檔。建議您在另一個分頁或視窗中開啟這份文件。

在 Secrets 設定檔中,填入與您情況相關的值。你必須填入以 gke-onprem-secrets- 開頭的 namespace 值。

以下是 Secrets 設定檔範例,其中包含一個 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

在管理員叢集中建立準備好的密鑰:

gkectl prepare secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG --secret-config SECRETS_CONFIG

更改下列內容:

  • ADMIN_CLUSTER_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑

  • SECRETS_CONFIG:Secrets 設定檔的路徑

查看準備好的密鑰

在管理員叢集中列出準備好的密鑰:

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,列出命名空間中的密鑰。例如:

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 ...

在上述輸出內容中,您可以看到每個密鑰名稱都有擴充功能,指出密鑰版本。在本範例中,所有密鑰的版本都是 1。

建立使用者叢集

按照「建立使用者叢集」中的操作說明操作。

填寫使用者叢集設定檔時,請輸入 preparedSecrets.namespace 的值。這個值必須與您先前在 Secrets 設定檔中指定的命名空間相符。

範例:

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 版本。以下範例會為五個密鑰分別指定版本 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 的第 2 版。

建立名為 secrets-2.yaml 的新密鑰設定檔。指定現有命名空間,並提供所選 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 命名空間中下列 Secrets 的金鑰路徑。

  • 第 2 版 stackdriver-service-account-creds Secret
  • 第 2 版 cloud-audit-logging-service-account-creds Secret

建立新的 Secret:

gkectl prepare secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG --secret-config secrets-2.yaml

在管理員叢集中列出準備好的密鑰:

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"

上例指定更新使用者叢集時,將使用下列項目:

  • 第 2 版 stackdriver-service-account-creds Secret

  • 最新版本的 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 群組,如本例所示:

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"

隨著時間推移,您可以在每個密鑰群組中建立其他密鑰版本。

在使用者叢集設定檔中,提供 serviceAccountKey.secretRef.version 的值,指定要使用的 Secret 版本。您可以將值設為 "latest"、空字串或整數字串。

舉例來說,假設所有密鑰都有版本 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。

如要刪除個別準備好的密鑰,請按照下列步驟操作:

gkectl delete secret –namespace PREPARED_SECRET_NAMESPACE \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --secret-name SECRET