[Qwiklabs]KubernetesクラスタへのDockerイメージのビルドとデプロイ

PR

こんにちは、こえじまです。

GCPのProfessional Cloud Architect受験に向け、Qwiklabsのハンズオンを勉強中です。

今回はKubernetesクラスタへのDockerイメージのビルドとデプロイ(GSP304)の解説をします。

シナリオ(抜粋)

サンプルアプリケーションをGoogle Cloud PlatformのKubernetesコンテナにデプロイできるかどうかを確認する必要があります。

開発チームが用意してくれたのはDockerfileとその関連コンテキストを備えたecho-webと呼ばれるシンプルなGoアプリケーションで、Dockerイメージをビルドすればすぐにデプロイできます。

GCSに保存されたサンプルアプリケーションをビルドし、Google Container Registryにpushしたうえでデプロイします。

注意しないといけないのは、以下の4点です。

  • ゾーンはus-central1-aを用いること
  • クラスタ名はecho-clusterにすること
  • アプリケーション名はecho-appにすること
  • Deployment名はecho-webにすること

ではやっていきましょう。

Task1. タグ付きDockerイメージをビルドする

まず、Storageバケットにecho-web.tar.gzがあることを確認しましょう。

ナビゲーションメニューのStorage > Browserをクリック。

バケットの確認

プロジェクト名と全く同じバケットがあるので、そのバケットをクリックすると、echo-web.tar.gzがあるのが分かります。

echo-web.tar.gzを確認

Cloud Shellを開き、以下のようにコマンドを入力してDockerイメージをビルドします。

# PROJECT名を変数に登録
export PROJECT=$(gcloud info --format='value(config.project)')

# GCSからecho-web.tar.gzをコピー
gsutil cp gs://${PROJECT}/echo-web.tar.gz .

# echo-web.tar.gzを解凍
tar -xvzf echo-web.tar.gz

# -tオプションでタグを付けてビルド
docker build -t echo-app:v1 .
ワンポイント
tarのオプションは以下の通り。
-x ファイルを解凍
-v 詳細を標準出力に表示
-z gzipを対象とする
-f ファイルを指定
ワンポイント
docker buildはDockerfileがあるディレクトリを指定して実行する必要があります。
今回は末尾の.(ドット)で指定しています。

Task2. イメージをGoogle Container Registryにpushする

引き続きCloud Shellでコマンドを実行していきます。

# Dockerイメージにタグを付ける
docker tag echo-app:v1 gcr.io/$PROJECT/echo-app:v1

# タグを付けたDockerイメージをGCRにpush
docker push gcr.io/$PROJECT/echo-app:v1

参考:イメージのタグ付け、送信、取得 — Docker-docs-ja 1.12.RC ドキュメント

ナビゲーションメニューのContainer Repository > Imagesにpushしたイメージがあることを確認しておきましょう。

GCRにpushされている

Task3. Kubernetesクラスタを作成する

GUIだと何度か画面を遷移して設定漏れが起きそうなのでCloud Shellでサクッと作ってしまいます。

# クラスタの作成
gcloud container clusters create echo-cluster --num-nodes=2 --machine-type=n1-standard-2 --zone=us-central1-a

参考:gcloud container clusters create | Cloud SDK Documentation

GUIの場合は、ナビゲーションメニューのKubernetes Engine > Clustersからをクリックした後、左側のメニューでパラメータを調整しなければいけないことにご注意ください。

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

GUIでやる場合

ナビゲーションメニューのKubernetes Engine > Workloadsをクリック。

画面上部のDEPLOYをクリックして、デプロイ画面に遷移します。

Containerの設定

コンテナイメージはGCRにpushしたDockerイメージを用います。

Existing container imageのimage pathでは、右側のSELECTをクリックし、下図のようにGCRにpushしたecho-appを選択して、CONTINUEをクリック。

echo-appを選択

設定が終わるとこんな感じです。

Containerの設定画面

CONTINUEをクリック。

Configurationの設定

デプロイするアプリケーションの設定をします。

  • Applicatin name: echo-app
  • Namespace: default(変更なし)
  • Labelは勝手に入ります
  • Cluster > Kubenetes Cluster: echo-cluster (us-central1-a)
Configurationの設定画面
ワンポイント
上図のようにクラスタの部分が赤枠で囲われているとクラスタのデプロイが完了していないので、DEPLOYボタンを押せません。
一回他の画面に移り、ちょっと待ってから再度設定してみてください。

DEPLOYをクリックしてデプロイが完了するまで少し待ちます。

Exposeの設定

完了したらecho-appの画面が表示されていると思います。されていなければWorkloadsに表示されるsample-appをクリックしましょう。

serviceを作るため、画面右のほうのExposeボタンをクリック。

Exposeの選択

以下を入力し、Exposeをクリック。

  • Port: 80
  • Target port: 8000
  • Protocol: TCP
  • Service type: Load balancer
  • Service name: echo-web
Exposeの設定

作成中の画面が表示されるので、完了するまで待ちます。

Service作成中

Exposeが完了したら、echo-web画面が表示されるので、External endpointsのIPを確認します。

External IPを確認
ワンポイント
echo-webはecho-appのDeployment detials画面の下部にある、Exposing servicesで、echo-webをクリックしても確認できます。

起動確認のため、そのグローバルIPにアクセスしてみましょう。(クリックしてはダメなのでhttp://External IP:80と入力しましょう)

下のような画面が表示されればOKです。

echo-appの画面

Cloud Shellでやる場合

# Cloud Shell以外でクラスタを作った場合は扱うクラスタを指定
gcloud container clusters get-credentials echo-cluster --zone=us-central1-a

# echo-appをクラスタにデプロイ
kubectl create deployment echo-app --image=gcr.io/${PROJECT}/echo-app:v1

# echo-webという名前で外部に公開
kubectl expose deployment echo-app --name echo-web --type LoadBalancer --port 80 --target-port 8000

# External IPを確認
kubectl get services
余談
gcloudコマンドではオプションの後を=(イコール)でつなぐのに対し、kubectlだとスペースでつなぐんですね。

起動確認のためecho-webのExternal IPにアクセスしてみましょう。

echo-appの画面

これで全タスク完了です。

完了!

お疲れさまでした!

このラボが含まれる、Cloud Architecture: Design, Implement, and Manageのクエスト解説は次の記事でまとめています。

良かったらそちらもご覧ください。

[Qwiklabs]Cloud Architecture: Design, Implement, and Manageの解説

2020年6月17日

PR

2 件のコメント

  • とても参考になりました。
    ありがとうございます。

    servicesのスペルが誤っておりましたので、ご連絡いたします。

    # External IPを確認
    kubectl get servises

    • 匿名さん
      コメントありがとうございます。
      参考になったとのこと、大変嬉しいです。

      ご指摘のservicesについては大変失礼いたしました。
      修正いたしました。

  • コメントを残す

    メールアドレスが公開されることはありません。