開発日報

窓際エンジニアの開発備忘。日報は嘘です。

GKEチュートリアルやってみる ~ GKEでhello world ~

GKEチュートリアルでコンテナ化したWEBアプリのデプロイ

この記事でやること

  1. アプリを Docker イメージにパッケージ化します

  2. マシン上でコンテナをローカルに実行します(オプション)

  3. イメージをレジストリにアップロードします

  4. コンテナ クラスタを作成します

  5. アプリをクラスタにデプロイします

  6. アプリをインターネットに公開します

  7. デプロイメントをスケールアップします

  8. 新しいバージョンのアプリをデプロイします

事前準備

  1. Google Cloud Console で Kubernetes Engine ページにアクセスします。

  2. プロジェクトを作成または選択します。

  3. API と関連サービスが有効になるのを待ちます。 これには数分かかることがあります。

  4. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する。

コマンドラインツールのインストール

  1. Google Cloud SDK をインストールします。

  2. Kubernetes コマンドライン ツール (kubectl) をインストールします。

gcloud components install kubectl

ステップ 1: コンテナ イメージを作成する

ソースをダウンロードします。

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples

cd kubernetes-engine-samples/hello-app

環境変数 PROJECT_ID に Google Cloud プロジェクト ID を設定します。

export PROJECT_ID=[PROJECT_ID]

このアプリケーションのコンテナ イメージを作成し、アップロード用のタグを付けるには、次のコマンドを実行します。

docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .

イメージ作成結果を確認します

docker images

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
gcr.io/kube-test-259613/hello-app   v1                  7fab063f3686        23 seconds ago      11.5MB
<none>                              <none>              7a61a726c05c        28 seconds ago      263MB
alpine                              latest              f70734b6a266        4 weeks ago         5.61MB
golang                              1.8-alpine          4cb86d3661bf        2 years ago         257MB

ステップ 2: コンテナ イメージをアップロードする

GKE がダウンロードして実行できるように、コンテナ イメージをレジストリにアップロードする必要があります。

まず、Container Registry で認証を行うように Docker コマンドライン ツールを構成します。

gcloud auth configure-docker

docker pushして、Containe Registryにアップします

docker push gcr.io/${PROJECT_ID}/hello-app:v1

ステップ 3: コンテナをローカルで実行する

ローカルでコンテナイメージをテストするには、次のコマンドを実行します。

docker run --rm -p 8080:8080 gcr.io/${PROJECT_ID}/hello-app:v1

http://localhost:8080
にアクセスして動作確認してみましょう。

ステップ 4: コンテナ クラスタを作成する

gcloud ツールでプロジェクトID と ComputeEngineゾーンのオプションを設定します。

gcloud config set project $PROJECT_ID
gcloud config set compute/zone asia-northeast1-a

次のコマンドを実行して、hello-cluster という名前で 2 ノードクラスタを作成します。

gcloud container clusters create hello-cluster --num-nodes=2

クラスタの2つのワーカーVM ンスタンスを確認します。

gcloud compute instances list

ステップ 5: アプリケーションをデプロイする

次のコマンドを実行して、アプリケーションをデプロイします。

kubectl create deployment hello-web --image=gcr.io/${PROJECT_ID}/hello-app:v1

hello-webという Deploymentクラスタに作成されました。

次のコマンドを実行し、Deploymentによって作成されたPodを表示します。

kubectl get pods

------------------
NAME                        READY   STATUS    RESTARTS   AGE
hello-web-547c59b6c-nlb5m   1/1     Running   0          4m50s

ステップ 6: アプリケーションをインターネットに公開する

kubectl expose deployment hello-web --type=LoadBalancer --port 80 --target-port 8080

kubectl exposeによって Service が作成されます。

ServiceでGKEはアプリケーションのグローバルIPとロードバランサを作成します。

以下のコマンドでGKEがアプリケーションにプロビジョニングしたグローバルIPを確認します。

kubectl get service

-------------------

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
hello-web    LoadBalancer   10.55.245.170   XX.XX.XX.XXX   80:31163/TCP   4m20s

ブラウザで http://XX.XX.XX.XXX にアクセスしてみましょう

ステップ 7: アプリケーションをスケールアップする

kubectl scaleコマンドを使用してレプリカの数を指定します。

kubectl scale deployment hello-web --replicas=3

デプロイメントの確認

kubectl get deployment hello-web

NAME        READY   UP-TO-DATE   AVAILABLE   AGE
hello-web   3/3     3            3           60m

podの確認

kubectl get pods

NAME                        READY   STATUS    RESTARTS   AGE
hello-web-547c59b6c-6979m   1/1     Running   0          71s
hello-web-547c59b6c-nlb5m   1/1     Running   0          61m
hello-web-547c59b6c-xw55v   1/1     Running   0          71s

ステップ 8: アプリの新しいバージョンをデプロイする

ソースコードを変更して新しいコンテナイメージを作成し、反映してみましょう。

まず、main.goの「hello」関数内の"Hello, World!"を以下にように"Hello, world v2!!"に書き換えます。

func hello(w http.ResponseWriter, r *http.Request) {
    log.Printf("Serving request: %s", r.URL.Path)
    host, _ := os.Hostname()
    fmt.Fprintf(w, "Hello, world v2!!\n")
    fmt.Fprintf(w, "Version: 1.0.0\n")
    fmt.Fprintf(w, "Hostname: %s\n", host)
}

コンテナイメージをビルドします。

docker build -t gcr.io/${PROJECT_ID}/hello-app:v2 .

出来上がったイメージを Google Container Registry に push します。

docker push gcr.io/${PROJECT_ID}/hello-app:v2

次に、イメージ更新で既存のデプロイにローリングアップデートを適用します。

kubectl set image deployment/hello-web hello-app=gcr.io/${PROJECT_ID}/hello-app:v2

ブラウザで http://XX.XX.XX.XXX にアクセスして変更を確認します。

クリーンアップ

サービスを削除し、サービス用に作成された Cloud Load Balancer の割り当てを解除します。

kubectl delete service hello-web

コンテナクラスタを削除します。

gcloud container clusters delete hello-cluster