クイックスタート

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

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

このページの手順に従うことも、このクイックスタートを Google Cloud トレーニング ラボとして試すこともできます。

ラボで試す

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Console で Kubernetes Engine ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. simple
  5. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する

割り当て要件

このクイックスタートを完了するには、次のものに対して使用可能な割り当て数が必要です。

  • クラスタのリージョン内の Compute Engine CPU。
  • 使用中の IP アドレス。

使用可能な割り当てを確認するには、Cloud Console を使用してください。

シェルを選択する

このクイックスタートを完了するには、Cloud Shell またはローカルシェルを使用します。

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

ローカルシェルを使用する場合は、環境に gcloud ツールと kubectl ツールをインストールする必要があります。

Cloud Shell

Cloud Shell を起動するには、次の手順に従います。

  1. Google Cloud Console に移動します。

    Google Cloud Console

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

コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルで gcloud コマンドと kubectl コマンドを実行します。

ローカルシェル

gcloudkubectl をインストールするには、次の手順に従います。

  1. Cloud SDK をインストールします。これには、gcloud コマンドライン ツールが含まれています。
  2. Cloud SDK をインストールしたら、次のコマンドを実行して kubectl コマンドライン ツールをインストールします。

    gcloud components install kubectl

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

gcloud ツールを使用して 2 つのデフォルト設定を構成します。1 つはデフォルトのプロジェクト、もう 1 つは コンピューティング ゾーンです。

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

コンピューティング ゾーンとは、クラスタとそのリソースが有効になるリージョンのロケーションです。たとえば、us-west1-aus-west リージョン内のゾーンです。

gcloud コマンドを実行するには、使用するプロジェクトとコンピューティング ゾーンを指定する必要があります。これらのデフォルト設定を構成しておくと、gcloud コマンドをより簡単に実行できます。これらの設定を指定することも、gcloud コマンドに --project--zone--cluster などのフラグを使用してデフォルト設定を上書きすることもできます。

デフォルトのプロジェクトとコンピューティング ゾーンを構成した後に GKE リソースを作成すると、そのプロジェクトとゾーンにリソースが自動的に作成されます。

デフォルトのプロジェクトの設定

次のコマンドを実行します。project-id はプロジェクト ID で置き換えます。

    gcloud config set project project-id

デフォルトのコンピューティング ゾーンの設定

次のコマンドを実行します。compute-zone は、コンピューティング ゾーン(us-west1-a など)で置き換えます。

    gcloud config set compute/zone compute-zone
    

GKE クラスタの作成

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

次のコマンドは、1 ノードのクラスタを作成します。cluster-name は、使用するクラスタの名前に置き換えます。

    gcloud container clusters create cluster-name --num-nodes=1

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

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

    gcloud container clusters get-credentials cluster-name

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

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

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

GKE では、クラスタ リソースの作成と管理に Kubernetes オブジェクトを使用します。Kubernetes には、ウェブサーバーのようなステートレス アプリケーションをデプロイするための Deployment オブジェクトが用意されています。インターネットからアプリケーションにアクセスする際のルールと負荷分散を定義するには、Service オブジェクトを使用します。

Deployment を作成する

クラスタで hello-app を実行するには、次のコマンドを実行します。

    kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0
    

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

コマンドの内容:

  • --image にはデプロイするコンテナ イメージを指定します。上の例では、Container Registry バケット gcr.io/google-samples/hello-app からサンプル イメージが取得されます。:1.0 には、pull するイメージのバージョンを指定します。バージョンを指定しない場合は、最新バージョンが使用されます。

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 cluster-name

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

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

hello-app は、Docker コンテナ イメージとしてパッケージ化されています。コンテナ イメージは、Container Registry などの任意の Docker イメージ レジストリに格納されます。hello-app は、gcr.io/google-samples/hello-app という名前の Container 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.8-alpine
    ADD . /go/src/hello-app
    RUN go install hello-app

    FROM alpine:latest
    COPY --from=0 /go/bin/hello-app .
    ENV PORT 8080
    CMD ["./hello-app"]
    

次のステップ