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