アプリを GKE クラスタにデプロイする


このクイックスタートでは、シンプルなウェブサーバーのコンテナ化されたアプリケーションを Google Kubernetes Engine(GKE)クラスタにデプロイします。ここでは、クラスタを作成する方法と、クラスタにアプリケーションをデプロイしてユーザーがアクセスできるようにする方法について説明します。

このクイックスタートは、Kubernetes の基本知識があることを前提としています。

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Artifact Registry and Google Kubernetes Engine API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

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

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Artifact Registry and Google Kubernetes Engine API を有効にします。

    API を有効にする

Cloud Shell を起動する

このチュートリアルでは、Google Cloud でホストされているリソースを管理するためのシェル環境である Cloud Shell を使用します。

Cloud Shell には、Google Cloud CLIkubectl コマンドライン ツールがプリインストールされています。gcloud CLI は Google Cloud への主要なコマンドライン インターフェースを提供し、kubectl は Kubernetes クラスタにコマンドを実行するためのコマンドライン インターフェースを提供します。

Cloud Shell を起動します。

  1. Google Cloud コンソールに移動します。

    Google Cloud コンソール

  2. コンソールの右上隅にある [Cloud Shell をアクティブにする] ボタン をクリックします。

コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルで gcloud コマンドと kubectl コマンドを実行します。コマンドを実行する前に、Google Cloud CLI で次のコマンドを使用してデフォルト プロジェクトを設定します。

gcloud config set project PROJECT_ID

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

GKE クラスタを作成する

クラスタは、少なくとも 1 つのクラスタのコントロール プレーン マシンと、ノードと呼ばれる複数のワーカーマシンで構成されます。ノードは Compute Engine 仮想マシン(VM)インスタンスであり、自身をクラスタの一部にするために必要な Kubernetes プロセスを実行します。アプリケーションをクラスタにデプロイすると、そのアプリケーションがこれらのノードで実行されます。

hello-cluster という名前の Autopilot クラスタを作成します。

gcloud container clusters create-auto hello-cluster \
    --location=us-central1

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

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

gcloud container clusters get-credentials hello-cluster \
    --location us-central1

このコマンドにより、作成したクラスタを使用するように kubectl が構成されます。

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

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

GKE では、クラスタ リソースの作成と管理に Kubernetes オブジェクトを使用します。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 フラグを渡すことで、コンテナに Compute Engine ロードバランサが作成されます。--port フラグを指定すると、インターネット用に公開ポート 80 が初期化されます。--target-port フラグを使用すると、アプリケーションのポート 8080 にトラフィックがルーティングされます。

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

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

  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 にデプロイされました。

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を実施します。

  1. kubectl delete を実行して、アプリケーションの Service を削除します。

    kubectl delete service hello-server
    

    このコマンドにより、Deployment の公開時に作成した Compute Engine ロードバランサが削除されます。

  2. gcloud container clusters delete を実行して、クラスタを削除します。

    gcloud container clusters delete hello-cluster \
        --location us-central1
    

省略可: hello-app コードのレビュー

hello-app は、main.goDockerfile という次の 2 つのファイルで構成されるシンプルなウェブサーバー アプリケーションです。

hello-app は、Docker コンテナ イメージとしてパッケージ化されています。コンテナ イメージは、Artifact Registry などの任意の Docker イメージ レジストリに格納されます。hello-appus-docker.pkg.dev/google-samples/containers/gke/hello-app の Artifact Registry リポジトリにホストされています。

main.go

main.go は、Go プログラミング言語で作成されたウェブサーバーの実装です。このサーバーは、HTTP リクエストに対して「Hello, world!」というメッセージを返します。

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
)

func main() {
	// register hello function to handle all requests
	mux := http.NewServeMux()
	mux.HandleFunc("/", hello)

	// use PORT environment variable, or default to 8080
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}

	// start the web server on port and accept requests
	log.Printf("Server listening on port %s", port)
	log.Fatal(http.ListenAndServe(":"+port, mux))
}

// hello responds to the request with a plain-text "Hello, world" message.
func hello(w http.ResponseWriter, r *http.Request) {
	log.Printf("Serving request: %s", r.URL.Path)
	host, _ := os.Hostname()
	fmt.Fprintf(w, "Hello, world!\n")
	fmt.Fprintf(w, "Version: 1.0.0\n")
	fmt.Fprintf(w, "Hostname: %s\n", host)
}

Dockerfile

Dockerfile は、Docker でビルドするイメージを記述します。記述内容には、イメージのリソースと依存関係のすべてが含まれ、アプリを公開するネットワーク ポートも指定します。このファイルの動作については、Docker ドキュメントの Dockerfile リファレンスをご覧ください。

FROM golang:1.21.0 as builder
WORKDIR /app
RUN go mod init hello-app
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /hello-app

FROM gcr.io/distroless/base-debian11
WORKDIR /
COPY --from=builder /hello-app /hello-app
ENV PORT 8080
USER nonroot:nonroot
CMD ["/hello-app"]

次のステップ

使ってみる

Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオで GKE のパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

GKE の無料トライアル