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

このチュートリアルは、Google Kubernetes Engine で実行される最新のアプリケーション環境をデプロイ、実行、管理することを目的とする 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 やその他のリソースをデプロイする

クラスタを作成する

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

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

リソースを異なる環境にデプロイする方法や、クラスタのフリートにデプロイする方法を確認するため、新しいクラスタを作成して、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