OpenStack に Google Distributed Cloud クラスタをデプロイする

このガイドでは、サポートされているオペレーティング システムを搭載した OpenStack 仮想マシン(VM)に Google Distributed Cloud をデプロイする例について説明します。このデプロイでは、スクリプトを使用して OpenStack VM へのハイブリッド クラスタのインストールを簡素化します。また、サービスとしてのロード バランシング(LBaaS)を有効にする方法の一つについても説明します。Google Distributed Cloud で OpenStack LBaaS と Kubernetes OpenStack クラウド プロバイダを使用すると、Kubernetes サービスを OpenStack クラスタの外部に公開できます。

Google Distributed Cloud は、OpenStack VM を自動的にプロビジョニングしません。また、VM のプロビジョニングはこのガイドの範囲外です。VM の要件とデプロイの例を確認するには、OpenStack VM を作成する Terraform の例をご覧ください。

このガイドは、次のセクションで構成されています。

  1. Google Distributed Cloud をデプロイする

  2. Google Distributed Cloud で Kubernetes 用の OpenStack Cloud Provider を構成して、Octavia ロードバランサと統合する

  3. Kubernetes 用の OpenStack Cloud Provider の統合を検証する

このガイドでは OpenStack Ussuri を使用しますが、Google Distributed Cloud に OpenStack の特定のバージョンに対する要件はありません。このガイドでは、OpenStack VM を使用して、OpenStack で動作する 2 ノードの Google Distributed Cloud 概念実証環境を提供します。高可用性コントロール プレーンがある本番環境の作成については、本番環境の要件に関する Google Distributed Cloud のドキュメントをご覧ください。

デプロイの例

このガイドでは、OpenStack LBaaS と統合される OpenStack に Google Distributed Cloud をデプロイする例を示します。コマンドと構成値を理解し、OpenStack 環境に合うように調整する必要があります。次の図は、デプロイの結果を示しています。

OpenStack にインストールされた Google Distributed Cloud。

前提条件

  • LBaaS v2 がデプロイされ、機能している OpenStack Ussuri
  • bmctl ツールをダウンロードするためのサービス アカウント
  • デプロイの例に示すように、OpenStack VM とネットワークを構成する。OpenStack 環境で同様の設定をプロビジョニングする場合は、次の方法があります。
    1. Terraform スクリプトを使用して、リソースを自動的にプロビジョニングする。
    2. リソースを手動でプロビジョニングする。
  • 次の OpenStack VM を準備し、SSH 経由で使用できる状態にしておく必要があります。
名前 IP アドレス 目的
abm-ws 10.200.0.10 (プライベート IP)
float_ip (パブリック IP)
管理ワークステーションとして機能: Google Distributed Cloud を他のマシンにデプロイするために使用されます。
abm-cp1 10.200.0.11 Anthos クラスタ コントロール プレーン: このホストは、Kubernetes コントロール プレーンとロードバランサを実行します。
abm-w1 10.200.0.12 GKE クラスタのワーカーノード: このホストは Kubernetes ワークロードを実行します。

Google Distributed Cloud をデプロイする

このセクションでは、次のタスクを行う方法を説明します。

  1. 必要なツールを abm-ws 管理ワークステーション VM にインストールする
  2. デプロイを安全に実行するために必要なプロジェクト ID とサービス アカウントを構成する
  3. クラスタ構成ファイルを作成する
  4. クラスタを作成する

必要なツールをインストールする

  1. abm-ws VM のパブリック フローティング IP アドレスを取得します。

    export OPENSTACK_IPS=$(openstack floating ip list --tags=abm_ws_floatingip -f json)
    export FLOATING_IP=$(jq -c '.[]."Floating IP Address"' <<< $OPENSTACK_IPS | tr -d '"')
    
  2. SSH を使用して abm-ws VM に安全に接続し、root ユーザーとしてログインできることを確認します。Terraform スクリプト で構成された root ユーザーは abm です。

    ssh ubuntu@$FLOATING_IP
    sudo -u abm -i
    
  3. SSH を使用して他のノードに接続できることを確認します。

    ssh abm@10.200.0.11 'echo SSH to $HOSTNAME succeeded'
    ssh abm@10.200.0.12 'echo SSH to $HOSTNAME succeeded'
    

    上記のコマンドで想定されるレスポンスは次のとおりです。

    SSH to abm-cp1 succeeded
    SSH to abm-w1 succeeded
    
  4. abm-ws VM に kubectl コマンドライン ユーティリティをダウンロードします。

    curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
    chmod +x kubectl
    sudo mv kubectl /usr/local/sbin/
    
  5. abm-ws VM に Docker をインストールします。

    curl -fsSL https://get.docker.com -o get-docker.sh
    sh get-docker.sh
    sudo usermod -aG docker abm
    newgrp docker
    

Google Cloud プロジェクトとサービス アカウントを構成する

  1. ユーザー アカウントの Google Cloud CLI アクセス認証情報を取得します。

    これらの認証情報は、後続の gcloud コマンドで使用されます。

    gcloud auth login
    
  2. Google Distributed Cloud を登録する Google Cloud プロジェクトを使用するように Google Cloud CLI を構成します。

    gcloud config set project PROJECT_ID
    
  3. 管理ワークステーションで、ユーザー アカウントにアプリケーションのデフォルト認証情報(ADC)をします。これは、クラスタの作成に bmctl ツールを使用するときに使用されます。

    gcloud auth application-default login
    
  4. bm-gcr サービス アカウントを作成します。このサービス アカウントを使用して、Google Distributed Cloud クラスタから認証を行います。

    gcloud iam service-accounts create bm-gcr
    gcloud iam service-accounts keys create bm-gcr.json \
        --iam-account=bm-gcr@PROJECT_ID.iam.gserviceaccount.com
    
  5. 必要な API を有効にします。

    gcloud services enable \
        anthos.googleapis.com \
        anthosaudit.googleapis.com \
        anthosgke.googleapis.com \
        cloudresourcemanager.googleapis.com \
        connectgateway.googleapis.com \
        container.googleapis.com \
        gkeconnect.googleapis.com \
        gkehub.googleapis.com \
        gkeonprem.googleapis.com \
        iam.googleapis.com \
        logging.googleapis.com \
        monitoring.googleapis.com \
        opsconfigmonitoring.googleapis.com \
        serviceusage.googleapis.com \
        stackdriver.googleapis.com \
        storage.googleapis.com
    
  6. bm-gcr サービス アカウントに追加の権限を付与します。権限を追加することで、サービスごとに複数のサービス アカウントを作成する必要がなくなります。

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.connect"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/gkehub.admin"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/logging.logWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/monitoring.dashboardEditor"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/stackdriver.resourceMetadata.writer"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member="serviceAccount:bm-gcr@PROJECT_ID.iam.gserviceaccount.com" \
      --role="roles/opsconfigmonitoring.resourceMetadata.writer"
    

クラスタ構成ファイルを作成する

  1. bmctl コマンドライン ユーティリティをダウンロードします。

    mkdir baremetal && cd baremetal
    gcloud storage cp gs://anthos-baremetal-release/bmctl/1.30.200-gke.101/linux-amd64/bmctl .
    chmod a+x bmctl
    sudo mv bmctl /usr/local/sbin/
    
  2. クラスタに Google Distributed Cloud ワークスペースを作成します。

    bmctl create config -c CLUSTER_NAME
    
  3. Google Distributed Cloud クラスタの構成ファイルを作成します。

    cat > bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME.yaml << EOB
    ---
    gcrKeyPath: /home/abm/bm-gcr.json
    sshPrivateKeyPath: /home/abm/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath: /home/abm/bm-gcr.json
    gkeConnectRegisterServiceAccountKeyPath: /home/abm/bm-gcr.json
    cloudOperationsServiceAccountKeyPath: /home/abm/bm-gcr.json
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: openstack-cluster-ns
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: openstack-cluster-ns
      annotations:
        baremetal.cluster.gke.io/external-cloud-provider: "true"
    spec:
      type: hybrid
      anthosBareMetalVersion: 1.30.200-gke.101
      gkeConnect:
        projectID: PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: CLUSTER_NAME
          nodes:
          - address: 10.200.0.11
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.168.0.0/16
        services:
          cidrBlocks:
          - 10.96.0.0/20
      loadBalancer:
        mode: manual
        ports:
          controlPlaneLBPort: 443
        vips:
          controlPlaneVIP: 10.200.0.101
          ingressVIP: 10.200.0.102
      clusterOperations:
        location: us-central1
        projectID: PROJECT_ID
      storage:
        lvpNodeMounts:
          path: /mnt/localpv-disk
          storageClassName: node-disk
        lvpShare:
          numPVUnderSharedPath: 5
          path: /mnt/localpv-share
          storageClassName: standard
      nodeAccess:
        loginUser: abm
    
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: node-pool-1
      namespace: openstack-cluster-ns
    spec:
      clusterName: CLUSTER_NAME
      nodes:
      - address: 10.200.0.12
    EOB
    

クラスタを作成する

  1. クラスタを作成します。

    bmctl create cluster -c CLUSTER_NAME
    

bmctl コマンドを実行すると、新しいハイブリッド クラスタの設定が開始します。ノードでのプリフライト チェック、管理クラスタとユーザー クラスタの作成、Connect を使用した Google Cloud へのクラスタの登録が行われます。設定全体で 15 分ほどかかります。クラスタの作成中は次の出力が表示されます。

Please check the logs at bmctl-workspace/CLUSTER_NAME/log/create-cluster-20210926-020741/create-cluster.log
[2021-09-26 02:07:59+0000] Creating bootstrap cluster...  kind get kubeconfig --name bmctl > ~/.kube/config && k get pods --all-namespaces
[2021-09-26 02:07:59+0000] Creating bootstrap cluster... OK
[2021-09-26 02:10:48+0000] Installing dependency components... OK
[2021-09-26 02:13:42+0000] Waiting for preflight check job to finish... OK
[2021-09-26 02:15:22+0000] - Validation Category: machines and network
[2021-09-26 02:15:22+0000]  - [PASSED] gcp
[2021-09-26 02:15:22+0000]  - [PASSED] node-network
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.11-gcp
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12
[2021-09-26 02:15:22+0000]  - [PASSED] 10.200.0.12-gcp
[2021-09-26 02:15:22+0000] Flushing logs... OK
[2021-09-26 02:15:23+0000] Applying resources for new cluster
[2021-09-26 02:15:24+0000] Waiting for cluster to become ready OK
[2021-09-26 02:25:04+0000] Writing kubeconfig file
[2021-09-26 02:25:04+0000] kubeconfig of created cluster is at bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig, please run
[2021-09-26 02:25:04+0000] kubectl --kubeconfig bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig get nodes
[2021-09-26 02:25:04+0000] to get cluster node status.
[2021-09-26 02:25:04+0000] Please restrict access to this file as it contains authentication credentials of your cluster.
[2021-09-26 02:25:04+0000] Waiting for node pools to become ready OK
[2021-09-26 02:25:24+0000] Moving admin cluster resources to the created admin cluster
[2021-09-26 02:25:53+0000] Flushing logs... OK
[2021-09-26 02:25:53+0000] Deleting bootstrap cluster...

クラスタの確認と操作

クラスタの kubeconfig ファイルは、abm-ws VM の bmctl-workspace ディレクトリ内にあります。デプロイを確認するには、次の操作を行います。

  1. KUBECONFIG 環境変数にクラスタの構成ファイルのパスを設定し、クラスタで kubectl コマンドを実行します。

    export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    kubectl get nodes
    

    クラスタのノードが次のように表示されます。

    NAME      STATUS   ROLES                  AGE     VERSION
    abm-cp1   Ready    control-plane,master   5m24s   v1.20.5-gke.1301
    abm-w1    Ready    <none>                 2m17s   v1.20.5-gke.1301
    

Google Cloud コンソールからクラスタにログインする

Google Cloud コンソールでワークロードをモニタリングするには、クラスタにログインする必要があります。クラスタへのログインの手順と詳細については、Google Cloud コンソールからクラスタを操作するをご覧ください。

クリーンアップ

クラスタをクリーンアップするには、管理ワークステーション(abm-ws)VM で次のコマンドを実行します。

export KUBECONFIG=$HOME/bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
bmctl reset --cluster CLUSTER_NAME

次のステップ