こんにちは。KOUKIです。k8s学習中のWebエンジニアです。
KubernetesでMicroservicesのデプロイ方法を学びましょう。
本記事では、Deploymentについて解説します。
尚、今回もMinikubeを使いますので、以下の記事でインストール&起動してください。
※ MacおよびChromeで検証します。
<目次>
参考
Udemyの「Kubernetes Hands-On – Deploy Microservices to the AWS Cloud」コースを参考にしています。
解釈は私が勝手に付けているので、本物をみたい場合は受講してみてください。
API OVERVIEWも参考になります。
前回
現在の状況は、以下のようになってます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ kubectl get all NAME READY STATUS RESTARTS AGE pod/queue 1/1 Running 1 25h pod/webapp-849j4 1/1 Running 0 17m pod/webapp-ftszm 1/1 Running 0 26m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fleetman-queues NodePort 10.107.33.216 <none> 8161:30010/TCP 25h service/fleetman-webapp NodePort 10.111.31.12 <none> 80:30080/TCP 25h service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d NAME DESIRED CURRENT READY AGE replicaset.apps/webapp 2 2 2 46m |
Deploymentについて
Deploymentは、Podのローリングアップデートやロールバックといったデプロイ管理の仕組みを提供します。
前回、ReplicaSetを実装しましたが、それをDeploymentで管理する方法が一般的なようです。
ReplicaSetの削除
前回構築したReplicaSetを削除します。
1 2 3 4 5 6 7 8 9 10 11 |
# Replicasetを削除 kubectl delete replicaset.apps/webapp $ kubectl get all NAME READY STATUS RESTARTS AGE pod/queue 1/1 Running 2 47h NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fleetman-queues NodePort 10.107.33.216 <none> 8161:30010/TCP 47h service/fleetman-webapp NodePort 10.111.31.12 <none> 80:30080/TCP 47h service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h |
Deploymentの作成
公式を参考に、Deploymentを作成しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# pods.yml apiVersion: apps/v1 kind: Deployment # Deploymentを指定 metadata: name: webapp spec: selector: matchLabels: app: webapp replicas: 2 template: metadata: name: webapp labels: app: webapp spec: containers: - name: webapp image: richardchesterwood/k8s-fleetman-webapp-angular:release0 # イメージを0に変更 --- apiVersion: v1 kind: Pod metadata: name: queue labels: app: queue release: "0" spec: containers: - name: queue image: richardchesterwood/k8s-fleetman-queue:release1 |
queue Podは以前作成した設定なので、無視してください。
変更した点は、「kind: Deployment」とベースのイメージの「release:0-5」-> 「release:0」です。
下記のコマンドで、Deploymentを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Deploymentを作成 $ kubectl apply -f pods.yml # 確認 $ kubectl get all NAME READY STATUS RESTARTS AGE pod/queue 1/1 Running 2 47h pod/webapp-b548ff9c5-qc7nk 1/1 Running 0 16s pod/webapp-b548ff9c5-s97dv 1/1 Running 0 16s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fleetman-queues NodePort 10.107.33.216 <none> 8161:30010/TCP 47h service/fleetman-webapp NodePort 10.111.31.12 <none> 80:30080/TCP 47h service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/webapp 2/2 2 2 16s NAME DESIRED CURRENT READY AGE replicaset.apps/webapp-b548ff9c5 2 2 2 16s |
問題なくDeploymentが作成されていますね。
アプリケーションを起動しましょう。
1 2 3 4 5 6 7 |
$ minikube service fleetman-webapp |-----------|-----------------|-------------|-----------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|-----------------|-------------|-----------------------------| | default | fleetman-webapp | http/80 | http://192.168.99.102:30080 | |-----------|-----------------|-------------|-----------------------------| 🎉 Opening service default/fleetman-webapp in default browser... |

問題なさそうですね。
ローリングアップデート
Deploymentは、ローリングアップデートの仕組みを提供しています。
現在、「release:0」のアプリケーションを稼働させていますが、「release:0-5」のアプリケーションを稼働させたい場合、アプリケーションの瞬断なしに更新できるというめちゃくちゃ便利な機能です。
DeploymentがReplicasetを制御できるからこの仕組みが使えるのだと思います。
pods.ymlmファイルのイメージを更新します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# pods.yml apiVersion: apps/v1 kind: Deployment metadata: name: webapp spec: minReadySeconds: 15 # 新しいPodが利用できるようになるまでの時間(s) selector: matchLabels: app: webapp replicas: 2 template: metadata: name: webapp labels: app: webapp spec: containers: - name: webapp image: richardchesterwood/k8s-fleetman-webapp-angular:release0-5 # イメージを0-5に変更 --- |
必要なことはこれだけです。
「minReadySeconds」は必須ではありません。デフォルトは0sです。
今回デモとして瞬断なしで新しいアプリケーションに切り替わるか確認したいため、指定しています。
Podを更新し、ブラウザを更新し続けましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 更新 kubectl apply -f pods.yml $ kubectl get all NAME READY STATUS RESTARTS AGE pod/queue 1/1 Running 3 2d pod/webapp-5b7867fdd5-bxxzx 1/1 Running 0 6m40s pod/webapp-5b7867fdd5-nr42p 1/1 Running 0 7m13s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fleetman-queues NodePort 10.107.33.216 <none> 8161:30010/TCP 2d service/fleetman-webapp NodePort 10.111.31.12 <none> 80:30080/TCP 2d service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/webapp 2/2 2 2 50m NAME DESIRED CURRENT READY AGE replicaset.apps/webapp-5b7867fdd5 2 2 2 32m replicaset.apps/webapp-b548ff9c5 0 0 0 50m |
結構時間がかかりますが、最後の方でアプリケーションが更新されたことがわかります。
ロールバック
kubectlのrolloutコマンドで、ロールバックが簡単に実現できます。
アプリケーションのバージョンを「release:0」に戻します。
1 2 3 4 |
spec: containers: - name: webapp image: richardchesterwood/k8s-fleetman-webapp-angular:release0 # イメージを0に変更 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# ステータスを確認 $ kubectl rollout status deployment webapp deployment "webapp" successfully rolled out # 更新 $ kubectl apply -f pods.yml # ステータス確認(少し止まる) $ kubectl rollout status deployment webapp Waiting for deployment "webapp" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "webapp" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "webapp" rollout to finish: 1 out of 2 new replicas have been updated... Waiting for deployment "webapp" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "webapp" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "webapp" rollout to finish: 1 old replicas are pending termination... deployment "webapp" successfully rolled out |
アプリケーションを表示します。

「release:0」に戻ってますね。
では、rolloutコマンドを使ってロールバックの確認をしましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# hisotryを確認 $ kubectl rollout history deployment webapp deployment.apps/webapp REVISION CHANGE-CAUSE 4 <none> 5 <none> # ロールバック $ kubectl rollout undo deploy webapp deployment.apps/webapp rolled back $ kubectl rollout history deployment webapp deployment.apps/webapp REVISION CHANGE-CAUSE 5 <none> 6 <none> |
30s経過したら「release:0-5」のアプリケーションに切り替わることが確認できます。

便利すぎますね。
次回
次回は、Networkingについて学びましょう。
コメントを残す
コメントを投稿するにはログインしてください。