k8sのrollout機能

kubernetes では、rollout という機能で、無停止でのアプリケーション更新を実施できる。(deployment定義時に使用可能)
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

今回は、TF上のdeploymentで上記を行った場合に、アプリケーションが停止するタイミングが発生しないことを確認する。

実施内容としては、以下のサンプルyaml 2つを使って、deployment / service を定義し、
https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/yml/3_contrail-cni-features/3_ingress/nginx-deployment.yaml
https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/yml/3_contrail-cni-features/3_ingress/nginx-svc.yaml

[root@ip-172-31-4-195 ~]# kubectl get pod -o wide
NAME                                READY     STATUS    RESTARTS   AGE       IP              NODE
cirros1                             1/1       Running   0          7m        10.47.255.248   ip-172-31-9-61.ap-northeast-1.compute.internal
nginx-deployment-85f794d94b-cxp4p   1/1       Running   0          4m        10.47.255.250   ip-172-31-9-61.ap-northeast-1.compute.internal
nginx-deployment-85f794d94b-m9zrb   1/1       Running   0          4m        10.47.255.247   ip-172-31-9-61.ap-northeast-1.compute.internal
[root@ip-172-31-4-195 ~]# 

[root@ip-172-31-4-195 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   2h
nginx-svc    ClusterIP   10.99.250.199   <none>        80/TCP    9m
[root@ip-172-31-4-195 ~]# 

以下のコマンドでコンテナのrollout を実施している。

# kubectl edit deployment/nginx-deployment
 (container image のバージョンを変更: 1.7.9 -> 1.9.2)

適用がうまくいった場合、新規のcontainerが作成され、古いバージョンのcontainerが停止される、という動作となる。
※ 更新状況は、以下のように確認が可能

[root@ip-172-31-4-195 3_ingress]# kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for rollout to finish: 1 out of 2 new replicas have been updated...
Waiting for rollout to finish: 1 old replicas are pending termination...
Waiting for rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
[root@ip-172-31-4-195 3_ingress]# 

あわせて、cirros のpod を1台作成し、1秒ごとにserviceのipに対してcurl を発行し、アクセスが途切れないことを確認している。
※ TFでは、container の増減に合わせてbgp経路の更新を行っているのだが、rollout のように新規のコンテナが作られた後、古いコンテナが削除される、という動作についても、特に問題なく追随出来るらしい

/ # while true; do date; curl -I 10.99.250.199 2> /dev/null  | head -n 1 ; sleep 1; done
Thu May  3 10:24:52 UTC 2018
HTTP/1.1 200 OK
Thu May  3 10:24:53 UTC 2018
HTTP/1.1 200 OK
Thu May  3 10:24:54 UTC 2018
HTTP/1.1 200 OK
(snip)