このチュートリアルでは、Web アプリケーションを Docker コンテナ イメージにパッケージ化し、そのコンテナ イメージを Google Kubernetes Engine (GKE) クラスタで実行する方法を示します。次に、ユーザーのニーズに合わせてスケーリングできる負荷分散されたレプリカのセットとして Web アプリケーションをデプロイします。 ## 目的 - サンプル Web アプリケーションを Docker イメージにパッケージ化する - Docker イメージを Artifact Registry にアップロードします - GKE クラスタを作成する - サンプル アプリをクラスターにデプロイする - デプロイの自動スケーリングを管理する - サンプル アプリをインターネットに公開する - サンプル アプリの新しいバージョンをデプロイする ## 費用 このチュートリアルでは、Google Cloud の次の課金対象コンポーネントを使用します。 予測される使用量に基づいて費用を見積もるには、 料金計算ツールを使用する このチュートリアルを終了したら、作成したリソースを削除することで、継続的な課金を避けることができます。詳細については、クリーンアップを参照してください。 ## 始める前に次の手順を実行して、Kubernetes Engine API を有効にします。 - Google Cloud アカウントにログインします。 Google Cloud を初めて使用する場合は、アカウントを作成して、Google のプロダクトが実際のシナリオでどのように機能するかを評価してください。新規のお客様は、ワークロードを実行、テスト、デプロイするための 300 ドルの無料クレジットも獲得できます - Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。 - Cloud プロジェクトで課金が有効になっていることを確認してください。プロジェクトで課金が有効になっているかどうかを確認する方法を学ぶ - Artifact Registry と Google Kubernetes Engine API を有効にする - Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。 - Cloud プロジェクトで課金が有効になっていることを確認してください。プロジェクトで課金が有効になっているかどうかを確認する方法を学ぶ - Artifact Registry と Google Kubernetes Engine API を有効にする オプション A: Cloud Shell を使用する 付属の Cloud Shell を使用して、このチュートリアルに従うことができます。 でプリインストール gcloud、 ドッカー、および 使用した kubectl コマンドライン ツール このチュートリアルで。 Cloud Shell を使用する場合、これらをインストールする必要はありません ワークステーションのコマンドライン ツール Cloud Shell を使用するには: - Google Cloud コンソールに移動します クリック クラウド シェルを有効にする Google Cloud コンソール ウィンドウの上部にあるボタン Google Cloud コンソールの下部にある新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます オプション B: コマンドライン ツールをローカルで使用する ワークステーションでこのチュートリアルに従う場合は、次の手順に従って必要なツールをインストールしてください。 Google Cloud CLI をインストールする gcloud CLI を使用して、Kubernetes コマンドライン ツールをインストールします。 kubectlis は、GKE クラスタのクラスタ オーケストレーション システムである Kubernetes との通信に使用されます。 gcloud コンポーネント インストール kubectl ワークステーションに Docker Community Edition (CE) をインストールします。これを使用して、アプリケーションのコンテナ イメージを構築します Git ソース管理ツールをインストールして、GitHub からサンプル アプリケーションをフェッチする ## リポジトリを作成する このチュートリアルでは、イメージを Artifact Registry に保存してデプロイします レジストリから。 Artifact Registry は、推奨されるコンテナ レジストリです。 Google クラウド。このクイック スタートでは、次の名前のリポジトリを作成します。 ハローレポ をセットする PROJECT_IDenvironment 変数を Google Cloud プロジェクト ID ( )。コンテナ イメージをビルドしてリポジトリにプッシュするときに、この環境変数を使用します。 PROJECT_ID エクスポート PROJECT_ID= PROJECT_ID 次のことを確認します。 PROJECT_IDenvironment 変数には正しい値があります: $PROJECT_ID をエコー Google Cloud CLI のプロジェクト ID を設定します。 gcloud config set プロジェクト $PROJECT_ID 出力: 更新されたプロパティ [コア/プロジェクト] を作成します 次のコマンドを使用した hello-reporepository: gcloud artifacts repositories create hello-repo \ --repository-format=docker \ --location= REGION\ --description="Docker リポジトリ"交換 次のように、リポジトリのリージョンを使用します。 領域 us-west1。利用可能な場所のリストを表示するには、次のコマンドを実行します。 gcloud アーティファクトのロケーション リスト ## コンテナ イメージのビルド このチュートリアルでは、サンプル Web をデプロイします と呼ばれるアプリケーション hello-app、書かれた Web サーバー メッセージですべてのリクエストに応答する Go で こんにちは世界!ポート 8080 で GKE は Docker イメージをアプリケーション デプロイ形式として受け入れます デプロイする前に hello-app から GKE へ、パッケージ化する必要があります の Docker イメージとしての hello-app ソース コード Docker イメージをビルドするには、ソース コードと Dockerfile が必要です。 Dockerfile には、イメージのビルド方法に関する指示が含まれています ダウンロード 次のコマンドを実行して、hello-appsource コードと Dockerfile を実行します。 git クローン httpsgithub.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/hello-app の Docker イメージをビルドしてタグを付ける こんにちはアプリ: docker ビルド -t リージョン-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 このコマンドは、Docker にイメージをビルドするように指示します。 現在のディレクトリにある Dockerfile をローカル環境に保存し、次のような名前でタグ付けします。 us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1.イメージは、次のセクションで Artifact Registry にプッシュされます - の PROJECT_ID 変数は、コンテナー イメージを Google Cloud プロジェクトの hello-repopository - の us-west1-docker.pkg.devprefix は、リポジトリのリージョン ホストである Artifact Registry を指します - の 実行します ビルドが成功したことを確認する docker images コマンド: ドッカー画像 出力: リポジトリ タグ イメージ ID 作成サイズ us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 秒前 54 MB ## ローカルでコンテナーを実行する (オプション) ローカルの Docker エンジンを使用してコンテナー イメージをテストします。 docker run --rm -p 8080:8080 リージョン-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Cloud Shell を使用している場合は、 ウェブプレビューボタン を選択します。 8080 ポート番号。 GKE は、プロキシ サービスのプレビュー URL を新しいブラウザ ウィンドウで開きます。 それ以外の場合は、新しいターミナル ウィンドウ (または Cloud Shell タブ) を開き、次のコマンドを実行して、コンテナーが機能し、"Hello, World curl httplocalhost:8080 成功した応答を確認したら、 を押してコンテナーをダウンさせます。 タブで Ctrl+C docker runコマンドが実行されています ## Docker イメージを Artifact Registry にプッシュする GKE クラスタがコンテナ イメージをダウンロードして実行できるように、コンテナ イメージをレジストリにアップロードする必要があります。このチュートリアルでは、コンテナーを Artifact Registry に保存します。 Artifact Registry に対して認証するように Docker コマンドライン ツールを構成します。 gcloud auth configure-docker REGION-docker.pkg.dev ビルドした Docker イメージをリポジトリにプッシュします。 ドッカープッシュ リージョン-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 ## GKE クラスタの作成 Docker イメージが Artifact Registry に保存されたので、GKE を作成します 集まる 走る ハローアプリ。 GKE クラスタは、Compute Engine VM インスタンスのプールで構成されています オープンソースのクラスタ オーケストレーションである Kubernetes を実行 GKE を強化するシステム クラウド シェル Compute Engine のゾーンまたはリージョンを設定します。 GKE で使用することを選択した操作モードに応じて、デフォルトのゾーンまたはリージョンを指定します。標準モードを使用する場合、クラスターは (このチュートリアルでは) ゾーンであるため、デフォルトのコンピューティング ゾーンを設定します。 Autopilot モードを使用する場合、クラスターはリージョンであるため、デフォルトのコンピューティング リージョンを設定します。作成した Artifact Registry リポジトリに最も近いゾーンまたはリージョンを選択します などの標準クラスター us-west1-a: gcloud config set コンピューティング/ゾーン COMPUTE_ZONE Autopilotcluster など us-west1: gcloud config set コンピューティング / リージョン COMPUTE_REGION - という名前のクラスターを作成します。 ハロークラスター: 標準クラスタ: gcloud コンテナ クラスタは hello-cluster を作成します 自動操縦クラスター: gcloud コンテナ クラスタ create-auto hello-cluster GKE クラスタが作成されてヘルスチェックされるまで数分かかります - コマンドが完了したら、次のコマンドを実行して、クラスターの 3 つのノードを確認します。 kubectl でノードを取得 出力: 名前 ステータス 役割 年齢 バージョン gke-hello-cluster-default-pool-229c0700-cbtd Ready 92s v1.18.12-gke.1210 gke-hello-cluster-default-pool-229c0700-fc5j Ready 91s v1.18.12-gke.1210 gke-hello-cluster-default-pool-229c0700-n9l7 Ready 92s v1.18.12-gke.1210 Console Go to the Google Kubernetes Enginepage in the Google Cloud console Go to Google Kubernetes Engine Click Create Choose Standard or Autopilot mode and click Configure In the Namefield, enter the name hello-cluster Select a zone or region: Standardcluster: Under Location type, select Zonaland then select a Compute Engine zone from the Zonedrop-down list, such as us-west1-a Autopilotcluster: Select a Compute Engine region from the Regiondrop-down list, such as us-west1 - Click Create. This creates a GKE cluster Wait for the cluster to be created. When the cluster is ready, a green check mark appears next to the cluster name ## Deploying the sample app to GKE You are now ready to deploy the Docker image you built to your GKE cluster Kubernetes represents applications as Pods, which are scalable units holding one or more containers. The Pod is the smallest deployable unit in Kubernetes. Usually, you deploy Pods as a set of replicas that can be scaled and distributed together across your cluster. One way to deploy a set of replicas is through a Kubernetes Deployment In this section, you create a Kubernetes Deployment to run hello-app on your cluster. This Deployment has replicas (Pods). One Deployment Pod contains only one container: the hello-app Docker image You also create a HorizontalPodAutoscaler resource that scales the number of Pods from 3 to a number between 1 and 5, based on CPU load Cloud Shell Ensure that you are connected to your GKE cluster gcloud container clusters get-credentials hello-cluster --zone COMPUTE_ZONE Create a Kubernetes Deployment for your hello-appDocker image kubectl create deployment hello-app --image= REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 Set the baseline number of Deployment replicas to 3 kubectl scale deployment hello-app --replicas=3 Create a HorizontalPodAutoscalerresource for your Deployment kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5 To see the Pods created, run the following command: kubectl get pods Output: NAME READY STATUS RESTARTS AGE hello-app-784d7569bc-hgmpx 1/1 Running 0 10s hello-app-784d7569bc-jfkz5 1/1 Running 0 10s hello-app-784d7569bc-mnrrl 1/1 Running 0 15s Console Go to the Workloadspage in the Google Cloud console Click Deploy In the Specify containersection, select Existing container image In the Image pathfield, click Select In the Select container imagepane, select the hello-appimage you pushed to Artifact Registry and click Select In the Containersection, click Done, then click Continue In the Configurationsection, under Labels, enter appfor Keyand hello-appfor Value Under Configuration YAML, click View YAML. This opens a YAML configuration file representing the two Kubernetes API resources about to be deployed into your cluster: one Deployment, and one HorizontalPodAutoscalerfor that Deployment Click Close, then click Deploy When the Deployment Pods are ready, the Deployment detailspage opens Under Managed pods, note the three running Pods for the hello-appDeployment ## Exposing the sample app to the internet While Pods do have individually-assigned IP addresses, those IPs can only be reached from inside your cluster. Also, GKE Pods are designed to be ephemeral, starting or stopping based on scaling needs. And when a Pod crashes due to an error, GKE automatically redeploys that Pod, assigning a new Pod IP address each time What this means is that for any Deployment, the set of IP addresses corresponding to the active set of Pods is dynamic. We need a way to 1) group Pods together into one static hostname, and 2) expose a group of Pods outside the cluster, to the internet Kubernetes Services solve for both of these problems Services group Pods into one static IP address, reachable from any Pod inside the cluster GKE also assigns a DNS hostname to that static IP. For example, hello-app.default.svc.cluster.local The default Service type in GKE is called ClusterIP, where the Service gets an IP address reachable only from inside the cluster To expose a Kubernetes Service outside the cluster, create a Service of type LoadBalancer This type of Service spawns an External Load Balancer IP for a set of Pods, reachable through the internet In this section, you expose the hello-app Deployment to the internet using a Service of type LoadBalancer Cloud Shell Use the kubectl exposecommand to generate a Kubernetes Service for the hello-appdeployment: kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080 Here, the --portflag specifies the port number configured on the Load Balancer, and the --target-portflag specifies the port number that the hello-appcontainer is listening on Run the following command to get the Service details for hello-app-service: kubectl get service Output: NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10s Copy the EXTERNAL_IPaddress to the clipboard (for instance: 203.0.113.0) Console Go to the Workloadspage in the Google Cloud console Click hello-app From the Deployment details page, click Actions > Expose In the Exposedialog, set the Target portto 8080. This is the port the hello-appcontainer listens on From the Service typedrop-down list, select Load balancer Click Exposeto create a Kubernetes Service for hello-app When the Load Balancer is ready, the Service detailspage opens Scroll down to the External endpointsfield, and copy the IP address Now that the hello-app Pods are exposed to the internet through a Kubernetes Service, you can open a new browser tab, and navigate to the Service IP address you copied to the clipboard. A Hello, World! message appears, along with a Hostname field. The Hostname corresponds to one of the three hello-app Pods serving your HTTP request to your browser ## Deploying a new version of the sample app In this section, you upgrade hello-app to a new version by building and deploying a new Docker image to your GKE cluster GKE's rolling update feature lets you update your Deployments without downtime. During a rolling update, your GKE cluster incrementally replaces the existing hello-app Pods with Pods containing the Docker image for the new version During the update, your load balancer service routes traffic only into available Pods Return to Cloud Shell, where you have cloned the hello app source code and Dockerfile. Update the function hello()in the main.gofile to report the new version 2.0.0 Build and tag a new hello-appDocker image docker build -t REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Push the image to Artifact Registry docker push REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Now you're ready to update your hello-app Kubernetes Deployment to use a new Docker image Cloud Shell Apply a rolling update to the existing hello-appDeployment with an image update using the kubectl set imagecommand: kubectl set image deployment/hello-app hello-app= REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 Watch the running Pods running the v1image stop, and new Pods running the v2image start watch kubectl get pods Output: NAME READY STATUS RESTARTS AGE hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s hello-app-89dc45f48-scm66 1/1 Running 0 2m40s In a separate tab, navigate again to the hello-app-serviceExternal IP. You should now see the Versionset to 2.0.0 Console Go to the Workloadspage in the Google Cloud console Click hello-app On the Deployment detailspage, click Actions > Rolling update In the Rolling updatedialog, set the Image of hello-appfield to REGION-docker.pkg.dev/ PROJECT_ID/hello-repo/hello-app:v2 Click Update On the Deployment detailspage, inspect the Active Revisionssection. You should now see two Revisions, 1 and 2. Revision 1 corresponds to the initial Deployment you created earlier. Revision 2 is the rolling update you just started After a few moments, refresh the page. Under Managed pods, all of the replicas of hello-appnow correspond to Revision 2 In a separate tab, navigate again to the Service IP address you copied. The Versionshould be 2.0.0 ## Clean up To avoid incurring charges to your Google Cloud account for the resources used in this tutorial, either delete the project that contains the resources, or keep the project and delete the individual resources Delete the Service:This deallocates the Cloud Load Balancer created for your Service: kubectl delete service hello-app-service Delete the cluster:This deletes the resources that make up the cluster, such as the compute instances, disks, and network resources: gcloud container clusters delete hello-cluster --zone COMPUTE_ZONE Delete your container images:This deletes the Docker images you pushed to Artifact Registry gcloud artifacts docker images delete REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v1 \ --delete-tags --quiet gcloud artifacts docker images delete \ REGION-docker.pkg.devPROJECT_ID}/hello-repo/hello-app:v2 \ --delete-tags --quiet ## What's next Learn about Pricing for GKE and use the Pricing Calculator to estimate costs Read the Load Balancers tutorial, which demonstrates advanced load balancing configurations for web applications Configure a static IP and domain name for your application Explore other Kubernetes Engine tutorials Explore reference architectures, diagrams, tutorials, and best practices about Google Cloud. Take a look at our Cloud Architecture Center ## Try it for yourself If you're new to Google Cloud, create an account to evaluate how GKE performs in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.Try GKE free