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

このチュートリアルでは、Google Distributed Cloud と Config Sync を使用して Kubernetes クラスタをエッジに大規模にデプロイするための、すぐに利用できるソリューションを紹介します。このチュートリアルは、プラットフォーム オペレーターとデベロッパーを対象としています。このドキュメントを読む前に、次のテクノロジーとコンセプトについて理解しておいてください。

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

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

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

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

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

小売店のエッジ プロファイルを使用する Google Distributed Cloud デプロイ

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

この図は、Google Distributed Cloud デプロイの一部である、次の主要なコンポーネントも示しています。

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

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

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

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

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

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

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

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

POS アプリケーションのアーキテクチャと、このアーキテクチャを Compute Engine VM で実行される Google Distributed Cloud クラスタ内にデプロイする方法

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

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

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

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

目標

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

始める前に

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

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

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

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

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

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

  1. GitHub のアカウントを持っていない場合は、GitHub でアカウントを作成します。

  2. Config Sync の構成で使用する個人用のアクセス トークンを作成します。これは、クラスタの Config Sync コンポーネントが、新しい変更を同期しようとするときに 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
    

    次のサンプルはスクリプトの一部です。スクリプト全体を表示するには、[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 インスタンスをプロビジョニングする

このセクションでは、Google Distributed Cloud をインストールする 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. Google Distributed Cloud がインストールされる Compute Engine インスタンスを作成します。

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

Ansible で Google Distributed Cloud をインストールする

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

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

  • dockerbmctlgcloudnomos などの必要なツールを使用して Compute Engine インスタンスを構成します。
  • 構成した Compute Engine インスタンスに Google Distributed Cloud をインストールします。
  • cnuc-1 という Google Distributed Cloud スタンドアロン クラスタを作成します。
  • cnuc-1 クラスタを Google Cloud に登録します。
  • Config Sync を cnuc-1 クラスタにインストールします。
  • フォークされたリポジトリの anthos-bm-edge-deployment/acm-config-sink にあるクラスタ構成と同期するように Config Sync を構成します。
  • クラスタの 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 インスタンスに Google Distributed Cloud をインストールするための 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 コンソールで Google Distributed Cloud クラスタにログインする

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

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

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

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

    1. クラスタのリストで、cnuc-1 クラスタの横にある [アクション] をクリックし、[ログイン] をクリックします。
    2. [トークン] を選択し、コピーしたトークンを貼り付けます。
    3. [Login] をクリックします。
  3. Google Cloud コンソールで、[機能] セクションの [構成] ページに移動します。

    [構成] に移動

  4. [パッケージ] タブで、クラスタ テーブルの [同期ステータス] 列を確認します。ステータスが [同期済み] であることを確認します。[同期済み] のステータスは、Config Sync が GitHub 構成ファイルをデプロイ済みクラスタ cnuc-1 と正常に同期させていることを示します。

s

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

前の手順でインストールされた Google Distributed Cloud クラスタでは、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 Sync を使用して API サーバーを更新する

ルート リポジトリ内の構成ファイルを更新することで、サンプル アプリケーションを新しいバージョンにアップグレードできます。Config Sync によって更新が検出され、クラスタに自動的に変更が行われます。この例のルート リポジトリは、このガイドの冒頭でクローンを作成した 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 Sync] ページに移動し、[Config spec status] を確認します。ステータスが [同期済み] であることを確認します。

    [Config Sync] ページに移動

  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 の新しいスタンドアロン クラスタが作成されます。

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

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