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)