公式チュートリアルで Kubenetes 入門(後編)

 前回の記事で 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 の内容は下記の通りです。

  • 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 以外にも色々あるので、試してみたいと思います。