(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Kubernetes】ロールアウト機能でポッドを入れ替える

スポンサーリンク

はじめに

マニフェストに記載したレプリカ数を維持してサービスを継続提供しながら、機能修正をリリースするポッドコントロールとして、ロールアウトと呼ばれるものがあります。
今回は、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

エラー画面と共にバージョンが確認できます。

f:id:mtiit:20200803161316p:plain
バージョンが確認可能

ロールアウト機能を利用する

バージョン情報のみを修正した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にアクセスすると表示されるバージョン情報は全て変わっています。

f:id:mtiit:20200803161415p:plain
nginxのバージョンが変わっている

終わりに

サービス提供をしながら機能追加をリリースできるコンテナオーケストレーションならではの仕組みなので、実際に利用しながら挙動を確認してみることをおススメします。

以上、ご参考になれば幸いです。