前回の記事で Kubernetes の公式チュートリアル Kubernetes Basics の前半3 Modulesを進めてみました。
blog.akanumahiroaki.com
今回は後半の 4 〜 6 Modules を進めてみます。
Services and Labels(Module 4)
Service は Pod とそれらにアクセスするためのポリシーの論理的なセットです。 Service が対象とする Pod は LabelSelector によって定義されます。
Pod はユニークな IP アドレスを保持していますが、 Service なしではその IP アドレスはクラスタの外へ公開されることはありません。
Service は ServiceSpec で指定した type によって異なる方法で公開されます。
ClusterIP(デフォルト):クラスタ内の internal IP 上に Service を公開します。クラスタ内からのみ到達可能です。
NodePort:NAT を使用して Node 上のポートに Service を公開します。外部からは Node の IP とポートを指定することでアクセス可能です。 ClusterIP の Superset です。
LoadBalancer:使用しているクラウド環境でサポートされていれば、外部ロードバランサーを作成し、 Service に外部 IP アドレスをアサインします。 NodePort の Superset です。
ExternalName:任意の名称を使用して、 CNAME レコードでその名称を返すことで Service を公開します。プロキシは使用されません。このタイプを使用するには v1.7 以上の kube-dns が必要です。
Selector なしで作成された Service はエンドポイントも作成しません。これによってマニュアルで Service を特定のエンドポイントにマップすることも可能になります。
Service は Pod のセットを横断してトラフィックをルーティングします。
Label はオブジェクトにアタッチされたキーバリューペアで、様々なケースで使用可能です。
まず Pod の状態を確認してみます。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-dg96d 1/1 Running 0 31s
Service の一覧を確認してみます。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 59s
kubernetes という名前の Service が Minikube でのクラスタ作成時にデフォルトで作成されています。新しい Service を作成して公開するには、 kubectl の expose コマンドを使用します。 type には NodePort を指定します。(Minikube ではまだ LoadBalancer オプションがサポートされていません)
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
作成された Service を確認してみます。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m
kubernetes-bootcamp NodePort 10.108.91.62 <none> 8080:31092/TCP 31s
kubernetes-bootcamp という名前の Service が作成されていて、 CLUSTER-IP や EXTERNAL-IP、 PORT が確認できます。
どのポートが外部に公開されているか確認するには、 describe service コマンドを使用します。
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations: <none>
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.108.91.62
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31092/TCP
Endpoints: 172.18.0.2:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
API エンドポイントにアクセスして動作を確認するためにポート番号を取得して環境変数に格納します。
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=31092
curl で外部にアプリケーションが公開されているかを確認してみます。
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-dg96d | v=1
Deployment 作成時には Pod に対して自動的に Label が作成されます。 describe deployment コマンドで Label を確認することができます。
$ kubectl describe deployment
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Sat, 29 Dec 2018 11:21:24 +0000
Labels: run=kubernetes-bootcamp
Annotations: deployment.kubernetes.io/revision=1
Selector: run=kubernetes-bootcamp
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Port: 8080/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: kubernetes-bootcamp-5c69669756 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 9m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 1
Pod のリストを取得するコマンドに Label を使用してみます。 kubectl get pods
コマンドに -l オプションで Label を指定します。
$ kubectl get pods -l run=kubernetes-bootcamp
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-dg96d 1/1 Running 0 11m
Service についても同様に実行可能です。
$ kubectl get services -l run=kubernetes-bootcamp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp NodePort 10.108.91.62 <none> 8080:31092/TCP 9m
Pod 名を使用するために環境変数に格納します。
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-5c69669756-dg96d
新しい Label を適用するには label コマンドをオブジェクトタイプ、オブジェクト名、新しい Label と共に使用します。
$ kubectl label pod $POD_NAME app=v1
pod/kubernetes-bootcamp-5c69669756-dg96d labeled
適用された Label を確認してみます。
$ kubectl describe pods $POD_NAME
Name: kubernetes-bootcamp-5c69669756-dg96d
Namespace: default
Node: minikube/172.17.0.54
Start Time: Sat, 29 Dec 2018 11:21:31 +0000
Labels: app=v1
pod-template-hash=1725225312
run=kubernetes-bootcamp
〜〜〜以下略〜〜〜
新しい Label で Pod のリストを取得することも可能です。
$ kubectl get pods -l app=v1
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-dg96d 1/1 Running 0 16m
Service を削除するには delete service コマンドを使用します。ここでも Label を使用することができます。
$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
Service が削除されたことを確認します。
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18m
外部へ公開されなくなったことを確認します。
$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.54 port 31092: Connection refused
Pod の中ではアプリケーションが稼働していることを確認します。
$ kubectl exec -ti $POD_NAME curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-dg96d | v=1
Scaling an application(Module 5)
Scaling は Deployment 内のレプリカ数を変更することで達成されます。
Service は統合されたロードバランサーを持っていて、ネットワークトラフィックを全ての Pod に配分します。また、Service はエンドポイントを使用して継続的に監視を続け、使用可能な Pod にのみトラフィックが送られるようにします。
複数のインスタンスでアプリケーションを稼働させていれば、ダウンタイムなしでのローリングアップデートが可能です。
まずは現在の Deployment の状態を確認してみます。
$ kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 12s
各 state の内容は下記の通りです。
Deployment のレプリカ数を 4 に設定してみます。 kubectl scale コマンドで Deployment Type、Deployment Name、レプリカ数を指定します。
$ kubectl scale deployments/kubernetes-bootcamp --replicas=4
deployment.extensions/kubernetes-bootcamp scaled
Deployment の状態を確認します。
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 4 3m
変更が適用されて、4インスタンスが有効になっていることがわかります。 Pod も確認してみます。
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-nkddq 1/1 Running 0 3m 172.18.0.2 minikube
kubernetes-bootcamp-5c69669756-sddhp 1/1 Running 0 1m 172.18.0.7 minikube
kubernetes-bootcamp-5c69669756-xvv29 1/1 Running 0 1m 172.18.0.6 minikube
kubernetes-bootcamp-5c69669756-zsvnd 1/1 Running 0 1m 172.18.0.5 minikube
4つの Pod が異なる IP アドレスで稼働していることがわかります。この変更は Deployment のイベントログに記録されます。 describe コマンドで確認してみます。
$ kubectl describe deployments/kubernetes-bootcamp
〜〜〜中略〜〜〜
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 5m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 1
Normal ScalingReplicaSet 2m deployment-controller Scaled up replica set kubernetes-bootcamp-5c69669756 to 4
Service がトラフィックを分散させていることを確認します。公開されている IP と Port を確認するには describe service コマンドを使用します。
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations: <none>
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.101.88.200
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30677/TCP
Endpoints: 172.18.0.2:8080,172.18.0.5:8080,172.18.0.6:8080 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
ポート番号を環境変数に格納します。
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=30677
curl で複数回エンドポイントにアクセスしてみます。
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-xvv29 | v=1
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-nkddq | v=1
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-sddhp | v=1
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-5c69669756-xvv29 | v=1
アクセスする度に違う Pod にアクセスしているので、ロードバランシングが機能している事がわかります。
レプリカ数を 2 にダウンするには再度 scale コマンドを使用します。
$ kubectl scale deployments/kubernetes-bootcamp --replicas=2
deployment.extensions/kubernetes-bootcamp scaled
Deployment の設定が変更されたことを確認します。
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 2 2 2 2 10m
Pod の状態も確認しておきます。
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-nkddq 1/1 Running 0 11m 172.18.0.2 minikube
kubernetes-bootcamp-5c69669756-xvv29 1/1 Running 0 8m 172.18.0.6 minikube
Updating an application(Module 6)
ローリングアップデートではインクリメンタルに Pod のインスタンスを新しいものにアップデートしていくことでダウンタイムゼロでのデプロイを可能にします。
Kubernetes ではアップデートはバージョン管理され、後で以前のバージョンに切り戻す事が可能です。
アップデート中は Service によって有効な Pod にのみロードバランスされます。
まずは Deployment と Pod の状態を確認しておきます。
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 4 4 0 8s
$
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5c69669756-2tl2v 1/1 Running 0 17s
kubernetes-bootcamp-5c69669756-4khpv 1/1 Running 0 17s
kubernetes-bootcamp-5c69669756-d5t5l 1/1 Running 0 17s
kubernetes-bootcamp-5c69669756-vmm2h 1/1 Running 0 17s
現在のアプリケーションのバージョンを確認するには describe pods コマンドを使用し、 Image フィールドを確認します。
$ kubectl describe pods
Name: kubernetes-bootcamp-5c69669756-2tl2v
Namespace: default
Node: minikube/172.17.0.27
Start Time: Sat, 29 Dec 2018 12:10:42 +0000
Labels: pod-template-hash=1725225312
run=kubernetes-bootcamp
Annotations: <none>
Status: Running
IP: 172.18.0.2
Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
kubernetes-bootcamp:
Container ID: docker://2c2beb5e1f0cc006400c48838e0cb42d41d0a8b86c69e0688de54ac5e6589f2d
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
〜〜〜中略〜〜〜
Name: kubernetes-bootcamp-5c69669756-4khpv
Namespace: default
Node: minikube/172.17.0.27
Start Time: Sat, 29 Dec 2018 12:10:42 +0000
Labels: pod-template-hash=1725225312
run=kubernetes-bootcamp
Annotations: <none>
Status: Running
IP: 172.18.0.5
Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
kubernetes-bootcamp:
Container ID: docker://5bee3f08bfda17166d4692cf58ab626c8e1f9260fa28ab09537427615a84d053
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
〜〜〜中略〜〜〜
Name: kubernetes-bootcamp-5c69669756-d5t5l
Namespace: default
Node: minikube/172.17.0.27
Start Time: Sat, 29 Dec 2018 12:10:42 +0000
Labels: pod-template-hash=1725225312
run=kubernetes-bootcamp
Annotations: <none>
Status: Running
IP: 172.18.0.3
Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
kubernetes-bootcamp:
Container ID: docker://3251469b06d51131b426bfb5a50fd67b0e2c66b6d0a4dc54a56aa6f5e307dc63
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
〜〜〜中略〜〜〜
Name: kubernetes-bootcamp-5c69669756-vmm2h
Namespace: default
Node: minikube/172.17.0.27
Start Time: Sat, 29 Dec 2018 12:10:42 +0000
Labels: pod-template-hash=1725225312
run=kubernetes-bootcamp
Annotations: <none>
Status: Running
IP: 172.18.0.4
Controlled By: ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
kubernetes-bootcamp:
Container ID: docker://5b05a470deddcd0b461430ad441aaa3bcb9e6ffe58062365451fc9404568e24a
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
〜〜〜以下略〜〜〜
現在 v1 になっているアプリケーションのバージョンを v2 にアップデートするには、 set image コマンドを使用して、 Deployment Name と新しいイメージのバージョンを指定します。
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.extensions/kubernetes-bootcamp image updated
このコマンドによって Deployment に新しいイメージを使うことを通知し、ローリングアップデートを開始します。新しい Pod のステータスや古い Pod の停止を確認するには get pods コマンドを使用します。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7799cbcb86-4b57t 1/1 Running 0 46s
kubernetes-bootcamp-7799cbcb86-9dp7j 1/1 Running 0 47s
kubernetes-bootcamp-7799cbcb86-9jvwg 1/1 Running 0 46s
kubernetes-bootcamp-7799cbcb86-t9qxj 1/1 Running 0 47s
アプリケーションの稼働を確認してみます。公開されている IP と Port を確認するには describe service コマンドを使用します。
$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations: <none>
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.103.83.106
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30046/TCP
Endpoints: 172.18.0.10:8080,172.18.0.11:8080,172.18.0.8:8080 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
ポート番号を環境変数に格納しておきます。
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=30046
curl でエンドポイントにアクセスしてみます。
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-9dp7j | v=2
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-4b57t | v=2
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-4b57t | v=2
$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-7799cbcb86-9jvwg | v=2
アクセスごとに違う Pod にアクセスしていて、バージョンも v2 になっている事がわかります。
アップデートのステータスは rollout status コマンドでも確認できます。
$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
describe pods でイメージのバージョンも確認してみます。
$ kubectl describe pods | grep Image
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
それでは次に別のアップデートとして、 v10 というイメージをデプロイしてみます。
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
deployment.extensions/kubernetes-bootcamp image updated
Deployment の状態を確認してみます。
$ kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 4 5 2 3 13m
今度は AVAILABLE が期待した通りになっていません。 Pod のリストを確認してみます。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5f76cd7b94-tgshj 0/1 ImagePullBackOff 0 1m
kubernetes-bootcamp-5f76cd7b94-zvkd6 0/1 ImagePullBackOff 0 1m
kubernetes-bootcamp-7799cbcb86-4b57t 1/1 Running 0 8m
kubernetes-bootcamp-7799cbcb86-9dp7j 1/1 Running 0 8m
kubernetes-bootcamp-7799cbcb86-t9qxj 1/1 Running 0 8m
上の二つの Pod の状態が ImagePullBackOff になっていて、 READY が 0/1 になっています。
さらに調べるために describe コマンドを使用します。
$ kubectl describe pods
Name: kubernetes-bootcamp-5f76cd7b94-tgshj
Namespace: default
Node: minikube/172.17.0.27
Start Time: Sat, 29 Dec 2018 12:23:17 +0000
Labels: pod-template-hash=1932783650
run=kubernetes-bootcamp
Annotations: <none>
Status: Pending
IP: 172.18.0.3
Controlled By: ReplicaSet/kubernetes-bootcamp-5f76cd7b94
Containers:
kubernetes-bootcamp:
Container ID:
Image: gcr.io/google-samples/kubernetes-bootcamp:v10
Image ID:
Port: 8080/TCP
Host Port: 0/TCP
State: Waiting
Reason: ImagePullBackOff
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-qcw86 (ro)
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Volumes:
default-token-qcw86:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-qcw86
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m default-scheduler Successfully assigned kubernetes-bootcamp-5f76cd7b94-tgshj to minikube
Normal SuccessfulMountVolume 2m kubelet, minikube MountVolume.SetUp succeeded for volume "default-token-qcw86"
Normal Pulling 49s (x4 over 2m) kubelet, minikube pulling image "gcr.io/google-samples/kubernetes-bootcamp:v10"
Warning Failed 48s (x4 over 2m) kubelet, minikube Failed to pull image "gcr.io/google-samples/kubernetes-bootcamp:v10": rpc error: code = Unknown desc = unauthorized: authentication required
Warning Failed 48s (x4 over 2m) kubelet, minikube Error: ErrImagePull
Normal BackOff 23s (x6 over 2m) kubelet, minikube Back-off pullingimage "gcr.io/google-samples/kubernetes-bootcamp:v10"
Warning Failed 23s (x6 over 2m) kubelet, minikube Error: ImagePullBackOff
〜〜〜以下略〜〜〜
イベントログを見ると、 v10 というイメージがなくてエラーになっているという事がわかります。以前のバージョンにロールバックしてみたいと思います。ロールバックするには rollout undo コマンドを使用します。
$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.extensions/kubernetes-bootcamp
Pod の状態を確認してみます。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-7799cbcb86-4b57t 1/1 Running 0 12m
kubernetes-bootcamp-7799cbcb86-9dp7j 1/1 Running 0 13m
kubernetes-bootcamp-7799cbcb86-jv7k7 1/1 Running 0 48s
kubernetes-bootcamp-7799cbcb86-t9qxj 1/1 Running 0 13m
4つの Pod が全て Running になっている事が確認できました。 Image も確認してみます。
$ kubectl describe pods | grep Image
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
Image: jocatalin/kubernetes-bootcamp:v2
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:fb1a3ced00cecfc1f83f18ab5cd14199e30adc1b49aa4244f5d65ad3f5feb2a5
全て v2 のイメージが使われています。
まとめ
後編ではスケーリングやローリングアップデートといった内容も試す事ができ、 Kubernetes を使った運用のイメージをつかむ事ができました。まだ用意された仮想環境で想定された手順を踏んでいっただけなので、今後は自分のローカル環境やクラウド環境で動かせるように挑戦してみたいと思います。チュートリアルも Kubernetes Basics 以外にも色々あるので、試してみたいと思います。