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

このドキュメントでは、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 の構成ファイルに、実際の状況に合う値を入力します。namespace には gke-onprem-secrets- で始まる値を記入する必要があります。

以下に、Secret のグループが 1 つ存在する Secret 構成ファイルの例を示します。グループには、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 を実行して、名前空間内の 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 の作成

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

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

上記の出力では、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 セクションを追加します。たとえば、次の例では stackdrivercloudAuditLoggingserviceAccountKey セクションがあります。

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 バージョン 2 の 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 を使用するようになりました。

  • バージョン 1 の vsphere-creds
  • バージョン 1 の component-access-sa-creds
  • バージョン 1 の register-service-account-creds
  • バージョン 2 の stackdriver-service-account-creds
  • バージョン 2 の cloud-audit-logging-service-account-creds

追加の Secret とユーザー クラスタを作成する

追加のユーザー クラスタを作成する予定がある場合は、準備した Secret の整理方法を検討してください。管理クラスタには、ユーザー クラスタごとに個別の名前空間を作成することができます。あるいは、複数またはすべてのユーザー クラスタに対して、同じ準備した Secret の名前空間を共有することもできます。

たとえば、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 名前空間内の最新バージョンの 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