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

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

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

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