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

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

Terraform のサポート

Terraform に精通されている場合は、GitHub で利用可能な Terraform スクリプトを使用して前提条件を自動化し、クラスタを作成できます。

始める前に

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

  • クラスタが実行される Azure 仮想ネットワーク。
  • Kubernetes コントロール プレーン レプリカ用のサブネット。
  • GKE on Azure でサービス プリンシパルを使用して Azure 環境にアクセスできるようにする Azure ロールの割り当て。
  • GKE on Azure で Azure サービスの認証と Azure アカウントのリソース管理に使用する AzureClient リソース。
  • クラスタ内の Azure 仮想マシンにアクセスするための SSH 認証鍵ペア。

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

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

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

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

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

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

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

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

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

    gcloud config set project PROJECT_ID
    

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

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

    gcloud config set container_azure/location GOOGLE_CLOUD_LOCATION
    

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

クラスタの Azure リソース ID を選択

リソース グループ ID を選択する

次のコマンドを実行して、クラスタのリソース グループを環境変数に保存します。

CLUSTER_RESOURCE_GROUP_ID=$(az group show --query id --output tsv \
    --resource-group=CLUSTER_RESOURCE_GROUP_NAME)

CLUSTER_RESOURCE_GROUP_NAME は、Azure リソース グループの作成の前提条件の手順で設定したクラスタ リソースをプロビジョニングするリソース グループの名前に置き換えます。

仮想ネットワーク ID を選択

次のコマンドを実行して、クラスタの VNet ID を環境変数に保存します。

VNET_ID=$(az network vnet show --query id --output tsv \
    --resource-group=VNET_RESOURCE_GROUP_NAME \
    --name=VNET_NAME)

以下を置き換えます。

サブネット ID を選択

次のコマンドを実行して、クラスタのサブネット ID を環境変数に保存します。

SUBNET_ID=$(az network vnet subnet show --query id --output tsv \
    --resource-group VNET_RESOURCE_GROUP_NAME \
    --vnet-name VNET_NAME \
    --name SUBNET_NAME)

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

  • VNET_RESOURCE_GROUP_NAME は、仮想ネットワークを含む既存のリソース グループ名に置き換えます。これは、Azure 仮想ネットワークを作成するで設定したリソース グループの名前になります。
  • VNET_NAME は、仮想ネットワークの名前に置き換えます。これは、Azure 仮想ネットワークを作成するで設定した仮想ネットワークの名前になります。
  • SUBNET_NAME は、サブネットの名前に置き換えます(例: default)。

クラスタの 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 Azure でクラスタを作成するには、次のコマンドを使用します。

gcloud container azure clusters create azure-cluster-0 \
    --cluster-version 1.28.7-gke.1700 \
    --azure-region AZURE_REGION \
    --fleet-project FLEET_PROJECT_ID \
    --client CLIENT_NAME \
    --resource-group-id $CLUSTER_RESOURCE_GROUP_ID \
    --vnet-id $VNET_ID \
    --subnet-id $SUBNET_ID \
    --pod-address-cidr-blocks POD_CIDR_BLOCK \
    --service-address-cidr-blocks SERVICE_CIDR_BLOCK \
    --ssh-public-key "SSH_PUBLIC_KEY" \
    --tags "google:gkemulticloud:cluster=azure-cluster-0"

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

詳細とオプション パラメータについては、gcloud container azure clusters create のリファレンス ページをご覧ください。

ノードプールの作成

Google Cloud CLI を使用してノードプールを作成します。

gcloud container azure node-pools create pool-0 \
    --cluster azure-cluster-0 \
    --node-version 1.28.7-gke.1700 \
    --vm-size Standard_B2s \
    --max-pods-per-node 110 \
    --min-nodes 1 \
    --max-nodes 5 \
    --ssh-public-key "SSH_PUBLIC_KEY" \
    --subnet-id $SUBNET_ID \
    --tags "google:gkemulticloud:cluster=azure-cluster-0"

SSH_PUBLIC_KEY は、SSH 認証鍵ペアを作成するの前提条件の手順で作成された SSH 公開鍵のテキストに置き換えます。公開鍵を環境変数に保存している場合は、${SSH_PUBLIC_KEY} を使用できます。

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

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

gcloud

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

gcloud container azure 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 azure clusters get-credentials azure-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 フラグを渡すことで、コンテナに Azure ロードバランサが作成されます。--port フラグを指定すると、インターネット用に公開ポート 80 が初期化されます。--target-port フラグを使用すると、アプリケーションのポート 8080 にトラフィックがルーティングされます。

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

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

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

    kubectl get pods
    

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

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

    kubectl get service hello-server
    

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

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

    http://EXTERNAL-IP
    

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

クリーンアップ

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

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

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

    gcloud container azure clusters delete azure-cluster-0
    

次のステップ