前回の記事で Kubernetes の公式チュートリアル Kubernetes Basics の前半3 Modulesを進めてみました。
今回は後半の 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 の内容は下記の通りです。
DESIRED: 設定したレプリカ数
CURRENT:現在稼働しているレプリカ数
UP-TO-DATE:設定にマッチするようにアップデートされたレプリカ数
AVAILABLE:ユーザーに対して有効なレプリカ数
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 以外にも色々あるので、試してみたいと思います。