ジャンプ スタート ソリューション: GKE にダウンタイムなしでデプロイできるステートフル アプリ

Last reviewed 2023-12-19 UTC

このガイドでは、GKE にダウンタイムなしでステートフル アプリをデプロイする方法について説明します。このソリューションでは、ローリング アップデート デプロイを使用して、メンテナンスの時間枠やダウンタイムなどの大きな停止を発生させることなくライブアプリに変更を加える方法を示します。

このソリューションは、サービスへのアクセスに時間的制約がある業界や、サービス停止の削減に大きく依存するビジネスモデルで特に有用です。

このドキュメントは、継続的インテグレーションと継続的デリバリー(CI / CD)のコンセプトとツールについてある程度の知識があるプラットフォーム エンジニアまたは DevOps エンジニアを対象としています。また、基本的なクラウドのコンセプトと Google Kubernetes Engine(GKE)へのデプロイ方法に精通していることを前提としています。Terraform の使用経験も役に立ちます。

目標

このソリューション ガイドは、次のことに役立ちます。

  • Go で作成された 3 階層アプリ(1 つのフロントエンド サービス、1 つのバックエンド サービス、1 つのマネージド データベース)をデプロイする。この例で使用するアプリは、すぐに使用できる画像共有アプリです。
  • ユーザーによる利用を中断することなく、GKE のライブアプリに機能の変更を push する方法について学習する。

アーキテクチャ

次の図は、ソリューションのアーキテクチャを示したものです。

GKE ソリューションにダウンタイムなしでデプロイできるステートフル アプリに必要なインフラストラクチャのアーキテクチャ。

以降の各サブセクションでは、図に示された Google Cloud リソースのリクエスト フローと構成について説明します。

リクエスト フロー

このソリューションのリクエスト処理フローは次のとおりです。フローの各ステップには、上記のアーキテクチャ図に対応した番号が付いています。

  1. 画像共有アプリにリクエストを送信します。
  2. Cloud Load Balancing は、(アプリのバージョン 1 を実行している)GKE サービスにリクエストをリダイレクトします。
  3. このアプリは、Firestore データベースと Cloud Storage バケットに保存されている静止画像のメタデータを使用して、レスポンスを提供します。
  4. GKE API を使用してアプリのバージョン 2 をデプロイするスクリプトを実行します。

使用するプロダクト

このソリューションでは、次の Google Cloud プロダクトを使用します。

  • GKE: コンテナ化されたアプリケーションを Google のインフラストラクチャを使用してデプロイ、管理、スケーリングするためのマネージド環境。
  • Cloud Load Balancing: Google Cloud で高パフォーマンスでスケーラブルなロード バランシングを行うサービス。
  • Cloud Storage: 低コストで無制限のオブジェクト ストレージをさまざまなデータ型に使用できるサービス。データは Google Cloud の内部および外部からアクセス可能で、地理的に冗長に複製されます。
  • Firestore: 自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベース。

費用

Google Cloud の費用の見積もりについては、Autopilot モードの料金をご覧ください。

ソリューションをデプロイする

以降の各セクションでは、ソリューションのデプロイ プロセスについて説明します。

Google Cloud プロジェクトを作成または選択する

ソリューションをデプロイするときに、リソースがデプロイされている Google Cloud プロジェクトを選択します。既存のプロジェクトを使用するか、新しいプロジェクトを作成するかは、次の要素を考慮して判断してください。

  • ソリューション用のプロジェクトを作成し、デプロイメントが不要になった場合は、プロジェクトを削除して、それ以上の請求を避けることができます。既存のプロジェクトを使用する場合、不要になったプロジェクトを削除する必要があります。
  • 新しいプロジェクトを使用すると、本番環境ワークロードに使用されるリソースなど、以前にプロビジョニングされたリソースとの競合を回避できます。

新しいプロジェクトにソリューションをデプロイする場合は、デプロイを開始する前にプロジェクトを作成します。

プロジェクトを作成するには、次の手順を完了します。

  1. Google Cloud コンソールでプロジェクトの選択ページに移動します。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトの作成を開始するには、[プロジェクトを作成] をクリックします。

  3. プロジェクトに名前を付けます。生成されたプロジェクト ID をメモしておきます。

  4. 必要に応じて他のフィールドを編集します。

  5. プロジェクトを作成するには、[作成] をクリックします。

必要な IAM 権限を取得する

デプロイ プロセスを開始するには、次の表に示す Identity and Access Management(IAM)権限が必要です。ソリューションをデプロイするプロジェクトに対して roles/owner 基本ロールが付与されている場合、必要な権限がすべてすでに付与されています。roles/owner のロールがない場合は、これらの権限(またはこれらの権限を含むロール)を付与するよう管理者に依頼してください。

必要な IAM 権限 必要な権限を含む事前定義ロール

serviceusage.services.enable

Service Usage 管理者
roles/serviceusage.serviceUsageAdmin

iam.serviceAccounts.create

サービス アカウント管理者
roles/iam.serviceAccountAdmin

resourcemanager.projects.setIamPolicy

プロジェクト IAM 管理者
roles/resourcemanager.projectIamAdmin
config.deployments.create
config.deployments.list
Cloud Infrastructure Manager 管理者
roles/config.admin

ソリューション用に作成されたサービス アカウント

コンソールからデプロイ プロセスを開始すると、ユーザーに代わってソリューションをデプロイするために(また、必要に応じて後でデプロイを削除するために)サービス アカウントが作成されます。このサービス アカウントには、特定の IAM 権限が一時的に割り当てられます。つまり、ソリューションのデプロイと削除のオペレーションが完了すると、権限が自動的に取り消されます。ソリューションのデプロイを削除した後に、このガイドの後半で説明するように、サービス アカウントを削除することをおすすめします。

サービス アカウントに割り当てられているロールを表示する

Google Cloud プロジェクトまたは組織の管理者が必要とする場合に、以下のロールの情報を表示してください。

  • roles/storage.objectAdmin
  • roles/datastore.user
  • roles/compute.networkUser
  • roles/cloudtrace.agent
  • roles/iam.workloadIdentityUser

デプロイ方法を選択する

このソリューションを最小限の労力でデプロイできるように、Terraform 構成が GitHub で提供されています。Terraform 構成では、ソリューションに必要なすべての Google Cloud のリソースを定義しています。

次のいずれかの方法でソリューションをデプロイできます。

  • コンソールから: デフォルトの構成でソリューションを試して動作を確認する場合は、この方法を使用します。Cloud Build は、ソリューションに必要なすべてのリソースをデプロイします。デプロイされたソリューションが不要になった場合は、コンソールから削除できます。ソリューションのデプロイ後に作成したリソースは、個別に削除する必要があります。

    このデプロイ方法を使用する場合、コンソールからデプロイするの手順に沿って操作します。

  • Terraform CLI を使用: このソリューションをカスタマイズする場合、または Infrastructure as Code(IaC)のアプローチを使用してリソースのプロビジョニングと管理を自動化する場合は、この方法を使用します。GitHub から Terraform 構成をダウンロードし、必要に応じてコードをカスタマイズしてから、Terraform CLI を使用してソリューションをデプロイします。ソリューションをデプロイした後も、引き続き Terraform を使用してソリューションを管理できます。

    このデプロイ方法を使用するには、Terraform CLI を使用してデプロイするの手順に沿って操作します。

コンソールからデプロイする

事前構成済みのソリューションをデプロイするには、次の手順を完了します。

  1. Google Cloud ジャンプ スタート ソリューションのカタログで、GKE ソリューションにダウンタイムなしでデプロイできるステートフル アプリに移動します。

    GKE ソリューションにダウンタイムなしでデプロイできるステートフル アプリに移動

  2. ソリューションの概算費用やデプロイの推定時間など、ページに表示された情報を確認します。

  3. ソリューションのデプロイを開始する準備ができたら、[デプロイ] をクリックします。

    詳細なインタラクティブ ガイドが表示されます。

  4. インタラクティブ ガイドの手順を完了します。

    デプロイメントに入力する名前をメモします。この名前は、後でデプロイメントを削除するときに必要になります。

    [デプロイ] をクリックすると、[ソリューションのデプロイ] ページが表示されます。このページの [ステータス] フィールドに「デプロイ中」が表示されます。

  5. ソリューションがデプロイされるまで待ちます。

    デプロイが失敗した場合、[ステータス] フィールドに「失敗」と表示されます。Cloud Build のログでエラーを診断できます。詳細については、コンソールからデプロイする際のエラーをご覧ください。

    デプロイが完了すると、[ステータス] フィールドが「デプロイ済み」に変わります。

  6. ソリューションを表示するには、コンソールの [ソリューションのデプロイ] ページに戻ります。

  7. デプロイされた Google Cloud リソースとその構成を確認するには、インタラクティブなツアーをご覧ください。

    ツアーを開始する

  8. このソリューションを使用すると、サンプルの画像共有アプリの新しいバージョンにトラフィックを移行することで、大きな停止を発生させることなく更新を行うことができます。このタスクの手順ガイドを Cloud Shell エディタで直接行うには、[ガイドを表示] をクリックします。

    ガイドを表示

    このタスクが完了するまでに約 15 分かかります。

このソリューションが不要になった場合は、デプロイメントを削除して、Google Cloud リソースに対する課金が継続しないようにします。詳細については、デプロイメントを削除するをご覧ください。

Terraform CLI を使用してデプロイする

このセクションでは、Terraform CLI を使用してソリューションをカスタマイズする方法や、ソリューションのプロビジョニングと管理を自動化する方法について説明します。Terraform CLI を使用してデプロイするソリューションは、Google Cloud コンソールの [ソリューションのデプロイ] ページに表示されません。

Terraform クライアントを設定する

Terraform は、Cloud Shell またはローカルホストで実行できます。このガイドでは、Terraform がプリインストールされ、Google Cloud での認証が構成されている Cloud Shell で Terraform を実行する方法について説明します。

このソリューションの Terraform コードは、GitHub リポジトリで入手できます。

  1. Cloud Shell に GitHub リポジトリのクローンを作成します。

    Cloud Shell で開く

    GitHub リポジトリを Cloud Shell にダウンロードするよう求めるメッセージが表示されます。

  2. [確認] をクリックします。

    別のブラウザタブで Cloud Shell が起動し、Cloud Shell 環境の $HOME/cloudshell_open ディレクトリに Terraform コードがダウンロードされます。

  3. Cloud Shell で、現在の作業ディレクトリが $HOME/cloudshell_open/terraform-cloud-deployment-gke/infra かどうかを確認します。このディレクトリには、ソリューションの Terraform 構成ファイルが含まれています。このディレクトリに移動する必要がある場合は、次のコマンドを実行します。

    cd $HOME/cloudshell_open/terraform-cloud-deployment-gke/infra
    
  4. 次のコマンドを実行して Terraform を初期化します。

    terraform init
    

    次のメッセージが表示されるまで待ちます。

    Terraform has been successfully initialized!
    

Terraform 変数を構成する

ダウンロードした Terraform コードには、要件に基づいてデプロイメントをカスタマイズするために使用できる変数が含まれています。たとえば、Google Cloud プロジェクトと、ソリューションをデプロイするリージョンを指定できます。

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-cloud-deployment-gke/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. 同じディレクトリに、terraform.tfvars という名前のテキスト ファイルを作成します。

  3. terraform.tfvars ファイルで次のコード スニペットをコピーし、必要な変数の値を設定します。

    • コード スニペットでコメントとして記載されている手順を実施します。
    • このコード スニペットには、値を設定する必要のある変数のみが含まれています。Terraform 構成には、デフォルト値を持つ他の変数が含まれています。すべての変数とデフォルト値を確認するには、$HOME/cloudshell_open/terraform-cloud-deployment-gke/infra ディレクトリにある variables.tf ファイルをご覧ください。
    • terraform.tfvars ファイルで設定した各値が、variables.tf ファイルで宣言されている変数のと一致していることを確認します。たとえば、variables.tf ファイル内の変数に定義されている型が bool の場合、その変数の値として true または falseterraform.tfvars 内で指定する必要があります。
    # This is an example of the terraform.tfvars file.
    # The values in this file must match the variable types declared in variables.tf.
    # The values in this file override any defaults in variables.tf.
    
    # ID of the project in which you want to deploy the solution
    project_id = "PROJECT_ID"
    
    # The following variables have default values. You can set your own values or remove them to accept the defaults.
    
    # Google Cloud region where you want to deploy the solution
    # Example: us-central1
    region = "REGION"
    
    # Google Cloud zone where you want to deploy the solution
    # Example: us-central1-a
    zone = "ZONE"
    
    # Whether project services will be disabled when the resources are destroyed.
    # Example: false
    disable_services_on_destroy = "BOOL"
    
    # The location where the object data in the bucket resides. Permitted regions are ASIA, EU, or US.
    # Example: US
    bucket_location = "BUCKET_LOCATION"
    
    # A map of key/value label pairs to assign to the resources.
    # Example: "team"="monitoring", "environment"="test"
    labels = {"KEY1"="VALUE1",..."KEYn"="VALUEn"}
    
    # Firestore collection ID
    firestore_collection_id = "COLLECTION_ID"
    
    

    必要な変数に割り当てできる値については、以下をご覧ください。

    • project_id: プロジェクトの識別

    • 他の変数にはデフォルト値があります。それらの一部は変更できます(たとえば、disable_services_on_destroylabels)。

Terraform 構成を検証して確認する

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-cloud-deployment-gke/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. Terraform 構成にエラーがないことを確認します。

    terraform validate
    

    コマンドからエラーが返された場合は、構成で必要な修正を行ってから、terraform validate コマンドを再度実行します。コマンドで次のメッセージが返されるまで、この手順を繰り返します。

    Success! The configuration is valid.
    
  3. 構成で定義されているリソースを確認します。

    terraform plan
    
  4. 前述のように変数定義(terraform.tfvars)ファイルを作成しなかった場合、Terraform でデフォルト値のない変数の値の入力を求められます。必要な値を入力します。

    terraform plan コマンドの出力に、構成の適用時に Terraform がプロビジョニングするリソースのリストが表示されます。

    変更を行う場合は、構成を編集してから、terraform validate コマンドと terraform plan コマンドを再度実行します。

リソースをプロビジョニングする

構成にこれ以上の変更が必要ない場合は、リソースをデプロイします。

  1. 現在の作業ディレクトリが $HOME/cloudshell_open/terraform-cloud-deployment-gke/infra であることを確認します。そうでない場合は、そのディレクトリに移動します。

  2. Terraform 構成を適用します。

    terraform apply
    
  3. 前述のように変数定義(terraform.tfvars)ファイルを作成しなかった場合、Terraform でデフォルト値のない変数の値の入力を求められます。必要な値を入力します。

    作成されるリソースのリストが表示されます。

  4. アクションの実行を求められたら、「yes」と入力します。

    Terraform でデプロイの進行状況を示すメッセージが表示されます。

    デプロイを完了できない場合、失敗の原因となったエラーが表示されます。エラー メッセージを確認し、構成を更新してエラーを修正します。次に、terraform apply コマンドを再実行します。Terraform のエラーのトラブルシューティングについては、Terraform CLI を使用してソリューションをデプロイする際のエラーをご覧ください。

    すべてのリソースが作成されると、Terraform から次のメッセージが表示されます。

    Apply complete!
    
  5. ソリューションを表示するには、コンソールの [ソリューションのデプロイ] ページに戻ります。

  6. デプロイされた Google Cloud リソースとその構成を確認するには、インタラクティブなツアーをご覧ください。

    ツアーを開始する

  7. このソリューションを使用すると、サンプルの画像共有アプリの新しいバージョンにトラフィックを移行することで、大きな停止を発生させることなく更新を行うことができます。このタスクの手順ガイドを Cloud Shell エディタで直接行うには、[ガイドを表示] をクリックします。

    ガイドを表示

    このタスクが完了するまでに約 15 分かかります。

このソリューションが不要になった場合は、デプロイメントを削除して、Google Cloud リソースに対する課金が継続しないようにします。詳細については、デプロイメントを削除するをご覧ください。

デプロイを削除する

このソリューションが不要になった場合は、このソリューションで作成したリソースに対する課金が継続しないように、すべてのリソースを削除します。

コンソールを使用して削除する

この手順は、ソリューションをコンソールからデプロイした場合に実施します。

  1. Google Cloud コンソールで、[ソリューションのデプロイ] ページに移動します。