先月からなぜか Kubernetes の素振りをしています。

職場の若者が先日発売された『WEB+DB PRESS Vol.99』の牧さんの記事、
「実践Kubernetes」をオススメしていたので、流れで実際に動かしてみま
した。

この記事は先週の『Kubernetes Meetup Tokyo #5』[2017-06-29-1] でも
オススメされていました。

WEB+DB PRESS Vol.99 amazon.co.jp

第4章で実際に GKE を使うことになるのですが、記事に書いてあるコマ
ンドや設定はそのままでは動かず、大変難儀しました。誰かの役に立つか
もしれないので、人知れずメモしておきます。

注意点

私は Kubernetes(以下 k8s)を使い始めたばかりです。

今回の件が、記事で使われているバージョン(1.6.1)と、現在 GKE で使
えるバージョン(1.6.6)の違いによるものなのか、本当に記事が間違っ
ているのか分かっていません。

どちらにせよ、網羅的に k8s を解説してくれたことには大変感謝してい
ます。おかげさまで、さあ使ってみよう!という気になりました。

記事のサンプルコードや YAML はサポートサイト からダウンロード出来ま
す。typo でつまづくのももったいないので、こちらを使うのが良いかも
しれません。特に今回は YAML が改ページで区切られている箇所があり、
手打ちは難易度高かったです。← あとからサンプルコードの存在を知奴

つまづいたメモ

それでは順番に記載していきます。

P94「Podの定義」

記事では $PROJECT_ID がそのまま書かれていましたが、実際は展開する
必要がありました。注意書きを書いたり、{{PROJECT_ID}} などと環境変
数とは別のフォーマットを使ったほうが良かったかもしれません。

直前の cloudbuild.yaml では $PROJECT_ID の展開は必要ないため、気づ
くのに時間がかかりました。最終的には $ kubectl get pods で確認でき
る STATUS が InvalidImageName になっており、気づきました。

--- ../WDB99-toku3-k8s/WDB99-toku3-k8s/pod.yaml	2017-05-09 17:03:05.000000000 +0900
+++ pod.yaml	2017-07-04 23:27:21.000000000 +0900
@@ -4,6 +4,7 @@
   name: hello-world
 spec:
   containers:
-    - image: asia.gcr.io/$PROJECT_ID/wdpress/hello-world
+    # $PROJECT_ID は展開する必要があった
+    - image: asia.gcr.io/wdpress-123456/wdpress/hello-world
       imagePullPolicy: Always
       name: hello-world

あと、P95 でマニフェストファイル(pod.yaml)を作成せずにコマンドラ
インで Pod を作成する同等の例が書かれていますが、pod ではなく
deployment が作成されるようなので、ちょっと違うのかな?と思いました。

$ kubectl run hello-world --image=asia.gcr.io/$PROJECT_ID/wdpress/hello-world --port=8080
deployment "hello-world" created

実際、この後に紹介される
$ kubectl delete pods hello-world
では削除できず、
$ kubectl delete deployments hello-world
で削除できました。

P95「Pod の状態確認」

$ kubectl get pods -l name=hello-world
で確認していますが、No resources found. が返ってしまいました。
$ kubectl get pods
でないと確認できませんでした。

またこの時点での Pod は 1 つだと思いますが、記事では 3 つ表示され
ており、どこか間違っているのか考え込んでしまいました。

何度も試すうちに、1 つが正解だろうという結論に至りました。

蛇足になりますが、このあとの「Podへのアクセス設定」の $POD_NAME は
この時点では hello-world の方が分かりやすいと思います。

P95「設定の適用」

P96 の $ kubectl create -f pod-configmap.yaml を実行したところ、

The Pod "" is invalid: metadata.name: Required value: name or generateName is required
というエラーになってしまいました。

試行錯誤して、以下の修正に落ち着きました。

--- ../WDB99-toku3-k8s/WDB99-toku3-k8s/pod-configmap.yaml	2017-05-09 17:03:05.000000000 +0900
+++ pod-configmap.yaml	2017-07-04 23:58:45.000000000 +0900
@@ -1,11 +1,11 @@
 apiVersion: v1
 kind: Pod
 metadata:
-  labels:
-    name: hello-world
+  name: hello-world
 spec:
   containers:
-    - image: asia.gcr.io/$PROJECT_ID/wdpress/hello-world
+    # $PROJECT_ID は展開する必要があった
+    - image: asia.gcr.io/wdpress-123456/wdpress/hello-world
       imagePullPolicy: Always
       name: hello-world
       env:

$PROJECT_ID の展開が必要な点は pod.yaml と同じです。これ以降登場す
る YAML ファイルは全て展開が必要でした。

あと、$ kubectl create -f pod-configmap.yaml の前に
$ kubectl create -f configmap.yaml が必要でした。
(順番は後でも大丈夫かも。)

ConfigMap の削除は
$ kubectl delete configmaps hello-world-config
で良いみたいでした。

P96「ReplicaSetを使ったデプロイ」

右上の $ kubectl delete pods -l $POD_NAME は
No resources found が返ってきてしまいました。
-l は要らないみたいです。

P96「Deploymentを使ったデプロイ」

P97 で “kubectl update で変更を適用してみましょう”
とありましたが、以下のエラーが返ってきました。

$ kubectl update
W0705 00:16:04.340422   28610 cmd.go:361] update is DEPRECATED and will be removed in a future version. Use replace instead.
error: Must specify --filename to replace
See 'kubectl replace -h' for help and examples.

こちらで良いみたいです。

$ kubectl replace -f deployment.yaml
deployment "hello-world" replaced

P97「IngressによるHTTP Load Balancerの作成」

P98 で “前述のServiceの定義からLoadBalancerの行を削除しましょう”
と書いてあります。$ kubectl replace -f service.yaml についても
書いたほうが親切だと思いました。

kubectl replace しなくても Ingress 経由でのアクセスは出来るので、
ちょっと細かいかもしれません。

最後に

WEB+DB PRESS Vol.99の「実践Kubernetes」の第4章を実際に試してみて、
私がつまづいた箇所をまとめました。

初心者はまだ情報の拠り所がないため、サンプルコードが動かないと、心
が折れてしまうかもしれません。私も今回一度折れました。

この記事を書くために第4章を何度も試し、結果的に kubectl に慣れて
きました。今回はサンプルコードが動かなくて良かったのかなw

Kubernetes はアップデートが早く、記事と現在の整合性を取るのが難し
そうです。そんな中、記事を書いて下さった牧さんにお礼申し上げます。