学習プログラム: スケーラブルなアプリケーション - Config Sync を使用して変更を一元化する


このチュートリアルは、Google Kubernetes Engine(GKE)Enterprise エディションで実行される最新のアプリケーション環境をデプロイ、実行、管理することを目的とする IT 管理者とオペレーターを対象としています。このチュートリアルでは、Cymbal Bank サンプル マイクロサービス アプリケーションを使用して、モニタリングとアラートの構成、ワークロードのスケーリング、障害のシミュレーションの方法を学習します。

  1. クラスタを作成してサンプル アプリケーションをデプロイする
  2. Google Cloud Managed Service for Prometheus でモニタリングする
  3. ワークロードをスケーリングする
  4. 障害をシミュレートする
  5. チェンジ マネジメントを一元化する(このチュートリアル)

概要と目的

新しいサービスやアプリケーションを構築する際に、さまざまな環境で変更をテストすることが必要になる場合があります。組織が拡大するにつれて、チームごとに異なるクラスタ構成が必要になる場合があります。構成の異なる複数のクラスタを管理するのは困難です。こうした課題は、Config Sync などの GitOps ツールを使用すると管理できます。

クラスタの作成チュートリアルでは、クラスタを作成し、そのクラスタに Cymbal Bank アプリケーションをデプロイしました。

このチュートリアルでは、アプリケーションの Kubernetes マニフェストを一元化された Git リポジトリに保存する方法と、Config Sync などのツールを使用して、フリートの複数のクラスタにアプリケーションをデプロイする方法について説明します。次のタスクを完了する方法を学習します。

  • Git リポジトリを作成し、Cloud Build に接続する

  • クラスタを作成してフリートに登録し、クラスタのフリート上に Config Sync をインストールする

  • フリート パッケージを使用して、クラスタまたはフリート全体に Cymbal Bank やその他のリソースをデプロイする

費用

この一連のチュートリアルで GKE Enterprise を有効にして Cymbal Bank サンプル アプリケーションをデプロイすると、GKE Enterprise を無効にするかプロジェクトを削除するまで、料金ページに記載されているように、Google Cloud の GKE Enterprise に対してクラスタごとの料金が発生します。

また、Compute Engine VM やロードバランサの費用など、Cymbal Bank サンプル アプリケーションの実行中に発生した他の Google Cloud の費用もお客様の負担となります。

始める前に

Git リポジトリからリソースを保存、変更、デプロイする方法を理解するため、最初のチュートリアルを完了して、Autopilot モードを使用する GKE クラスタを作成し、Cymbal Bank のサンプル マイクロサービス ベースのアプリケーションをデプロイする必要があります。

Cymbal Bank のチュートリアルは順番に完了することをおすすめします。チュートリアルを進めていくと、新しいスキルを習得し、追加の Google Cloud プロダクトとサービスを使用できるようになります。

Config Sync を使用して Git リポジトリからクラスタに Kubernetes マニフェストをデプロイするには、次の API を有効にする必要があります。

gcloud services enable configdelivery.googleapis.com cloudbuild.googleapis.com developerconnect.googleapis.com

Git リポジトリを作成し、Cloud Build に接続する

フリート パッケージは、Kubernetes リソース マニフェストのコレクションです。これらのマニフェストをパッケージとしてバンドルすることで、Git リポジトリからフリート内の複数のクラスタに直接アプリケーションをデプロイできます。このワークフローには次のメリットがあります。

  • スケーラビリティの向上。クラスタごとに手動でリソースを適用するのではなく、フリート全体にリソースをデプロイできます。
  • 段階的なロールアウトによる安全なアップデート。
  • Git で構成ファイルを一元的に取得するワークフロー(バージョン管理や承認など)

Git に変更を行う方法を示すため、Cymbal Bank リポジトリをフォークして Cloud Build に接続します。

Cymbal Bank リポジトリをフォークする

このチュートリアルでは、Git リポジトリに変更を加えて、Config Sync で Kubernetes リソースの変更を安全に管理してデプロイする方法を示します。これらの変更を直接行うには、Git リポジトリのクローンを作成するのではなく、リポジトリをフォークする必要があります。

リポジトリをフォークするには、次の操作を行います。

  1. GitHub で、Cymbal Bank(bank-of-anthos)サンプル リポジトリに移動します。

  2. [Fork] をクリックして、ソースファイルを含むリポジトリのコピーを取得します。

    代替テキスト

  3. 必要に応じて GitHub アカウントにログインします。GitHub で他の組織またはチームにアクセスできる場合は、リポジトリを個人アカウントにフォークしていることを確認してください。

これで、Cymbal Bank リポジトリのフォークが作成されました。デプロイするすべての Kubernetes マニフェストは /kubernetes-manifests フォルダにあります。

リポジトリを Cloud Build に接続する

Cloud Build は、Google Cloud でビルドを実行できるサービスです。これは、GitOps スタイルの継続的デリバリーに使用できます。Config Sync のフリート パッケージ サービスは、Cloud Build を使用して Git リポジトリから Kubernetes リソースを取得し、クラスタにデプロイします。フリート パッケージを使用する場合は、同期するリポジトリごとに Cloud Build を 1 回だけ設定する必要があります。フリート パッケージ API は、Cloud Build を使用してビルドトリガーを自動的に作成します。

GitHub リポジトリを Cloud Build に接続するには:

  1. Google Cloud コンソールで Cloud Build ページを開き、[リポジトリ] を選択します。

    [リポジトリ] ページを開く

  2. 第 2 世代の [リポジトリ] ページに移動します。必要に応じて、[リポジトリ(第 2 世代)を表示] を選択します。

  3. [ホスト接続を作成] をクリックします。

  4. [リージョン] メニューで、リージョンとして [us-central1(アイオワ)] を選択します。

  5. [名前] フィールドに、接続の名前として「cymbal-bank-connection」を入力します。

  6. [接続] をクリックします。

  7. Cloud Build を GitHub アカウントに初めて接続する場合は、次の操作を行います。

    1. GitHub OAuth トークンのリクエストを承認します。トークンは、Cloud Build GitHub 接続で使用するために Secret Manager に保存されます。[続行] をクリックします。
    2. GitHub リポジトリに Cloud Build をインストールします。[新しいアカウントでインストール] を選択します。
    3. 新しい GitHub ウィンドウが開きます。ここで、先ほど Cymbal Bank のフォークを作成した GitHub アカウントを選択します。本番環境では、アクセス権を委任された他のアカウントまたはリポジトリを選択できます。
    4. 認証プロンプトに従って、GitHub で本人確認を行います。
    5. Cloud Build リポジトリ アクセスの GitHub ウィンドウで、[Only select repositories] を選択します。
    6. リポジトリの一覧が表示されたプルダウン メニューから、bank-of-anthos のフォークを選択します。
    7. [保存] をクリックします。
  8. Google Cloud コンソールの Cloud Build ページで、[リポジトリをリンク] をクリックして、新しい Git リポジトリを Cloud Build に接続します。

  9. [接続] メニューで、[cymbal-bank-connection] を選択します。

  10. [リポジトリ] メニューで、bank-of-anthos フォークを選択します。

  11. [リンク] をクリックします。

クラスタを作成する

このシリーズの最初のチュートリアルでは、1 つのクラスタを作成し、そのクラスタに Cymbal Bank アプリケーションをデプロイしました。実際のシナリオでは、管理するクラスタが 1 つだけということはほとんどありません。GKE では、フリート(一緒に管理できるクラスタの論理グループ)にクラスタをグループ化できます。フリート内では、異なる環境を表すクラスタや、異なるチームに属するクラスタでクラスタをさらにグループ化できます。たとえば、開発クラスタ、ステージング クラスタ、本番環境クラスタがあります。大規模な組織では、個々のチームが環境ごとに独自のクラスタを持つ場合があります。IT 管理者やオペレーターは、数十のクラスタを管理する必要があります。

これらのクラスタ全体にアプリケーションや個々のリソース(カスタム ポリシーなど)をデプロイする場合、Config Sync などの GKE Enterprise 機能を使用すると、これらのデプロイを大規模に管理できます。

リソースを異なる環境にデプロイする方法や、クラスタのフリートにデプロイする方法を確認するため、新しいクラスタを作成して、Cymbal Bank アプリケーションをデプロイします。

  1. 開発環境をシミュレートする GKE クラスタを作成します。

    gcloud container clusters create-auto scalable-apps-dev \
      --project=PROJECT_ID \
      --region=REGION \
      --fleet-project=PROJECT_ID \
      --release-channel=rapid
    

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

    • PROJECT_ID は、前のセクションで作成したプロジェクトの自動生成された ID に置き換えます。プロジェクト ID は、多くの場合、プロジェクト名とは異なります。たとえば、プロジェクト名は scalable-apps で、プロジェクト ID は scalable-apps-567123 となります。
    • REGION は、クラスタを作成するリージョン(us-central1 など)に置き換えます。
  2. ラベルは、GKE リソースに追加して整理に役立つ Key-Value ペアです。フリート パッケージの場合、フリート メンバーシップ ラベルを使用して、フリート パッケージのターゲット クラスタをカスタマイズできます。他のタイプのラベルはサポートされていません。

    フリート メンバーシップにラベルを追加します。

    gcloud container fleet memberships update scalable-apps-dev \
        --update-labels=env=dev
    

    このチュートリアルの後半でフリート パッケージを作成するときに、このラベルにより、リソースが scalable-apps-dev クラスタにのみデプロイされます。このシリーズの最初のチュートリアルの scalable-apps クラスタにはデプロイされません。

Config Sync をインストールする

両方のクラスタに Config Sync をインストールします。

  1. Google Cloud コンソールで、[機能] セクションの [構成] ページに移動します。

    [構成] に移動

  2. [ Config Sync のインストール] をクリックします。
  3. [手動アップグレード] を選択したままにします。
  4. デフォルトでは、バージョン メニューは Config Sync の最新バージョンに設定されています。必要に応じて、最新バージョンを選択します。
  5. [インストール オプション] で、[Install Config Sync on entire fleet (recommended)] を選択します。
  6. [Config Sync のインストール] をクリックします。
  7. Config Sync の [設定] タブで、クラスタリストの [ステータス] フィールドを確認します。数分後、ステータスが「保留中」になります。このステータスは、クラスタが Config Sync 用に正しく構成されるまで表示されます。ステータスが「有効」に変わるまでに 10 分ほどかかることがあります。

Cymbal Bank をデプロイする

このシリーズの最初のチュートリアルでは、kubectl コマンドを使用してアプリケーション構成をクラスタに適用しました。このチュートリアルでは、Config Sync のフリート パッケージ機能を使用して、同じ構成を新しいクラスタにデプロイします。後のセクションでは、新しいリソースを Git リポジトリに追加し、それらのリソースをクラスタのフリートにデプロイする方法の例を紹介します。

Cloud Build のサービス アカウントを設定する

サービス アカウントは、ユーザーではなく、アプリケーションで使用される特別な種類のアカウントです。サービス アカウントを作成する際のベスト プラクティスとして、特定の 1 つのサービスまたはタスクにサービス アカウントを作成し、サービス アカウントにきめ細かいロールを付与します。このチュートリアルでは、サービス アカウントを作成し、Git リポジトリから Kubernetes リソースを取得してクラスタにデプロイする権限を Cloud Build に付与します。

サービス アカウントを作成して必要な権限を付与する手順は次のとおりです。

  1. サービス アカウントを作成します。

    gcloud iam service-accounts create "cymbal-bank-service-account"
    
  2. リソース バンドル パブリッシャー ロールの IAM ポリシー バインディングを追加して、Git リポジトリからリソースを取得する権限をサービス アカウントに付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member="serviceAccount:cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com" \
       --role='roles/configdelivery.resourceBundlePublisher'
    

    メッセージが表示されたら、ポリシーの条件として None を選択します。

  3. ログ書き込みロールの IAM ポリシー バインディングを追加して、サービス アカウントにログの書き込み権限を付与します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
       --member="serviceAccount:cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com" \
       --role='roles/logging.logWriter'
    

    メッセージが表示されたら、ポリシーの条件として None を選択します。

Cymbal Bank アプリケーションのリリースを作成する

フリート パッケージには、デプロイするリポジトリのバージョンを示すセマンティック バージョン タグが必要です。リポジトリに変更を加えるときは、新しいリリースを作成することをおすすめします。これにより、バージョン管理が容易になり、必要に応じて安定版にロールバックしやすくなります。

  1. Cymbal Bank の GitHub フォークのウェブブラウザ ウィンドウで、サイドバーの [Releases] セクションにある [Create a new release] をクリックします。

  2. [Choose a tag] メニューを選択し、タグとして「v1.0.0」と入力します。[Create new tag] をクリックします。

  3. [Publish release] をクリックします。

認証を設定する

このシリーズの最初のチュートリアルと同様に、ユーザー認証を処理する JWT と、作成した新しいクラスタの JWT を保存する Kubernetes Secret を作成する必要があります。各クラスタに固有の JWT を用意することをおすすめします。

  1. Cloud Shell で JWT を作成します。

    openssl genrsa -out jwtRS256.key 4096
    openssl rsa -in jwtRS256.key -outform PEM -pubout -out jwtRS256.key.pub
    
  2. Kubernetes Secret を作成します。

    kubectl create secret generic jwt-key --from-file=./jwtRS256.key --from-file=./jwtRS256.key.pub
    

フリート パッケージを使用して Cymbal Bank アプリケーションをデプロイする

FleetPackage リソースは、複数の Kubernetes マニフェストをクラスタのフリートにデプロイするための宣言型 API です。

フリート パッケージを作成するには、Cloud Build に接続した Kubernetes リソースを使用して、リポジトリを指す FleetPackage 仕様を定義します。次に、FleetPackage リソースを適用します。これにより、Git からリソースが取得され、フリート全体にデプロイされます。

  1. Cloud Shell で、configdelivery Google Cloud CLI コマンドのデフォルトの場所を設定します。リポジトリを Cloud Build に接続する場合と同様に、フリート パッケージ機能がプレビュー版の間は us-central1 を使用する必要があります。

    gcloud config set config_delivery/location us-central1
    
  2. 次の内容で fleetpackage-spec.yaml という名前のファイルを作成します。

    resourceBundleSelector:
      cloudBuildRepository:
        name: projects/PROJECT_ID/locations/us-central1/connections/cymbal-bank-connection/repositories/REPOSITORY_NAME
        tag: v1.0.0
        serviceAccount: projects/PROJECT_ID/serviceAccounts/cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com
        path: kubernetes-manifests
    target:
      fleet:
        project: projects/PROJECT_ID
        selector:
          matchLabels:
            env: dev
    rolloutStrategy:
      rolling:
        maxConcurrent: 1
    

    REPOSITORY_NAME は、Cloud Build 接続に表示されるリポジトリの名前に置き換えます。

    セレクタ フィールドは、先ほど作成したフリート メンバーシップのラベルと一致します。これにより、Cymbal Bank アプリケーションが scalable-apps-dev クラスタにのみデプロイされます。最初のチュートリアルの scalable-apps クラスタは影響を受けません。次のセクションでは、フリート内のすべてのクラスタをターゲットとするフリート パッケージの例を示します。

    ロールアウト戦略フィールドは、クラスタ間でリソースをデプロイする方法を制御します。この例では 1 つのクラスタにのみデプロイするため、このフィールドはロールアウトの方法を変更しません。ただし、クラスタが多数ある場合は、この設定により、すべてのリソース ファイルが 1 つのクラスタに適用された後に、次のクラスタに移動します。これにより、ロールアウトの進捗状況をモニタリングできます。

  3. フリート パッケージを作成します。

    gcloud alpha container fleet packages create cymbal-bank-fleet-package \
        --source=fleetpackage-spec.yaml \
        --project=PROJECT_ID
    
  4. フリート パッケージが作成されたことを確認します。

    gcloud alpha container fleet packages list
    

    出力には、ビルドトリガーのステータスが一覧表示されます。数秒後、MESSAGE フィールドが更新され、次のような出力が表示されます。

    MESSAGES: Build status: WORKING. The release is still being built; see the build status on the following page:
    

    表示されたリンクをクリックすると、Cloud Build ジョブのストリーミング ログを表示できます。Cloud Build がビルドトリガーを処理するまで数分かかることがあります。

  5. ビルドトリガーが正常に完了すると、gcloud alpha container fleet packages list の出力は次のようになります。

    NAME: cymbal-bank-fleet-package
    STATE: ACTIVE
    CREATE_TIME: 2024-07-09T15:15:56
    ACTIVE_ROLLOUT: rollout-20240709-153621
    LAST_COMPLETED_ROLLOUT:
    MESSAGES:
    

    フリート パッケージが、フリート全体で Kubernetes リソースのロールアウトを開始します。

  6. Google Cloud コンソールの [Google Kubernetes Engine] ページで scalable-apps-dev クラスタを選択し、[ワークロード] ページに移動して、すべての GKE クラスタにデプロイされているワークロードの集約ビューを表示します。

    [ワークロード] ページを開く

    Autopilot がリソース リクエストを満たすように Pod を調整するときに、エラーが発生することがあります。数分後、Pod が実行を開始し、ステータスが「OK」になります。

  7. Cymbal Bank ウェブ インターフェースを表示する手順は次のとおりです。

    1. Google Cloud コンソールの [Google Kubernetes Engine] ページで、[Gateway、Service、Ingress] ページに移動します。

      [Gateway、Service、Ingress] ページに移動

    2. Cymbal Bank Ingress を見つけるには、[Ingress] タブをクリックし、frontend という名前の Ingress を探します。

    3. frontend Ingress の [エンドポイント] リンク(198.51.100.143:80 など)をクリックして、Cymbal Bank のウェブ インターフェースを開きます。

フリート全体にリソースをデプロイする

次に、新しいマイクロサービスで Cymbal Bank アプリケーションを拡張するシナリオを考えてみましょうこのマイクロサービスを現在のすべてのクラスタだけでなく、フリートに今後追加されるクラスタにもデプロイするとします。フリート パッケージを使用すると、複数のクラスタにデプロイするだけでなく、新しいクラスタにも自動的にデプロイできます。

Git リポジトリに新しいリソースを追加する

アプリケーションに新しいサービスを追加する例として、基本的な nginx Deployment を作成してクラスタに追加します。

  1. Cymbal Bank の GitHub フォークのウェブブラウザ ウィンドウで、選択して [Add file]、[Create new file] の順にクリックします。

  2. ファイルに new-resource/nginx.yaml という名前を付け、次のコンテンツを貼り付けます。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.14.2
            name: nginx
            ports:
            - containerPort: 80
    
  3. [Commit changes...] をクリックします。

  4. 確認ダイアログで、[Commit directly to the main branch] を選択したままにして、[Commit changes] をクリックします。

  5. フォークした Cymbal Bank リポジトリのメインページで、サイドバーから [Releases] を選択します。

  6. ページの上部で [Draft a new release] を選択します。

  7. [Choose a tag] メニューを選択し、タグとして「v1.1.0」と入力します。[Create new tag] をクリックします。

  8. [Publish release] をクリックします。

フリート パッケージを使用してリソースをクラスタにデプロイする

新しいリソースをデプロイするには、新しいフリート パッケージを作成します。

  1. このフリート パッケージにはセレクタ フィールドがないため、フリート内のすべてのクラスタがターゲットになります。また、フリートに追加されるクラスタには、nginx Deployment が自動的に追加されます。

    Cloud Shell で、次の内容を含むファイルを new-deployment-fleet-package.yaml という名前で作成します。

    resourceBundleSelector:
      cloudBuildRepository:
        name: projects/PROJECT_ID/locations/us-central1/connections/cymbal-bank-connection/repositories/REPOSITORY_NAME
        tag: v1.1.0
        serviceAccount: projects/PROJECT_ID/serviceAccounts/cymbal-bank-service-account@PROJECT_ID.iam.gserviceaccount.com
        path: kubernetes-manifests/new-resource
    target:
      fleet:
        project: projects/PROJECT_ID
    rolloutStrategy:
      rolling:
        maxConcurrent: 1
    
  2. フリート パッケージを作成して、ロールアウトを開始します。

    gcloud alpha container fleet packages create new-deployment-fleet-package \
        --source=new-deployment-fleet-package.yaml \
        --project=PROJECT_ID
    
  3. フリート パッケージが作成されたことを確認します。

    gcloud alpha container fleet packages list
    

    表示されたリンクをクリックすると、Cloud Build ジョブのストリーミング ログを表示できます。

    フリート パッケージが、フリート全体で Kubernetes リソースのロールアウトを開始します。ロールアウトが開始してから完了するまでに、数分かかることがあります。

  4. Google Cloud コンソールの Google Kubernetes Engine ページで、[ワークロード] ページに移動すると、すべての GKE クラスタにデプロイされているワークロードの集約ビューが表示されます。

    [ワークロード] ページを開く

フリート パッケージを使用した別のデプロイ戦略も考えてみましょう。たとえば、フォークしたリポジトリにさまざまなタイプのリソースを追加し、さまざまなフリート パッケージ構成を使用してデプロイできます。フリート パッケージを使用して、クラスタ全体にデプロイしたリソースを削除することもできます。フリート パッケージの詳細については、Config Sync のドキュメントのフリート パッケージをデプロイするをご覧ください。

フリート全体でリソースを削除する

フリート全体にリソースをデプロイする場合と同様に、フリート パッケージを使用してフリート全体でリソースを削除できます。

個々のリソースを削除する手順は次のとおりです。

  1. Git リポジトリからリソースを削除します。
  2. 新しい Git リリースを作成し、新しいタグを作成します。
  3. フリート パッケージの tag フィールドを更新します。
  4. フリート パッケージの更新コマンドを実行します。

また、フリート パッケージ自体を削除することもできます。この場合、フリート パッケージで管理されていたリソースもすべて削除されます。

たとえば、前の手順で作成した nginx Deployment を削除するには、次のコマンドを実行します。

gcloud alpha container fleet packages delete new-deployment-fleet-package --force

クリーンアップ

このチュートリアルで使用したリソースに対して Google Cloud アカウントに課金されないようにするには、作成したプロジェクトを削除します。

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

    Go to Manage resources

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

フォークしたリポジトリを削除するには、次の操作を行います。

  1. Cymbal Bank の GitHub フォークのウェブブラウザ ウィンドウで、リポジトリ名の下にある [Settings] をクリックします。

  2. [General settings] ページ(デフォルトで選択されています)で、[Danger Zone] セクションに移動し、[Delete this repository] をクリックします。

  3. [I want to delete this repository] をクリックします。

  4. 警告を読み、[I have read and understand these effects] をクリックします。

  5. 削除されるリポジトリが正しいことを確認するには、テキスト フィールドに、フォークされた Cymbal Bank リポジトリの名前を入力します。

  6. [Delete this repository] をクリックします。

次のステップ

このチュートリアルで学習したクラスタ環境に似た独自の GKE Enterprise クラスタ環境の作成を開始する前に、本番環境に関する考慮事項を確認してください。