はじめに
マニフェストに記載したレプリカ数を維持してサービスを継続提供しながら、機能修正をリリースするポッドコントロールとして、ロールアウトと呼ばれるものがあります。
今回は、nginxのバージョン1.7.9をnginxの提供は維持したまま1.7.8に落とす流れを実践します。
環境情報
- Kubernetes v1.17
事前準備
以下の記事でサンプルとして利用したnginx-deployment.yamlのレプリカ数を10に変更したものを
minikube上で起動すると
$ kubectl.exe apply -f nginx-deployment.yaml deployment.apps/nginx-deployment created
10秒後には以下のようにポッドが作成中となり
$ kubectl.exe get pods NAME READY STATUS RESTARTS AGE nginx-deployment-54f57cf6bf-h8bss 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-lv9bc 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-mb6m4 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-n2hpj 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-rw28f 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-tnkl6 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-v4mv7 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-vbqlr 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-vvntn 0/1 ContainerCreating 0 10s nginx-deployment-54f57cf6bf-xxh2n 0/1 ContainerCreating 0 10s
数分後には完全に起動状態となります。
同デプロイメントに対してサービス機能を立ち上げ
$ kubectl expose deployment nginx-deployment --type=NodePort service/nginx-deployment exposed
サービス状態を確認した後
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 90m nginx-deployment NodePort 10.96.148.62 <none> 80:30094/TCP 12s $ minikube service nginx-deployment --url http://192.168.99.100:30094
例えば以下のように待ち受けていないURLに対してブラウザでアクセスすると
http://192.168.99.100:30094/hoge
エラー画面と共にバージョンが確認できます。
ロールアウト機能を利用する
バージョン情報のみを修正したyamlファイルを作成して
$ cat nginx-deployment.yaml | sed -e "s/1.7.9/1.7.8/g" > nginx-deployment2.yaml $ diff nginx-deployment.yaml nginx-deployment2.yaml 19c19 < image: nginx:1.7.9 --- >
そのファイルでデプロイメントを起動すると
$ kubectl apply -f nginx-deployment2.yaml deployment.apps/nginx-deployment configured
既に起動済だったポッドが一部停止に回って別バージョンのポッドが起動し始めます。
$ kubectl.exe get pods NAME READY STATUS RESTARTS AGE nginx-deployment-54f57cf6bf-h8bss 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-lv9bc 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-mb6m4 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-n2hpj 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-rw28f 0/1 Terminating 0 6m48s nginx-deployment-54f57cf6bf-tnkl6 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-v4mv7 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-vbqlr 0/1 Terminating 0 6m48s nginx-deployment-54f57cf6bf-vvntn 1/1 Running 0 6m48s nginx-deployment-54f57cf6bf-xxh2n 1/1 Running 0 6m48s nginx-deployment-64f4c47bf8-hdlh9 0/1 ContainerCreating 0 7s nginx-deployment-64f4c47bf8-jn7jk 0/1 ContainerCreating 0 7s nginx-deployment-64f4c47bf8-pm4t6 0/1 ContainerCreating 0 7s nginx-deployment-64f4c47bf8-sjg8z 0/1 ContainerCreating 0 7s nginx-deployment-64f4c47bf8-zq8qf 0/1 ContainerCreating 0 7s
要はmaxSurgeとmaxUnavailableに従いならがバージョンが置き換わります。
時間を経過して同URLにアクセスすると表示されるバージョン情報は全て変わっています。
終わりに
サービス提供をしながら機能追加をリリースできるコンテナオーケストレーションならではの仕組みなので、実際に利用しながら挙動を確認してみることをおススメします。
以上、ご参考になれば幸いです。