GKEチュートリアルでコンテナ化したWEBアプリのデプロイ
- 参考記事 : GKE チュートリアル
この記事でやること
アプリを Docker イメージにパッケージ化します
マシン上でコンテナをローカルに実行します(オプション)
イメージをレジストリにアップロードします
コンテナ クラスタを作成します
アプリをクラスタにデプロイします
アプリをインターネットに公開します
デプロイメントをスケールアップします
新しいバージョンのアプリをデプロイします
事前準備
Google Cloud Console で Kubernetes Engine ページにアクセスします。
プロジェクトを作成または選択します。
API と関連サービスが有効になるのを待ちます。 これには数分かかることがあります。
Google Cloud プロジェクトに対して課金が有効になっていることを確認します。 プロジェクトに対して課金が有効になっていることを確認する方法を学習する。
コマンドラインツールのインストール
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
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