Terraform を使用して管理クラスタを作成する

Terraform を使用して Google Cloud とオンプレミス VMware リソースを管理している場合は、Terraform を使用して VMware 用の Google Distributed Cloud ソフトウェア専用の管理クラスタを作成します。gkectl または Google Cloud コンソールを使用して管理クラスタを作成することもできます。

始める前に

  • 管理ワークステーションを作成するの説明に従って、管理ワークステーションを設定してログインできることを確認します。

  • サービス アカウントの JSON 鍵ファイルが管理ワークステーションにあることを確認します。

  • IP アドレス計画のドキュメントを確認します。3 つのコントロールプレーン ノードとコントロールプレーンの VIP に十分な IP アドレスが利用できることを確認します。kubeception ユーザー クラスタを作成する場合は、それらのユーザー クラスタのコントロール プレーン ノードに十分な数の IP アドレスが利用できる必要があります。

  • ロード バランシングの概要を参照して、使用するロードバランサの種類を再度確認します。手動のロードバランサについては、管理クラスタを作成する前にロードバランサを設定する必要があります。

  • gkectl を使用して管理クラスタを作成する場合は、Google Distributed Cloud コンポーネントに公開レジストリと非公開レジストリのどちらを使用するかを決定します。非公開 Docker レジストリの使用については、privateRegistry をご覧ください。Terraform と Google Cloud コンソールのどちらでも、システム コンポーネントに非公開 Docker レジストリを使用することはできません。

  • 管理クラスタノードで実行するオペレーティング システムのタイプを決定します。

  • 組織でアウトバウンド トラフィックがプロキシ サーバーを通過する必要がある場合は、必要な API と Artifact Registry のアドレスを許可リストに登録してください。

  • バージョン 1.29 以降では、サーバーサイドのプリフライト チェックはデフォルトで有効になっています。サーバーサイドのプリフライト チェックには、追加のファイアウォール ルールが必要です。管理クラスタのファイアウォール ルールで、[プリフライト チェック] を検索し、必要なファイアウォール ルールがすべて構成されていることを確認します。サーバーサイドのプリフライト チェックは、管理ワークステーションでローカルではなく、ブートストラップ クラスタで実行されます。

手順の概要

管理クラスタを作成する前に、管理ワークステーションで gkectl register bootstrap コマンドを実行する必要があります。このコマンドにより、管理ワークステーションに Kubernetes in Docker(kind)クラスタがデプロイされます。このブートストラップ クラスタは、管理クラスタの作成に必要な Kubernetes コントローラをホストします。管理クラスタを作成すると、ブートストラップ クラスタのコントローラによりノードがプロビジョニングされ、プリフライト チェックが実行されて、管理クラスタがフリートに登録されます。管理クラスタが正常に作成されると、ブートストラップ クラスタは自動的に削除されます。

Terraform を使用して管理クラスタを作成する大まかな手順は次のとおりです。

  1. 構成ファイルに入力します。google_gkeonprem_vmware_admin_cluster リソースと次の例を使用して、main.tf 構成ファイルを作成します。

  2. bootstrap クラスタを作成します。gkectl register bootstrap を実行してブートストラップ クラスタを作成します。コマンドでブートストラップ クラスタの作成が完了すると、管理クラスタの構成を完了するよう求めるメッセージが出力に表示されます。このプロセスは、管理クラスタが作成されるまで継続します。

  3. 管理クラスタを作成します。別のターミナル ウィンドウまたは GKE On-Prem API にアクセスできる別のコンピュータで、terraform コマンドを実行して、完成した main.tf 構成ファイルで指定されているように新しい管理クラスタを作成します。

構成ファイルに入力する

次の例は、MetalLB を使用して 3 つのコントロール プレーン ノードを持つ高可用性(HA)管理クラスタを作成する方法を示しています。1.28 以降では、新しい管理クラスタは高可用性である必要があります。この要件のため、control_plane_node.replicas を 3 に設定する必要があります。

詳細とその他の例については、google_gkeonprem_vmware_admin_cluster リファレンス ドキュメントをご覧ください。 システム イメージに非公開レジストリを使用する方法については、非公開コンテナ レジストリを構成するをご覧ください。

次の例のプレースホルダ変数に値を入力し、main.tf にコピーして貼り付けます。gkeadm を使用して管理ワークステーションを作成した場合は、管理ワークステーションの構成ファイルを開き、vCenter セクションの値を対応するプレースホルダ変数にコピーします。

resource "google_gkeonprem_vmware_admin_cluster" "admin-cluster-metallb" {
  provider = google-beta
  name = "ADMIN_CLUSTER_NAME"
  project = "PROJECT_ID"
  location = "REGION"
  description = "DESCRIPTION"
  bootstrap_cluster_membership = "projects/PROJECT_ID/locations/REGION/memberships/bootstrap-ADMIN_CLUSTER_NAME"
  on_prem_version = "VERSION"
  image_type = "IMAGE_TYPE"
  vcenter {
    address = "VCENTER_ADDRESS"
    datacenter = "DATA_CENTER"
    cluster = "VCENTER_CLUSTER"
    resource_pool = "RESOURCE_POOL"
    datastore = "DATASTORE"
    ca_cert_data = "CA_CERT_DATA"
  }
  network_config {
    service_address_cidr_blocks = ["10.96.232.0/24"]
    pod_address_cidr_blocks = ["192.168.0.0/16"]
    vcenter_network = "NETWORK"
    dhcp_ip_config {
      enabled = true
    }
    host_config {
      dns_servers = ["DNS_SERVERS"]
      ntp_servers = ["NTP_SERVERS"]
    }
    ha_control_plane_config {
      control_plane_ip_block {
        gateway = "GATEWAY"
        netmask = "NETMASK"
        ips {
          hostname = "CONTROL_PLANE_HOST_1"
          ip       = "CONTROL_PLANE_NODE_IP_1"
        }
        ips {
          hostname = "CONTROL_PLANE_HOST_2"
          ip       = "CONTROL_PLANE_NODE_IP_2"
        }
        ips {
          hostname = "CONTROL_PLANE_HOST_3"
          ip       = "CONTROL_PLANE_NODE_IP_3"
        }
      }
    }
  }
  control_plane_node {
     cpus = NUM_CPUS
     memory = MEMORY
     replicas = 3
  }
  load_balancer {
    vip_config {
      control_plane_vip = "CONTROL_PLANE_VIP"
    }
    metal_lb_config {
      enabled = true
    }
  }
}

次のように置き換えます。

  • ADMIN_CLUSTER_NAME: 管理クラスタの名前。 名前の最大文字数は 20 文字です。

  • PROJECT_ID: Google Cloud プロジェクト ID。

  • REGION: GKE On-Prem API(gkeonprem.googleapis.com)、フリート サービス(gkehub.googleapis.com)、Connect サービス(gkeconnect.googleapis.com)が実行される Google Cloud リージョン。us-west1 または別のサポートされているリージョンを指定します。

    location フィールドは、gkectl register bootstrap コマンドの --location フラグに対応します。

  • DESCRIPTION: 管理クラスタの説明。

  • VERSION: クラスタの Google Distributed Cloud のバージョン。Terraform を使用したクラスタの作成は、バージョン 1.28 以降でのみサポートされています。ここで指定するバージョンは、gkectl register bootstrap コマンドの --bundle-path フラグで指定するバンドルのバージョンと一致する必要があります。バージョンのリストについては、Google Distributed Cloud のバージョンをご覧ください。

  • IMAGE_TYPE: 管理クラスタノードで実行する OS イメージのタイプ。ubuntu_containerdcosubuntu_cgv2cos_cgv2 のいずれかを指定します。

  • VCENTER_ADDRESS: vCenter Server のアドレス

    • 管理ワークステーションの構成ファイル: vCenter.credentials.address フィールドの値を使用します。

    • vcenter.address フィールドは、gkectl register bootstrap コマンドの --vcenter-address フラグに対応します。

  • DATA_CENTER: vCenter データセンターの名前。

    • 管理ワークステーションの構成ファイル: vCenter.datacenter フィールドの値を使用します。

    • vcenter.datacenter フィールドは、gkectl register bootstrap コマンドの --vcenter-datacenter フラグに対応します。

  • VCENTER_CLUSTER: vCenter クラスタの名前。

    • 管理ワークステーションの構成ファイル: vCenter.cluster フィールドの値を使用します。

    • vcenter.cluster フィールドは、gkectl register bootstrap コマンドの --vcenter-cluster フラグに対応します。

  • RESOURCE_POOL: vCenter リソースプールの名前またはパス。

    • 管理ワークステーションの構成ファイル: vCenter.resourcePool フィールドの値を使用します。

    • vcenter.resource_pool フィールドは、gkectl register bootstrap コマンドの --vcenter-resource-pool フラグに対応します。

  • DATASTORE: vCenter データストアの名前。指定する値は、パスではなく、名前にする必要があります。パスを入力する必要がある場合は、次のフィールドを追加します。folder = "FOLDER"

    • 管理ワークステーションの構成ファイル: vCenter.datastore フィールドの値を使用します。

    • vcenter.datastore フィールドは、gkectl register bootstrap コマンドの --vcenter-datastore フラグに対応します。

    クラスタノードに VM ストレージ ポリシーを使用する場合は、vcenter.datastore フィールドを削除し、代わりに vcenter.storage_policy_name を追加します。さらに、gkectl register bootstrap コマンドに --vcenter-storage-policy フラグを追加します。vcenter.datastore または vcenter.storage_policy_name のいずれかの値を指定する必要があります。両方を指定することはできません。

  • FOLDER: クラスタ VM が配置される vCenter フォルダの名前。フォルダを使用していない場合は、このフィールドを削除します。

    • 管理ワークステーションの構成ファイル: vCenter.folder フィールドの値を使用します。

    • vcenter.folder フィールドは、gkectl register bootstrap コマンドの --vcenter-folder フラグに対応します。

  • CA_CERT_DATA: PEM 形式の vCenter CA 証明書。ただし、すべての改行が文字列 \n に置き換えられています。

    1. 次のコマンドを実行して、改行を \n に置き換えます。

      awk 'ORS="\\n" {print}' CA_CERT_PATH_LOCAL
      

      CA_CERT_PATH_LOCAL は、vCenter Server のルート CA 証明書のパスに置き換えます。gkeadm を使用して管理ワークステーションを作成した場合は、管理ワークステーション構成ファイルの caCertPath フィールドの値(ローカル コンピュータ上のパス)を使用できます。gkeadm が、CA 証明書ファイルを管理ワークステーションにコピーします。管理ワークステーションのパスは、gkectl register bootstrap コマンドの --vcenter-ca-cert-path フラグで指定する必要があります。

    2. 前のコマンドの出力をコピーし、CA_CERT_DATA プレースホルダ変数に貼り付けます。

  • NETWORK: vCenter ネットワークの名前。

    • 管理ワークステーションの構成ファイル: vCenter.network フィールドの値を使用します。

    • network_config.vcenter_network フィールドは、gkectl register bootstrap コマンドの --vcenter-network フラグに対応します。

  • GATEWAY: コントロール プレーン クラスタノードがあるサブネットのデフォルト ゲートウェイの IP アドレス。

  • NETMASK: コントロール プレーン クラスタノードがあるサブネットのネットマスク。

  • DNS_SERVERS: DNS サーバーの IP アドレス。

  • NTP_SERVERS: 時刻(NTP)サーバーの IP アドレス。

  • control_plane_ip_block.ips セクションに、3 つのコントロール プレーン ノードの IP アドレスと、必要に応じてホスト名を入力します。ホスト名を入力しない場合は、構成から hostname フィールドを削除します。

  • NUM_CPUS: 管理クラスタの各コントロール プレーン ノードの vCPU 数。4 以上の値にする必要があります。

  • MEMORY: 管理クラスタの各コントロール プレーン ノードのメモリ容量(MiB)。8,192 以上にする必要があります。推奨値は 16,384 です。

  • CONTROL_PLANE_VIP: 管理クラスタの Kubernetes API サーバー用にロードバランサで構成するために選択した IP アドレス。

省略可: 非公開レジストリを構成する

デフォルトでは、クラスタの作成またはアップグレード時に、Google Distributed Cloud はコンポーネント アクセス サービス アカウントを使用して gcr.io/gke-on-prem-release からシステム イメージを pull します。必要に応じて、独自の Container Registry サーバーを指定し、システム イメージが非公開レジストリ サーバーから pull されるようにすることもできます。

非公開レジストリを構成する手順は次のとおりです。

  1. 管理クラスタの構成ファイルに以下を追加します。

    private_registry_config {
      address = "ADDRESS"
      ca_cert = "CA_CERT"
    }
    

    次のように置き換えます。

    • ADDRESS: 非公開レジストリを実行するマシンの IP アドレスまたは FQDN(完全修飾ドメイン名)。

    • CA_CERT: 公開鍵の CA 証明書データ。ただし、すべての改行が文字列 \n に置き換えられています。

    1. 次のコマンドを実行して、改行を \n に置き換えます。

      awk 'ORS="\\n" {print}' PUBLIC_KEY_PATH
      

      PUBLIC_KEY_PATH は、公開鍵のパスに置き換えます。

    2. 前のコマンドの出力をコピーし、プレースホルダ変数 CA_CERT に貼り付けます。

  2. ネットワークがプロキシ サーバー経由である場合は、次を追加します。

    proxy {
      url: "PROXY_SERVER_ADDRESS"
      no_proxy: "BYPASS_LIST"
    }
    

    次のように置き換えます。

    • PROXY_SERVER_ADDRESS: プロキシ サーバーの HTTP アドレス。スキームのデフォルト ポートと同じ場合でも、ポート番号を含めます。

    • BYPASS_LIST: プロキシ サーバーを経由しない IP アドレス、IP アドレス範囲、ホスト名、ドメイン名のカンマ区切りのリスト。

    例:

    url: "http://my-proxy.example.local:80"
    no_proxy: "192.0.2.0/24,my-host.example.local,198.51.100.0"
    

    Google Distributed Cloud がこれらのアドレス、ホスト、ドメインのいずれかにリクエストを送信する場合、そのリクエストはプロキシ サーバーをバイパスして宛先に直接送信されます。

非公開レジストリの使用方法(標準クラスタと高度なクラスタの違いなど)については、非公開コンテナ レジストリを構成するをご覧ください。

構成ファイルとプランを確認する

main.tf が配置されているディレクトリで、次のコマンドを実行します。

  1. Terraform を初期化します。

    terraform init
    

    Terraform によって、 Google Cloud プロバイダなどの必要なライブラリがインストールされます。必要に応じて maint.tf のエラーを修正します。

  2. Terraform プランを作成します。

    terraform plan -out tfplan
    

    構成を確認し、必要に応じて変更を加えます。

プランを適用する前に、次のセクションで説明するように、まずブートストラップ クラスタを作成する必要があります。

ブートストラップ クラスタを作成する

gkectl register bootstrap コマンドを実行すると、vCenter アカウントのユーザー名とパスワードの入力を求めるメッセージが表示されます。使用可能な認証情報があることを確認します。gkeadm を使用して管理ワークステーションを作成した場合、ユーザー名とパスワードは credential.yaml ファイルにあります。

  1. SSH を使用して管理ワークステーションにログインします。

  2. Google Cloud CLI に対して認証を行います。

    gcloud auth login
    
  3. 次のコマンドを実行して、ブートストラップ クラスタを作成します。フラグの値の多くは、main.tf フィールドと同じです。ただし、このコマンドは追加の値を取ります。この値は、指定されたプレースホルダ変数で指定する必要があります。

    gkectl register bootstrap \
        --target-cluster-name=ADMIN_CLUSTER_NAME \
        --project-id=PROJECT_ID \
        --location=REGION \
        --vcenter-address=VCENTER_ADDRESS \
        --vcenter-datacenter=DATA_CENTER \
        --vcenter-cluster=VCENTER_CLUSTER \
        --vcenter-resource-pool=RESOURCE_POOL \
        --vcenter-datastore=DATASTORE \
        --vcenter-network=NETWORK \
        --vcenter-ca-cert-path=CA_CERT_PATH \
        --bundle-path=BUNDLE_PATH \
        --component-access-service-account-key-path=COMPONENT_ACCESS_SA_PATH \
        --register-service-account-key-path=CONNECT_REGISTER_SA_PATH \
        --stackdriver-service-account-key-path=LOG_MON_SA_PATH \
        --cloud-audit-logging-service-account-key-path=CLOUD_AUDIT_SA_PATH \
        --admin-kubeconfig-out=KUBECONFIG_NAME
    

    次のパスを管理ワークステーションのパスに置き換えます。

    • CA_CERT_PATH: vCenter Server のルート CA 証明書のパス。
    • BUNDLE_PATH: バンドル ファイルのパス。gkeadm を使用して管理ワークステーションを作成した場合、バンドル ファイルは /var/lib/gke/bundles/ にあります。ファイル名は Google Distributed Cloud のバージョンによって異なります(例: gke-onprem-vsphere-1.31.0-gke.889-full.tgz)。
    • COMPONENT_ACCESS_SA_PATH: コンポーネント アクセス サービス アカウントの鍵ファイルのパス。
    • CONNECT_REGISTER_SA_PATH: connect-register サービス アカウントの鍵ファイルのパス。
    • LOG_MON_SA_PATH: ロギング モニタリング サービス アカウントの鍵ファイルのパス。
    • CLOUD_AUDIT_SA_PATH: 監査ロギング サービス アカウントのパス。監査ロギング サービス アカウントを作成していない場合は、logging-monitoring サービス アカウントの鍵ファイルのパスを指定します。
    • KUBECONFIG_NAME: gkectl register bootstrap コマンドで作成する kubeconfig ファイルの名前。このフラグを指定しない場合、コマンドは現在の作業ディレクトリに kubeconfig という名前のファイルを作成します。kubeconfig という名前の既存のファイルがある場合、コマンドはそのファイルを上書きします。

    必要に応じて、次のフラグに合わせてコマンドを変更します。

    • main.tf でフォルダを指定した場合は、--vcenter-folder=FOLDER フラグを追加します。
    • main.tf で VM ストレージ ポリシーを指定した場合は、--vcenter-datastore を削除し、--vcenter-storage-policy-name=STORAGE_POLICY_NAME フラグを追加します。
    • 管理ワークステーションがプロキシ サーバーの背後にあるネットワーク上にある場合は、次のフラグを追加します。

      • --proxy-url=PROXY_URL
      • --no-proxy=NO_PROXY

      次のように置き換えます。

      • PROXY_URL: プロキシ サーバーの URL。
      • NO_PROXY: プロキシ処理から除外するドメインと IP アドレスの値をカンマ区切りで指定します。

    フラグを追加する場合は、コマンドライン継続文字のバックスラッシュ文字(\)を追加してください。

  4. プロンプトが表示されたら、vCenter のユーザー名を入力します(またはコピーして貼り付けます)。ユーザー名は画面にエコーバックされません。

  5. プロンプトが表示されたら、vCenter パスワードを入力します(またはコピーして貼り付けます)。パスワードは画面にエコーバックされません。

このコマンドは、多数の検証を実行します。gkectl がブートストラップ クラスタの作成に成功すると、次のような出力が表示されます(読みやすさのために短くしています)。

Running workstation validations
- Validation Category: Workstation
    - [SUCCESS] Workstation OS
    - [SUCCESS] Workstation Hardware
    - [SUCCESS] Workstation Package
    - [SUCCESS] Workstation NTP
    - [SUCCESS] Workstation Docker
...
All validation results were SUCCESS.
Unpacking GKE on-prem bundle: /var/lib/gke/bundles/gke-onprem-vsphere-1.31.0-gke.889-full.tgz
...
Successfully created and registered the bootstrap cluster
...
Waiting for preflight checks to run or OnPremAdminCluster to be applied...... -

このプロセスは、管理クラスタが作成されるまで継続します。

管理クラスタが作成される前に gkectl register bootstrap コマンドを終了すると、管理クラスタの作成が失敗します。その場合、次のコマンドを使用してブートストラップ クラスタを削除する必要があります。

gkectl delete bootstrap \
    --target-cluster-name=ADMIN_CLUSTER_NAME \
    --project-id=PROJECT_ID \
    --location=REGION \
     --register-service-account-key-path=CONNECT_REGISTER_SA_PATH

管理クラスタを作成する

Terraform プランを適用して、管理クラスタを作成します。

terraform apply "tfplan"

クラスタの作成には 15 分以上かかります。クラスタは、 Google Cloud コンソールの [GKE クラスタ] ページで確認できます。

管理クラスタに接続する

gkectl register bootstrap コマンドにより、管理ワークステーションに管理クラスタの kubeconfig ファイルが作成されます。gkectl register bootstrap の実行時に --admin-kubeconfig-out フラグを指定しなかった場合、コマンドを実行したディレクトリに kubeconfig という kubeconfig ファイルが作成されます。

この kubeconfig にはクラスタの認証情報が含まれているため、アクセスを制限する必要があります。

また、Connect Gateway を介して読み取り専用の kubectl コマンドを実行することもできます。

  1. gcloud CLI がインストールされている PC で次のコマンドを実行して、Connect Gateway 経由でクラスタにアクセスできる kubeconfig エントリを取得します。

    gcloud container fleet memberships get-credentials ADMIN_CLUSTER_NAME \
        --project=PROJECT_ID
    

    出力は次のようになります。

    Starting to build Gateway kubeconfig...
    Current project_id: PROJECT_ID
    A new kubeconfig entry "connectgateway_PROJECT_ID_global_ADMIN_CLUSTER_NAME" has been generated and set as the current context.
    
  2. これで、Connect Gateway を介して、次のような読み取り専用の kubectl コマンドを実行できるようになりました。

    kubectl get pods -A
    

    管理クラスタに対する完全な管理者権限が必要な場合は、Connect Gateway を設定するをご覧ください。