GKE on AWS にアプリケーションをデプロイする

このページでは、クラスタとノードプールを作成し、GKE on AWS を使用してサンプル アプリケーションをデプロイするためのクイックスタートの手順について説明します。

Terraform を使用してクラスタを作成する

Terraform を使用してクラスタとノードプールを作成できます。クラスタを作成する前に、Terraform スクリプトで AWS VPC も準備します。

AWS 環境での Terraform の詳細については、Terraform クラスタのリファレンスTerraform ノードプール リファレンスをご覧ください。

Terraform を使用して VPC とクラスタを作成したら、クラスタにアプリケーションをデプロイするに進み、サンプル アプリケーションをデプロイします。

Terraform を使用せずにクラスタを作成する

AWS VPC を準備し、Terraform を使用せずにクラスタとノードプールを作成する場合は、次の操作を行います。

始める前に

クラスタを作成する前に、前提条件をすべて満たす必要があります。特に、次のリソースを用意する必要があります。

  • クラスタが動作する AWS VPC。
  • 3 つのコントロール プレーン レプリカ用に最大 3 つの AWS サブネット。それぞれ異なる AWS アベイラビリティ ゾーンに作成する必要があります。
  • GKE on AWS がクラスタの管理で前提としている AWS IAM ロール。これには特定の IAM 権限が必要です。
  • クラスタデータ(etcd)と構成の保存時の暗号化に使用される KMS 対称 CMK 鍵。
  • 各コントロール プレーン レプリカの AWS IAM インスタンス プロファイル。これには特定の IAM 権限が必要です。
  • 各コントロール プレーン レプリカを実行する EC2 インスタンスへの SSH アクセスが必要な場合は、EC2 SSH 認証鍵ペア(省略可)。

これらのリソースは、お客様の責任で作成して管理する必要があります。作成したリソースは GKE on AWS のすべてのクラスタ間で共有できます。その他の基盤となるクラスタ スコープ AWS リソースは、GKE on AWS によって管理されます。

gcloud CLI のデフォルトを設定する

gcloud CLI を使用して、デフォルトのプロジェクトと Google Cloud リージョンのデフォルト設定を構成します。

プロジェクトには固有の識別子としてプロジェクト ID があります。プロジェクトを作成するときに、自動的に生成されるプロジェクト ID を使用することも、独自のプロジェクト ID を作成することもできます。

Google Cloud リージョンは、クラスタが管理される場所です。例: us-west1詳細については、管理リージョンをご覧ください。

こうしたデフォルト設定を構成すると、Google Cloud CLI の実行時に指定する必要がなくなります。--project フラグと --location フラグを Google Cloud CLI に渡すことで、設定を指定したり、デフォルト設定をオーバーライドできます。

デフォルトのプロジェクトとロケーションを構成した後に GKE on AWS のリソースを作成する場合は、そのプロジェクトとロケーションにリソースが自動的に作成されます。

デフォルトの設定手順は次のとおりです。

  1. デフォルト プロジェクトを設定します。

    gcloud config set project PROJECT_ID
    

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  2. デフォルトの管理ロケーションを設定します。

    gcloud config set container_aws/location GOOGLE_CLOUD_LOCATION
    

    GOOGLE_CLOUD_LOCATION は、ロケーション(us-west1 など)に置き換えます。

クラスタの CIDR 範囲を選択する

Kubernetes では、クラスタに 2 つの CIDR 範囲を指定する必要があります。これらの CIDR 範囲は、VPC サブネットで使用される CIDR 範囲と重複しないように選択する必要があります。CIDR 範囲は、クラスタの最大想定サイズに対して十分な大きさである必要があります。

  • Pod アドレスの CIDR 範囲: 新しい Pod が作成されると、この範囲から IP アドレスが割り当てられます。範囲の例: 192.168.208.0/20

  • Service アドレスの CIDR 範囲: 新しい Service が作成されると、この範囲から IP アドレスが割り当てられます。範囲の例: 192.168.224.0/20

クラスタを作成する

GKE on AWS でクラスタを作成するには、次のコマンドを使用します。オプションのパラメータなど、このコマンドの詳細については、gcloud container aws create のリファレンス ページをご覧ください。

gcloud container aws clusters create aws-cluster-0 \
    --cluster-version 1.29.4-gke.200 \
    --aws-region AWS_REGION \
    --fleet-project FLEET_PROJECT_ID \
    --vpc-id VPC_ID \
    --subnet-ids CONTROL_PLANE_SUBNET_1,CONTROL_PLANE_SUBNET_2,CONTROL_PLANE_SUBNET_3 \
    --pod-address-cidr-blocks POD_CIDR_BLOCK \
    --service-address-cidr-blocks SERVICE_CIDR_BLOCK \
    --role-arn API_ROLE_ARN \
    --iam-instance-profile CONTROL_PLANE_PROFILE \
    --database-encryption-kms-key-arn DB_KMS_KEY_ARN \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "google:gkemulticloud:cluster=aws-cluster-0"

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

  • AWS_REGION: クラスタが作成される AWS リージョン。
  • FLEET_PROJECT_ID: クラスタを登録する フリート ホスト プロジェクト。
  • VPC_ID: VPC の作成の前提条件の手順で設定した、このクラスタの AWS VPC の ID
  • CONTROL_PLANE_SUBNET_1CONTROL_PLANE_SUBNET_2CONTROL_PLANE_SUBNET_3: プライベート サブネットの作成の前提条件の手順で作成した、クラスタの 3 つのコントロール プレーン インスタンスのサブネット ID
  • POD_CIDR_BLOCK: クラスタの Pod の CIDR アドレス範囲
  • SERVICE_CIDR_BLOCK: クラスタの Service の CIDR アドレス範囲
  • API_ROLE_ARN: GKE Multi-Cloud API ロールの作成の前提条件の手順で作成した、GKE Multi-Cloud サービスの IAM ロールの ARN
  • CONTROL_PLANE_PROFILE: コントロール プレーン ロールの作成の前提条件の手順で選択した、クラスタに関連付けられた IAM インスタンスのプロファイル名
  • DB_KMS_KEY_ARN: AWS KMS 鍵の作成の前提条件の手順で作成した、AWS KMS 鍵の 1 つの Amazon リソース名(ARN)
  • CONFIG_KMS_KEY_ARN: AWS KMS 鍵の作成の前提条件の手順で作成した、AWS KMS 鍵の他の Amazon リソース名(ARN)

存在する場合、--tags パラメータは、指定された AWS タグを GKE on AWS によって管理されるすべての基盤となる AWS リソースに適用します。この例では、コントロール プレーン ノードに、そのクラスタが属するクラスタの名前でタグを付けます。

ノードプールを作成する

ノードプールは、次のコマンドを使用して作成します。

gcloud container aws node-pools create pool-0 \
    --cluster aws-cluster-0 \
    --node-version 1.29.4-gke.200 \
    --min-nodes 1 \
    --max-nodes 5 \
    --max-pods-per-node 110 \
    --root-volume-size 50 \
    --subnet-id NODEPOOL_SUBNET_ID \
    --iam-instance-profile NODEPOOL_PROFILE \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --ssh-ec2-key-pair EC2_KEY_PAIR \
    --tags "google:gkemulticloud:cluster=aws-cluster-0"

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

  • NODEPOOL_SUBNET_ID: プライベート サブネットの作成の前提条件の手順で作成した、プライベート サブネットの 1 つの ID
  • NODEPOOL_PROFILE: ノードプールの IAM ロールの作成の前提条件の手順で選択した、ノードプール内の EC2 インスタンスの IAM インスタンス プロファイル名
  • CONFIG_KMS_KEY_ARN: ユーザーデータの暗号化に使用される AWS KMS 鍵の Amazon Resource Name(ARN)
  • EC2_KEY_PAIR(省略可): SSH 認証鍵ペアの作成の前提条件の手順で作成した、SSH アクセス(省略可)用に作成した EC2 鍵ペアの名前

クラスタのステータスを表示する

クラスタとノードプールを作成した後に、Google Cloud CLI または Google Cloud コンソールでクラスタのステータスを確認できます。クラスタのステータスを表示するには、Google Cloud CLI と Google Cloud コンソールのどちらを使用するかを選択して、次の操作を行います。

gcloud

クラスタの詳細を取得するには、gcloud container aws clusters describe コマンドを使用します。

gcloud container aws clusters describe CLUSTER_NAME \
    --location GOOGLE_CLOUD_LOCATION

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

  • CLUSTER_NAME: クラスタの名前
  • GOOGLE_CLOUD_LOCATION: クラスタを管理する Google Cloud のロケーション名

Google Cloud コンソール

  1. Google Cloud コンソールで、Google Kubernetes Engine クラスタの概要ページに移動します。

    GKE クラスタに移動

  2. クラスタは名前とロケーションごとに一覧表示されます。

  3. クラスタの名前をクリックします。クラスタの状態や有効な機能など、クラスタの情報を表示するパネルが表示されます。

クラスタの認証情報を取得する

クラスタの作成が完了したら、そのクラスタとやり取りするために必要な認証情報を取得します。

gcloud container aws clusters get-credentials aws-cluster-0

このコマンドは、Connect ゲートウェイ を使用して作成したクラスタにアクセスするように kubectl を構成します。Connect ゲートウェイを使用するには、少なくとも 1 つのノードプールが必要です。このノードプールが、クラスタ内の Deployment として実行される Connect エージェントに依存しているためです。

アプリケーションをクラスタにデプロイする

作成したクラスタに、コンテナ化されたアプリケーションをデプロイします。このクイックスタートでは、サンプルとして用意されている hello-app というウェブ アプリケーションをデプロイできます。

Kubernetes オブジェクトを使用して、クラスタのリソースを作成し、管理します。Deployment オブジェクトを使用して、ウェブサーバーなどのステートレス アプリケーションをデプロイします。インターネットからアプリケーションにアクセスする際のルールとロードバランサを定義するには、Service オブジェクトを使用します。

Deployment を作成する

クラスタで hello-app を実行するには、次のコマンドを実行してアプリケーションをデプロイする必要があります。

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Kubernetes コマンド kubectl create deployment で、hello-server という名前の Deployment が作成されます。この Deployment の Podhello-app コンテナ イメージを実行します。

このコマンドで:

  • --image にはデプロイするコンテナ イメージを指定します。上のコマンドでは、Artifact Registry リポジトリ us-docker.pkg.dev/google-samples/containers/gke/hello-app からサンプル イメージが取得されます。:1.0 には、pull するイメージのバージョンを指定します。バージョンを指定しない場合は、latest でタグ付けされたイメージが使用されます。

Deployment を公開する

アプリケーションをデプロイしたら、ユーザーがアクセスできるように、そのアプリケーションをインターネットに公開する必要があります。アプリケーションを公開するには、Service を作成します。Service は、アプリケーションと外部トラフィックに公開する Kubernetes リソースです。

アプリケーションを公開するには、次の kubectl expose コマンドを実行します。

kubectl expose deployment hello-server --type LoadBalancer --port 80 --target-port 8080

--type LoadBalancer フラグを渡すことで、コンテナに AWS ロードバランサが作成されます。--port フラグを指定すると、インターネット用に公開ポート 80 が初期化されます。--target-port フラグを使用すると、アプリケーションのポート 8080 にトラフィックがルーティングされます。

ロードバランサは、AWS ロードバランサの料金に従って課金されます。

アプリケーションを検査して表示する

  1. 実行中の Pod を検査するには、kubectl get pods を使用します。

    kubectl get pods
    

    クラスタで 1 つの hello-server Pod が実行されているはずです。

  2. hello-server Service を検査するには、kubectl get service を使用します。

    kubectl get service hello-server
    

    このコマンドの出力で、EXTERNAL-IP 列から Service の外部 IP アドレスをコピーします。

  3. 外部 IP と公開ポートを指定して、ウェブブラウザでアプリケーションを表示します。

    http://EXTERNAL-IP
    

これで、コンテナ化されたウェブ アプリケーションが GKE on AWS にデプロイされました。

クリーンアップ

  1. アプリケーションの Service と Deployment を削除します。

    kubectl delete service hello-server
    kubectl delete deployment hello-server
    
  2. gcloud container aws node-pools delete を実行して、ノードプールを削除します。

    gcloud container aws node-pools delete pool-0 --cluster aws-cluster-0
    
  3. gcloud container aws clusters delete を実行して、クラスタを削除します。

    gcloud container aws clusters delete aws-cluster-0
    

次のステップ