こんにちは、サイオステクノロジー技術部 武井です。KubernetesでDeploymentのRollbackを試してみました。
Kubernetesには、いつでも旧バージョンのデプロイに戻せるようにDeploymentのRollback機能があります。試したのはAzure Kubernetes Serviceですが、他のクラウドサービス上のKubernetesでも同じだと思います。
以下のようにhogeと表示する単純なPHPをVer1.0とします。
<?php echo "hoge"; ?>
こちらの記事の方法に従って、Azure Container Registryにpushして、以下のkubectlコマンドでデプロイします。–recordオプションをtrueにしたのは、変更履歴に残したいためです。
# kubectl apply --filename=deployment.yml --record=true
以下のコマンドで変更履歴を確認してみます。先程デプロイした履歴がREVISION 1として記録されています。
$ kubectl rollout history deployment deployment-example deployment.extensions/deployment-example REVISION CHANGE-CAUSE 1 kubectl apply --filename=deployment.yml --record=true
portfowardでコンテナの動作を確認してみます。
$ kubectl get pods NAME READY STATUS RESTARTS AGE deployment-example-66fcc4b9f7-5f8sh 1/1 Running 0 40m deployment-example-66fcc4b9f7-j4pdc 1/1 Running 0 40m deployment-example-66fcc4b9f7-jtp9z 1/1 Running 0 40m $ kubectl port-forward deployment-example-66fcc4b9f7-5f8sh 8080:80 $ curl https://localhost:8088/test.php hoge
hogeと表示されました。期待どおりです。
次に先程のPHPを以下のように変更してみます。
<?php echo "fuga"; ?>
同じようにこちらの記事の方法に従って、Azure Container Registryにpushして、以下のkubectlコマンドでデプロイします。
# kubectl apply --filename=deployment.yml --record=true
同じように以下のコマンドで変更履歴を確認してみます。先程デプロイした履歴がREVISION 2として記録されています。
$ kubectl rollout history deployment deployment-example deployment.extensions/deployment-example REVISION CHANGE-CAUSE 1 kubectl apply --filename=deployment.yml --record=true 2 kubectl apply --filename=deployment.yml --record=true
portfowardでコンテナの動作を確認してみます。
$ kubectl get pods NAME READY STATUS RESTARTS AGE deployment-example-5f796c7988-5klnz 1/1 Running 0 19s deployment-example-5f796c7988-dgsnh 1/1 Running 0 22s deployment-example-5f796c7988-v64g2 1/1 Running 0 16s $ kubectl port-forward deployment-example-5f796c7988-5klnz 8080:80 $ curl https://localhost:8088/test.php fuga
fugaと表示されました。期待どおりです。
では、前のバージョンにRollbackしてみます。kubectl rollout undo deploymentコマンドで以下のように行います。Revisionを1に戻したいので、–to-revisionで1を指定します。
$ kubectl rollout undo deployment deployment-example --to-revision=1
portfowardでコンテナの動作を確認してみます。
$ kubectl get pods NAME READY STATUS RESTARTS AGE deployment-example-66fcc4b9f7-ct4g6 1/1 Running 0 3m41s deployment-example-66fcc4b9f7-nm97m 1/1 Running 0 3m38s deployment-example-66fcc4b9f7-qmjp6 1/1 Running 0 3m44s $ kubectl port-forward deployment-example-66fcc4b9f7-ct4g6 8080:80 $ curl https://localhost:8088/test.php hoge
hogeと表示されました。一つ前のRevisionに戻せました。
Kubernetesではこんなに簡単に前のバージョンに戻せるので、とっても便利ですね。万が一のステップバックも簡単です。