ユーザー クラスタ用に用意された認証情報を構成する

このドキュメントでは、Google Distributed Cloud のユーザー クラスタに準備済みの認証情報を構成する方法について説明します。

準備済みの認証情報を使用すると、管理クラスタで Secret にユーザー クラスタ用の認証情報を保存できます。これにより、ユーザー クラスタを作成するときに、パスワードとサービス アカウント キーを管理ワークステーションに保持する必要がないため、セキュリティが強化されます。

Secret は、管理クラスタで事前に準備します。その後、ユーザー クラスタを作成する際、管理クラスタに準備済み Secret から特定の認証情報を取得するように指定できます。ユーザー クラスタで認証情報をローテーションするときに、準備済み Secret を使用することもできます。

始める前に

管理者クラスタを作成します(まだ作成していない場合)。

手順の概要

  1. Secret 構成ファイルに入力します。

  2. 管理クラスタで Secret のグループを作成します。各 Secret グループは独自の Kubernetes Namespace にあります。

  3. ユーザー クラスタを作成します。ユーザー クラスタの構成ファイルで、管理クラスタ内の特定の Namespace の Secret から認証情報を取得するように指定します。

  4. 必要に応じて、Secret グループと Secret のバージョンを追加します。

  5. 必要に応じて、既存のユーザー クラスタの認証情報を更新します。

  6. 必要に応じて、追加のユーザー クラスタを作成します。各ユーザー クラスタの構成ファイルで、Secret の Namespace を指定します。特定の認証情報に使用する Secret のバージョンを指定することもできます。

Secret 構成ファイルに入力する

Secret 構成ファイルのテンプレートを生成します。

gkectl create-config secrets

上記のコマンドにより、secrets.yaml という名前のファイルが生成されます。このファイルの名前と場所は、必要に応じて変更できます。

Secret 構成ファイルのドキュメントを読み、構成ファイルの内容を把握します。このドキュメントは、別のタブやウィンドウで開くこともできます。

Secret の構成ファイルに、実際の状況に合う値を入力します。namespace には gke-onprem-secrets- で始まる値を入力する必要があります。

以下の例では、Secret 構成ファイルに Secret のグループが 1 つ存在します。このグループには、vCenter 認証情報と 4 つのサービス アカウント キーの値があります。

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 を実行して、Namespace 内の 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 構成ファイルで前に指定した Namespace と一致する必要があります。

例:

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 を作成する

このセクションでは、既存の Namespace でバージョン 2 の Secret をいくつか作成する方法について説明します。

secrets-2.yaml という名前の新しい構成ファイルを作成します。既存の Namespace を指定し、選択した 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 Namespace 内の次の 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

上記の出力では、2 つのバージョンの stackdriver-service-account-creds Secret と 2 つのバージョンの 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.yamlserviceAccountKey セクションを追加します。たとえば、次の例では、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 をどのように整理するかを検討します。管理クラスタには、ユーザー クラスタごとに個別の Namespace を作成することができます。あるいは、複数またはすべてのユーザー クラスタに対して、同じ準備済み Secret の Namespace を共有することもできます。

たとえば、Alice、Bob、Carol のそれぞれがユーザー クラスタを持つとします。次の例に示すように、3 つの 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 Namespace 内の最新バージョンの vsphere-creds Secret を使用します。

  • クラスタは、gke-onprem-secrets-alice Namespace 内の register-service-account-creds Secret のバージョン 2 を使用します。

  • クラスタは、gke-onprem-secrets-alice Namespace 内の stackdriver-service-account-creds Secret の最新バージョンを使用します。この例では、バージョン 3 です。

  • cloudAuditLogging のバージョンは空の文字列であるため、クラスタは gke-onprem-secrets-alice Namespace 内の cloud-audit-logging-service-account-creds Secret の最新バージョンを使用します。この例では、バージョン 3 です。

  • コンポーネント アクセス サービス アカウントに secretRef.version が指定されていないため、クラスタは最新バージョンを使用します。

準備済み Secret を削除する

すべての準備済み Secret とその Namespace を一覧表示するには:

gkectl list secrets --kubeconfig ADMIN_CLUSTER_KUBECONFIG

準備済み Secret の Namespace がユーザー クラスタで使用されていない場合は、Namespace を削除できます。

準備済み Secret の Namespace と、その中のすべての 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