エッジに Google Distributed Cloud Virtual for Bare Metal クラスタをデプロイする

このチュートリアルでは、GKE on Bare Metal と Config Management を使用して Kubernetes クラスタをエッジに大規模にデプロイするための、すぐに利用できるソリューションを紹介します。このチュートリアルは、プラットフォーム オペレータ―とデベロッパーを対象としています。次のテクノロジーとコンセプトについて理解している必要があります。

このチュートリアルでは、Compute Engine 仮想マシン(VM)を使用して、エッジにデプロイされたノードと、エッジ ワークロードとしてのサンプル POS アプリケーションをエミュレートします。GKE on Bare Metal と Config Management により、エッジクラスタを一元管理できます。Config Management は GitHub から新しい構成を動的に pull し、これらのポリシーと構成をクラスタに適用します。

エッジ デプロイ アーキテクチャ

小売業のエッジデプロイは、一般的な GKE on Bare Metal のデプロイで使用されているアーキテクチャを説明する良い方法です。

小売店の実店舗は、企業の事業部門と消費者の間の最も近い接点です。店舗内のソフトウェア システムは、企業の中央管理システムから分離して、ワークロードを実行し、更新をタイムリーに受け取り、重要な指標を報告する必要があります。さらに、これらのソフトウェア システムは、将来より多くの店舗に拡張できるように設計する必要があります。GKE on Bare Metal は、店舗のソフトウェア システムのこれらの要件をすべて満たしていますが、エッジ プロファイルは、小売店の店頭などのハードウェア リソースが制限された環境でのデプロイという重要なユースケースを可能にします。

次の図は、小売店のエッジ プロファイルを使用する GKE on Bare Metal のデプロイを示しています。

小売店のエッジ プロファイルを使用する GKE on Bare Metal のデプロイを示しています。
小売店での GKE on Bare Metal のデプロイ

上の図は、一般的な実店舗を示しています。店舗には、カードリーダー、POS マシン、カメラ、プリンタなどのスマート デバイスがあります。店舗にはまた、3 つの物理コンピューティング ハードウェア デバイス(Node 1Node 2Node 3 という名前)があり、これらのデバイスはすべて中央のネットワーク スイッチに接続されています。したがって、3 つのコンピューティング デバイスはレイヤ 2 ネットワークを介して相互に接続されています。互いにネットワーク接続されたコンピューティング デバイスがベアメタル インフラストラクチャを構成します。GKE on Bare Metal は、3 つの各コンピューティング デバイス内で実行されます。これらのデバイスには独自のディスク ストレージがあり、高可用性を実現するためにデバイス間でデータ レプリケーションが行われるように構成されています。

この図は、GKE on Bare Metal のデプロイに含まれる次の主要コンポーネントも示しています。

  • MetalLB とマークされたコンポーネントは、GKE on Bare Metal とともにデプロイされるバンドルされたロードバランサです。
  • Config Management コンポーネントを使用すると、クラスタの状態をソース リポジトリと同期できます。これは、個別のインストールと構成が必要とする、強く推奨されるオプションのアドオンです。Config Management の設定方法とさまざまな命名法の詳細については、Config Management のドキュメントをご覧ください。
  • 店舗の場所の外側にある図に表示されているルート リポジトリ名前空間リポジトリは、2 つのソース リポジトリを表します。

    クラスタへの変更は、これらの中央のソース リポジトリに push されます。さまざまなエッジ ロケーションの GKE on Bare Metal のデプロイでは、ソース リポジトリから更新が pull されます。この動作は、図に示す 2 つのリポジトリが、デバイスで実行されている Google Distributed Cloud Virtual for Bare Metal クラスタ内の Config Management コンポーネントに接続している矢印で表されています。

  • クラスタの一部として示されているもう 1 つの重要なコンポーネントは、Google Distributed Cloud の VM ランタイムです。Google Distributed Cloud の VM ランタイムでは、コンテナ化を必要とすることなく、クラスタ内で既存の VM ベースのワークロードを実行できます。Google Distributed Cloud の VM ランタイムのドキュメントでは、VM ワークロードを有効にしてクラスタにデプロイする方法について説明します。

  • アプリケーションとマークされたコンポーネントは、小売店によってクラスタにデプロイされたソフトウェアを示します。そのようなアプリケーションの例として、小売店のキオスクで見られる POS アプリケーションがあります。

図の下部にあるボックスは、小売店内のさまざまなデバイス(キオスク、タブレット、カメラなど)を表しており、すべてのデバイスが中央のネットワーク スイッチに接続されています。店舗内のローカル ネットワークを使用すると、GKE on Bare Metal デプロイメント内で実行されているアプリケーションがこれらのデバイスにアクセスできます。

次のセクションでは、Compute Engine VM を使用して Google Cloud にこの小売店のデプロイをエミュレートする様子を説明します。このエミュレーションは、チュートリアルで GKE on Bare Metal を試すために使用するものです。

Google Cloud でエミュレートされたエッジデプロイ

次の図は、このチュートリアルで Google Cloud に設定するすべての内容を示しています。この図は、前のセクションの小売店の図と関連しています。このデプロイは、POS アプリケーションがデプロイされるエミュレートされたエッジ ロケーションを表します。このアーキテクチャでは、このチュートリアルで使用するシンプルな POS サンプル アプリケーションのワークロードも示されています。ウェブブラウザをキオスクとして使用して、クラスタ内の POS アプリケーションにアクセスします。

この図は、POS アプリケーションのアーキテクチャと、このアーキテクチャを Compute Engine VM で実行される Google Distributed Cloud Virtual for Bare Metal クラスタ内にデプロイする方法を示しています
Google Distributed Cloud Virtual for Bare Metal クラスタ内にデプロイされたサンプル アプリケーション

上の図の 3 つの Compute Engine 仮想マシン(VM)は、一般的なエッジ ロケーションの物理ハードウェア(またはノード)を表します。このハードウェアは、互いにネットワーク スイッチに接続して、ベアメタル インフラストラクチャを構成します。Google Cloud のエミュレートされた環境では、これらの VM は Google Cloud プロジェクトのデフォルトの Virtual Private Cloud(VPC)ネットワークを介して相互に接続されています。

一般的な GKE on Bare Metal のインストールでは、独自のロードバランサを構成できます。ただし、このチュートリアルでは外部ロードバランサは設定しません。代わりに、GKE on Bare Metal にインストールされたバンドル型 MetalLB ロードバランサを使用します。バンドル型 MetalLB ロードバランサには、ノード間のレイヤ 2 ネットワーク接続が必要です。このため、デフォルトの Virtual Private Cloud(VPC)ネットワーク上に VxLAN オーバーレイ ネットワークを作成することで、Compute Engine VM 間のレイヤ 2 接続を可能にします。

「L2 オーバーレイ ネットワーク(VxLAN)」と表示された長方形の中に、3 つの Compute Engine VM 内で実行されているソフトウェア コンポーネントが表示されます。この長方形には、Google Distributed Cloud Virtual for Bare Metal クラスタとリバース プロキシが含まれています。クラスタは、「GKE on Bare Metal」の長方形で表されます。このクラスタを表す長方形には、「Kubernetes 名前空間(POS)」とマークされた別の長方形が含まれます。これは、クラスタ内の Kubernetes Namespace を表します。この Kubernetes Namespace 内のすべてのコンポーネントにより、Anthos クラスタにデプロイされる POS アプリケーションが構成されます。POS アプリケーションには、API サーバー、インベントリ、支払いの 3 つのマイクロサービスがあります。これらのコンポーネントは、前述のエッジ ロールアウト アーキテクチャ図に示されている 1 つの「アプリケーション」を表しています。

Anthos クラスタのバンドル型 MetalLB ロードバランサに VM の外部から直接アクセスすることはできません。この図は、NGINX リバース プロキシが VM 内で実行されて Compute Engine VM に到達するトラフィックをロードバランサにルーティングするように構成されていることを示しています。これは、Google Cloud Compute Engine VM を使用してエッジノードをエミュレートするというこのチュートリアルの目的の回避策にすぎません。実際のエッジ ロケーションでは、適切なネットワーク構成で可能となります。

目標

  1. Compute Engine VM を使用して、エッジ ロケーションで実行されているベアメタル インフラストラクチャをエミュレートします。
  2. エミュレートされたエッジ インフラストラクチャに、Google Distributed Cloud Virtual for Bare Metal クラスタを作成します。
  3. クラスタを Google Cloud に接続して登録します。
  4. Anthos クラスタにサンプルの POS アプリケーションのワークロードをデプロイします。
  5. Google Cloud コンソールを使用して、エッジ ロケーションで動作する POS アプリケーションを確認し、モニタリングします。
  6. Config Management を使用して、Anthos クラスタで実行される POS アプリケーションを更新します。

準備

  1. Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成作成します。

    プロジェクトの選択に移動

  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  3. Google Cloud CLI をインストールして初期化します。

Anthos サンプル リポジトリをフォークしてクローンを作成する

このチュートリアルで使用されるスクリプトはすべて、anthos-samples リポジトリに格納されています。/anthos-bm-edge-deployment/acm-config-sink の下のフォルダ構造は、Config Management で想定される構造に従って編成されています。次の手順に進む前に、このリポジトリを自分の GitHub アカウントにクローンします。

  1. アカウントを持っていない場合は、GitHub でアカウントを作成してください。

  2. Config Management の構成で使用する個人用のアクセス トークンを作成します。これは、クラスタの Config Management コンポーネントが、新しい変更を同期しようとするときに GitHub アカウントで認証するために必要です。

    1. public_repo スコープのみを選択します。
    2. 作成したアクセス トークンは、後で使用できるように安全な場所に保管します。
  3. anthos-samples リポジトリを自分の GitHub アカウントにフォークします。

    1. anthos-samples リポジトリに移動します。
    2. ページの右上にある フォーク アイコンをクリックします。
    3. リポジトリのフォーク先の GitHub ユーザー アカウントをクリックします。フォークされた anthos-samples リポジトリのバージョンのページに自動的にリダイレクトされます。
  4. ローカル環境でターミナルを開きます。

  5. 次のコマンドを実行して、フォークされたリポジトリのクローンを作成します。ここで、GITHUB_USERNAME は GitHub アカウントのユーザー名です。

    git clone https://github.com/GITHUB_USERNAME/anthos-samples
    cd anthos-samples/anthos-bm-edge-deployment
    

ワークステーション環境を設定する

このドキュメントで説明するエッジデプロイを完了するには、インターネットにアクセスできる 1 つのワークステーションと、次のツールのインストールが必要です。

このセクションで構成するワークステーションで、チュートリアルのすべてのコマンドを実行します。

  1. ワークステーションで、新しいシェル インスタンスの環境変数を初期化します。

    export PROJECT_ID="PROJECT_ID"
    export REGION="us-central1"
    export ZONE="us-central1-a"
    
    # port on the admin Compute Engine instance you use to set up an nginx proxy
    # this allows to reach the workloads inside the cluster via the VM IP
    export PROXY_PORT="8082"
    
    # should be a multiple of 3 since N/3 clusters are created with each having 3 nodes
    export GCE_COUNT="3"
    
    # url to the fork of: https://github.com/GoogleCloudPlatform/anthos-samples
    export ROOT_REPO_URL="https://github.com/GITHUB_USERNAME/anthos-samples"
    
    # this is the username used to authenticate to your fork of this repository
    export SCM_TOKEN_USER="GITHUB_USERNAME"
    
    # access token created in the earlier step
    export SCM_TOKEN_TOKEN="ACCESS_TOKEN"
    

    次の値を置き換えます。

    • PROJECT_ID: Google Cloud プロジェクト ID。
    • GITHUB_USERNAME: GitHub のユーザー名。
    • ACCESS_TOKEN: GitHub リポジトリ用に作成した個人用アクセス トークン。

    他の環境変数はデフォルト値のままにします。これらについては、次のセクションで説明します。

  2. ワークステーションで、Google Cloud CLI を初期化します。

    gcloud config set project "${PROJECT_ID}"
    gcloud services enable compute.googleapis.com
    
    gcloud config set compute/region "${REGION}"
    gcloud config set compute/zone "${ZONE}"
    
  3. ワークステーションで、Compute Engine インスタンス用の Google Cloud サービス アカウントを作成します。このスクリプトは、新しい Google サービス アカウントの JSON キーファイルを <REPO_ROOT>/anthos-bm-edge-deployment/build-artifacts/consumer-edge-gsa.json に作成します。また、Cloud Key Management Service のキーリングと、SSH 秘密鍵の暗号化用の鍵も設定します。

    ./scripts/create-primary-gsa.sh
    

    スクリプトの一部は、以下に表示されます。スクリプト全体を表示するには View on GitHub リンクをクリックします。

    # ...
    EXISTS=$(gcloud iam service-accounts list \
      --filter="email=${GSA_EMAIL}" \
      --format="value(name, disabled)" \
      --project="${PROJECT_ID}")
    
    if [[ -z "${EXISTS}" ]]; then
      echo "GSA [${GSA_EMAIL}]does not exist, creating it"
    
      # GSA does NOT exist, create
      gcloud iam service-accounts create ${GSA_NAME} \
        --description="GSA used on each Target machine to make gcloud commands" \
        --display-name="target-machine-gsa" \
        --project "${PROJECT_ID}"
    else
      if [[ "${EXISTS}" =~ .*"disabled".* ]]; then
        # Found GSA is disabled, enable
        gcloud iam service-accounts enable "${GSA_EMAIL}" --project "${PROJECT_ID}"
      fi
      # otherwise, no need to do anything
    fi
    # ...

Compute Engine インスタンスをプロビジョニングする

このセクションでは、GKE on Bare Metal をインストールする Compute Engine VM を作成します。また、インストール セクションに進む前に、これらの VM への接続も確認します。

  1. ワークステーションで、Compute Engine インスタンス間の通信に使用される SSH 認証鍵を作成します。

    ssh-keygen -f ./build-artifacts/consumer-edge-machine
    
  2. Cloud Key Management Service を使用して SSH 秘密鍵を暗号化します。

    gcloud kms encrypt \
        --key gdc-ssh-key \
        --keyring gdc-ce-keyring \
        --location global \
        --plaintext-file build-artifacts/consumer-edge-machine \
        --ciphertext-file build-artifacts/consumer-edge-machine.encrypted
    
  3. 環境構成ファイル .envrc を生成し、これをソースにします。作成後、.envrc ファイルを検査して、環境変数が正しい値に置き換えられていることを確認します。

    envsubst < templates/envrc-template.sh > .envrc
    source .envrc
    

    templates/envrc-template.sh ファイルの環境変数を置き換えて生成した .envrc ファイルの例を次に示します。更新された行はハイライト表示されています。

    # GSA Key used for provisioning (result of running ./scripts/create-primary-gsa.sh)
    LOCAL_GSA_FILE=$(pwd)/build-artifacts/consumer-edge-gsa.json
    export LOCAL_GSA_FILE
    # GCP Project ID
    export PROJECT_ID="abm-edge-project"
    # Bucket to store cluster snapshot information
    export SNAPSHOT_GCS="abm-edge-project-cluster-snapshots"
    
    # GCP Project Region (Adjust as desired)
    export REGION="us-central1"
    # GCP Project Zone (Adjust as desired)
    export ZONE="us-central1-a"
    
    # Gitlab Personal Access Token credentials (generated in Quick Start step 2)
    export SCM_TOKEN_USER="LarryPage"
    export SCM_TOKEN_TOKEN="oo901Sp-FHuzmz__dgl0393atkf69c8L"
    
    # Default Root Repo setup for multiple locations
    export ROOT_REPO_URL="https://github.com/LarryPage/anthos-samples"
    export ROOT_REPO_BRANCH="main"
    export ROOT_REPO_DIR="/anthos-bm-edge-deployment/acm-config-sink"
    
    # OIDC Configuration (off by default)
    export OIDC_CLIENT_ID="" # Optional, requires GCP API setup work
    export OIDC_CLIENT_SECRET="" # Optional
    export OIDC_USER="" # Optional
    export OIDC_ENABLED="false" # Flip to true IF implementing OIDC on cluster

  4. GKE on Bare Metal がインストールされている Compute Engine インスタンスを作成します。

    ./scripts/cloud/create-cloud-gce-baseline.sh -c "$GCE_COUNT" | \
        tee ./build-artifacts/gce-info
    

Ansible で GKE on Bare Metal をインストールする

このガイドで使用するスクリプトは、3 つの Compute Engine インスタンスのグループに Google Distributed Cloud Virtual for Bare Metal クラスタを作成します。作成されるクラスタの数は、GCE_COUNT 環境変数によって制御されます。たとえば、環境変数 GCE_COUNT6 に設定して、それぞれ 3 つのインスタンスを持つ Google Distributed Cloud Virtual for Bare Metal クラスタを 2 つ作成します。デフォルトでは、GCE_COUNT 環境変数は 3 に設定されています。したがって、このガイドでは、3 個の Compute Engine インスタンスを持つ 1 つのクラスタを作成します。これらの VM インスタンスには、接頭辞 cnuc- の後に数字を配置した名前が付けられています。各クラスタの最初の VM インスタンスは、インストールをトリガーする管理ワークステーションとして機能します。クラスタには管理ワークステーション VM と同じ名前が付けられます(例: cnuc-1cnuc-4cnuc-7)。

Ansible のハンドブックでは次の処理を行います。

  • dockerbmctlgcloudnomos などの必要なツールを使用して Compute Engine インスタンスを構成します。
  • 構成した Compute Engine インスタンスに GKE on Bare Metal をインストールします。
  • cnuc-1 という Google Distributed Cloud Virtual for Bare Metal のスタンドアロン クラスタを作成します。
  • cnuc-1 クラスタを Google Cloud に登録します。
  • Config Management を cnuc-1 クラスタにインストールします。
  • フォークされたリポジトリの anthos-bm-edge-deployment/acm-config-sink にあるクラスタ構成と同期するように Config Management を構成します。
  • クラスタの Login token を生成します。

以下の設定手順を完了して、インストール プロセスを開始します。

  1. ワークステーションで、インストールに使用する Docker イメージを作成します。このイメージには、Ansible、Python、Google Cloud CLI など、インストール プロセスに必要なすべてのツールが含まれています。

    gcloud builds submit --config docker-build/cloudbuild.yaml docker-build/
    

    ビルドが正常に実行されると、次のような出力が生成されます。

    ...
    latest: digest: sha256:99ded20d221a0b2bcd8edf3372c8b1f85d6c1737988b240dd28ea1291f8b151a size: 4498
    DONE
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                  STATUS
    2238baa2-1f41-440e-a157-c65900b7666b  2022-08-17T19:28:57+00:00  6M53S     gs://my_project_cloudbuild/source/1660764535.808019-69238d8c870044f0b4b2bde77a16111d.tgz  gcr.io/my_project/consumer-edge-install (+1 more)  SUCCESS
    
  2. テンプレートから Ansible インベントリ ファイルを生成します。

    envsubst < templates/inventory-cloud-example.yaml > inventory/gcp.yaml
    
  3. 以前にビルドされたイメージから Docker コンテナを起動するインストール スクリプトを実行します。スクリプトは内部で Docker を使用して、現在の作業ディレクトリへのボリューム マウントを持つコンテナを生成します。このスクリプトが正常に完了すると、作成した Docker コンテナ内にいるはずです。このコンテナ内から Ansible のインストールをトリガーします。

    ./install.sh
    

    スクリプトが正常に実行されると、次のような出力が生成されます。

    ...
    Check the values above and if correct, do you want to proceed? (y/N): y
    Starting the installation
    Pulling docker install image...
    
    ==============================
    Starting the docker container. You will need to run the following 2 commands (cut-copy-paste)
    ==============================
    1: ./scripts/health-check.sh
    2: ansible-playbook all-full-install.yaml -i inventory
    3: Type 'exit' to exit the Docker shell after installation
    ==============================
    Thank you for using the quick helper script!
    (you are now inside the Docker shell)
    
  4. Docker コンテナ内から、Compute Engine インスタンスへのアクセスを確認します。

    ./scripts/health-check.sh
    

    スクリプトが正常に実行されると、次のような出力が生成されます。

    ...
    cnuc-2 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
    cnuc-3 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
    cnuc-1 | SUCCESS => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python3"},"changed": false,"ping": "pong"}
    
  5. Docker コンテナ内から、Compute Engine インスタンスに GKE on Bare Metal をインストールするための Ansible ハンドブックを実行します。完了すると、クラスタの Login Token が画面に表示されます。

    ansible-playbook all-full-install.yaml -i inventory | tee ./build-artifacts/ansible-run.log
    

    インストールが正常に完了すると、次のような出力が生成されます。

    ...
    TASK [abm-login-token : Display login token] **************************************************************************
    ok: [cnuc-1] => {
        "msg": "eyJhbGciOiJSUzI1NiIsImtpZCI6Imk2X3duZ3BzckQyWmszb09sZHFMN0FoWU9mV1kzOWNGZzMyb0x2WlMyalkifQ.eymljZS1hY2NvdW
    iZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImVkZ2Etc2EtdG9rZW4tc2R4MmQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2Nvd
    4CwanGlof6s-fbu8"
    }
    skipping: [cnuc-2]
    skipping: [cnuc-3]
    
    PLAY RECAP ***********************************************************************************************************
    cnuc-1                     : ok=205  changed=156  unreachable=0    failed=0    skipped=48   rescued=0    ignored=12
    cnuc-2                     : ok=128  changed=99   unreachable=0    failed=0    skipped=108  rescued=0    ignored=2
    cnuc-3                     : ok=128  changed=99   unreachable=0    failed=0    skipped=108  rescued=0    ignored=2
    

Google Cloud コンソールで GKE on Bare Metal クラスタにログインする

Ansible ハンドブックの実行が完了すると、スタンドアロンの Google Distributed Cloud Virtual for Bare Metal クラスタが Compute Engine VM 内にインストールされます。このクラスタは、Connect Agent を介して Google Cloud にも登録されます。ただし、このクラスタの詳細を表示するには、Google Cloud コンソールからクラスタにログインする必要があります。GKE クラスタにログインするには、次の手順を行います。

  1. 前のセクションの Ansible ハンドブックの出力からトークンをコピーします。

  2. Google Cloud コンソールで [Kubernetes クラスタ] ページに移動し、コピーしたトークンを使用して cnuc-1 クラスタにログインします。

    [Kubernetes クラスタ] ページに移動

    1. クラスタのリストで、cnuc-1 クラスタの横にある [アクション] をクリックし、[ログイン] をクリックします。
    2. [トークン] を選択し、コピーしたトークンを貼り付けます。
    3. [ログイン] をクリックします。
  3. Google Cloud コンソールで [構成管理] ページに移動し、[Config spec status] を確認します。ステータスが「同期済み」であることを確認します。[同期済み] のステータスは、Config Management によって GitHub 構成ファイルがデプロイ済みクラスタ cnuc-1 と正常に同期されたことを示しています。

    [構成管理] ページに移動

    Config Management をソース リポジトリと同期しました。

外部トラフィック用のプロキシを構成する

前の手順でインストールされた Google Distributed Cloud Virtual for Bare Metal クラスタでは、MetalLB というバンドル型ロードバランサが使用されます。このロードバランサ サービスには、Virtual Private Cloud(VPC)IP アドレスからのみアクセスできます。外部 IP から受信されたトラフィックをバンドルされたロードバランサにルーティングするには、管理ホスト(cnuc-1)でリバース プロキシ サービスを設定します。このリバース プロキシ サービスを使用すると、管理ホスト(cnuc-1)の外部 IPを介して POS アプリケーションの API サーバーにアクセスできます。

前の手順のインストール スクリプトでは、サンプル構成ファイルとともに NGINX が管理ホストにインストールされました。このファイルを更新してロードバランサ サービスの IP アドレスを使用し、NGINX を再起動します。

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

    ssh -F ./build-artifacts/ssh-config abm-admin@cnuc-1
    
  2. 管理ワークステーション内から、API サーバー ロードバランサ サービスにトラフィックをルーティングするように NGINX リバース プロキシを設定します。ロードバランサ タイプの Kubernetes サービスの IP アドレスを取得します。

    ABM_INTERNAL_IP=$(kubectl get services api-server-lb -n pos | awk '{print $4}' | tail -n 1)
    
  3. 取得した IP アドレスを使用して、テンプレート構成ファイルを更新します。

    sudo sh -c "sed 's/<K8_LB_IP>/${ABM_INTERNAL_IP}/g' \
        /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf"
    
  4. NGINX を再起動して、新しい構成が適用されていることを確認します。

    sudo systemctl restart nginx
    
  5. NGINX サーバーのステータスが「アクティブ(実行中)」になっていることを確認します。

    sudo systemctl status nginx
    

    NGINX が正常に実行されると、次の例のような出力が生成されます。

    ● nginx.service - A high performance web server and a reverse proxy server
        Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
        Active: active (running) since Fri 2021-09-17 02:41:01 UTC; 2s ago
        Docs: man:nginx(8)
        Process: 92571 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
        Process: 92572 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Main PID: 92573 (nginx)
        Tasks: 17 (limit: 72331)
        Memory: 13.2M
        CGroup: /system.slice/nginx.service
                ├─92573 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
                ├─92574 nginx: worker process
                ├─92575 nginx: worker process
                ├─92577 nginx: ....
                ...
                ...
    
  6. SSH セッションを終了して管理ワークステーションに移動します。

    exit
    
  7. シェル セッションを終了して Docker コンテナに移動します。管理インスタンスを終了しても、引き続きインストールに使用する Docker コンテナ内にいます。

    exit
    

POS アプリケーションにアクセスする

外部プロキシを設定すると、GKE クラスタ内で実行されているアプリケーションにアクセスできます。サンプル POS アプリケーションにアクセスするには、次の手順を行います。

  1. ワークステーションで、管理 Compute Engine インスタンスの外部 IP アドレスを取得して、POS アプリケーションの UI にアクセスします。

    EXTERNAL_IP=$(gcloud compute instances list \
        --project ${PROJECT_ID} \
        --filter="name:cnuc-1" \
        --format="get(networkInterfaces[0].accessConfigs[0].natIP)")
    echo "Point the browser to: ${EXTERNAL_IP}:${PROXY_PORT}"
    

    スクリプトが正常に実行されると、次のような出力が生成されます。

    Point the browser to: 34.134.194.84:8082
    
  2. ウェブブラウザを開いて、前のコマンドの出力に表示された IP アドレスに移動します。次のスクリーンショットの例に示すように、サンプル POS アプリケーションにアクセスしてテストできます。

    POS アプリケーションのバージョン 1 をデプロイしました。

Config Management を使用して API サーバーを更新する

ルート リポジトリ内の構成ファイルを更新することで、サンプル アプリケーションを新しいバージョンにアップグレードできます。Config Management によって更新が検出され、クラスタに自動的に変更が行われます。この例では、ルート リポジトリは、このガイドの冒頭でクローンを作成した anthos-samples リポジトリです。サンプル POS アプリケーションで新しいバージョンへのアップグレードをデプロイする方法については、次の手順をご覧ください。

  1. ワークステーションで、image フィールドを更新して、API Server のバージョンを v1 から v2 に変更します。Deployment の YAML 構成は、anthos-bm-edge-deployment/acm-config-sink/namespaces/pos/api-server.yaml のファイルにあります。

    containers:
    - name: api-server
      image: us-docker.pkg.dev/anthos-dpe-abm-edge-pos/abm-edge-pos-images/api-server:v1
  2. フォークされたリポジトリに変更を追加し、commit して push します。

    git add acm-config-sink/namespaces/pos/api-server.yaml
    git commit -m "chore: updated api-server version to v2"
    git push
    
  3. Google Cloud コンソールで [構成管理] ページに移動し、[Config spec status] を確認します。ステータスが [同期済み] であることを確認します。

    [構成管理] ページに移動

  4. Google Cloud コンソールで Kubernetes Engine の [ワークロード] ページに移動し、[Deployment] が更新されていることを確認します。

    Kubernetes Engine の [ワークロード] ページに移動

  5. [デプロイ] のステータスが [OK] になったら、前のセクションの IP アドレスにブラウザでアクセスして POS アプリケーションを表示します。次の例のスクリーンショットに示されているように、タイトルに記載されているバージョンは「V2」であり、アプリケーションの変更がデプロイされたことを示しています。

    POS アプリケーションのバージョン 2 をデプロイしました。

    注: 変更を確認するには、ブラウザタブのハード更新が必要になる場合があります。

クリーンアップ

不要な Google Cloud 料金が発生しないようにするには、このチュートリアルが終了したら、このガイドで使用したリソースを削除します。これらのリソースは手動で削除できます。または、Google Cloud プロジェクトを削除すると、すべてのリソースも削除されます。また、ローカル ワークステーションで行った変更をクリーンアップすることもできます。

ローカル ワークステーション

インストール スクリプトによる変更をクリアするには、次のファイルを更新する必要があります。

  • /etc/hosts ファイルに追加された Compute Engine VM の IP アドレスを削除します。
  • ~/.ssh/config ファイルから cnuc-* の SSH 構成を削除します。
  • Compute Engine VM フィンガープリントを ~/.ssh/known_hosts ファイルから削除します。

プロジェクトを削除する

この手順専用のプロジェクトを作成した場合は、Google Cloud コンソールから Google Cloud プロジェクトを削除します。

  • In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  • In the project list, select the project that you want to delete, and then click Delete.
  • In the dialog, type the project ID, and then click Shut down to delete the project.
  • 手動

    この手順で既存のプロジェクトを使用した場合は、次の操作を行います。

    • 名前が cnuc- で始まるすべての Kubernetes クラスタの登録を解除します。
    • 名前が cnuc- で始まるすべての Compute Engine VM を削除します。
    • 名前が abm-edge-boot で始まる Cloud Storage バケットを削除します。
    • ファイアウォール ルール allow-pod-ingressallow-pod-egress を削除します。
    • Secret Manager のシークレット install-pub-key を削除します。

    次のステップ

    このガイドを拡張するには、別のエッジ ロケーションを追加します。GCE_COUNT 環境変数を 6 に設定し、前のセクションと同じ手順を再実行すると、3 つの新しい Compute Engine インスタンス(cnuc-4cnuc-5cnuc-6)と cnuc-4 という Google Distributed Cloud Virtual for Bare Metal の新しいスタンドアロン クラスタが作成されます。

    また、フォークされたリポジトリでクラスタ構成の更新を試行し、ClusterSelectors を使用して POS アプリケーションの異なるバージョンを 2 つのクラスタ(cnuc-1cnuc-4)に選択的に適用することもできます。

    このガイドの各ステップ、関連するスクリプトの詳細については、anthos-samples リポジトリをご覧ください。