こんにちは、こえじまです。
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があるのが分かります。
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 .
[aside]ワンポイント
tarのオプションは以下の通り。
-x ファイルを解凍
-v 詳細を標準出力に表示
-z gzipを対象とする
-f ファイルを指定
[/aside]
[aside]ワンポイント
docker buildはDockerfileがあるディレクトリを指定して実行する必要があります。
今回は末尾の.(ドット)で指定しています。
[/aside]
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したイメージがあることを確認しておきましょう。
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をクリック。
設定が終わるとこんな感じです。
CONTINUEをクリック。
Configurationの設定
デプロイするアプリケーションの設定をします。
- Applicatin name: echo-app
- Namespace: default(変更なし)
- Labelは勝手に入ります
- Cluster > Kubenetes Cluster: echo-cluster (us-central1-a)
[aside]ワンポイント
上図のようにクラスタの部分が赤枠で囲われているとクラスタのデプロイが完了していないので、DEPLOYボタンを押せません。
一回他の画面に移り、ちょっと待ってから再度設定してみてください。
[/aside]
DEPLOYをクリックしてデプロイが完了するまで少し待ちます。
Exposeの設定
完了したらecho-appの画面が表示されていると思います。されていなければWorkloadsに表示されるsample-appをクリックしましょう。
serviceを作るため、画面右のほうのExposeボタンをクリック。
以下を入力し、Exposeをクリック。
- Port: 80
- Target port: 8000
- Protocol: TCP
- Service type: Load balancer
- Service name: echo-web
作成中の画面が表示されるので、完了するまで待ちます。
Exposeが完了したら、echo-web画面が表示されるので、External endpointsのIPを確認します。
[aside]ワンポイント
echo-webはecho-appのDeployment detials画面の下部にある、Exposing servicesで、echo-webをクリックしても確認できます。
[/aside]
起動確認のため、そのグローバルIPにアクセスしてみましょう。(クリックしてはダメなのでhttp://External IP:80と入力しましょう)
下のような画面が表示されればOKです。
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
[aside]余談
gcloudコマンドではオプションの後を=(イコール)でつなぐのに対し、kubectlだとスペースでつなぐんですね。
[/aside]
起動確認のためecho-webのExternal IPにアクセスしてみましょう。
これで全タスク完了です。
お疲れさまでした!
このラボが含まれる、Cloud Architecture: Design, Implement, and Manageのクエスト解説は次の記事でまとめています。
良かったらそちらもご覧ください。
[kanren2 postid=”2317″]
コメント
とても参考になりました。
ありがとうございます。
servicesのスペルが誤っておりましたので、ご連絡いたします。
# External IPを確認
kubectl get servises
匿名さん
コメントありがとうございます。
参考になったとのこと、大変嬉しいです。
ご指摘のservicesについては大変失礼いたしました。
修正いたしました。
とても参考になる記事をありがとうございます。
質問をお願いいたします。
Task1. タグ付きDockerイメージをビルドする
# -tオプションでタグを付けてビルド
docker build -t echo-app:v1 .
↑の部分を実行すると↓のエラーコードがでてその先へすすめません。
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/student_01_1b8d26109072/Dockerfile: no such file or directory
改善方法を教えていただけると幸いです。
よろしくお願いいたします。
まえじまさん
no such file or directoryと表示されていることから、Dockerfileがホームディレクトリ(~/)に存在しないのかと思われます。
tarコマンドでの解凍はエラー無く出来ておりますでしょうか?
tar実行後、ls ~/にてDockerfileが確認できないようでしたらecho-web.tar.gzに不備がある可能性があります。
その場合はqwiklabs側にお問い合わせいただいた方が良いかと思います。
当方の環境が消されており再現できないのが大変申し訳ないのですが、ご参考になりましたら幸いです。
こえじま様
お返事ありがとうございます。
記事のおかげで解凍まではエラーなく進んでおります。
ご提案いただいた内容を実行してみます。
それでもできないようでしたら問い合わせてみます。
よろしくお願いいたします。