5. デプロイ戦略
このラボでは Kubernetes での Rolling Update、Blue/Green デプロイメント、カナリアリリースについて学習します。
テキストを参照しながら各問題にチャレンジしてください。
必要があればウェブで調べても構いません。
ステップ 1: 問題 1/16
(※ スクリプトの実行が完了してから開始してください)frontend という名前の Deployment を作成してシンプルなウェブ アプリケーションをデプロイしました。
また、このアプリケーションへアクセスするための Service frontend-service も作成されています。
以下のリンクからアプリケーションにアクセスして、アプリケーションの現在のバージョンとカラーを確認してください。
- Version 1 - Green
- Version 1 - Blue
- Version 2 - Yellow
- Version 2 - Orange
Answer
Version 1 - Blue
ステップ 2: 問題 2/16
Deployment frontend によってデプロイされた Pod の数はいくつですか。
- 1
- 2
- 3
- 4
- 5
Hints
kubectl get pods コマンドを使用します`
Answer
4
ステップ 3: 問題 3/16
Deployment frontend で使用されているコンテナイメージはどれですか。
- webapp
- frontend
- qualia906/webapp-color:v2
- qualia906/webapp-color:v1
- simple-webapp
Hints
kubectl describe deployment コマンドを使用して、使われているイメージを確認します。
Solution
kubectl describe deployment frontend | grep Image コマンドを実行します。
Answer
qualia906/webapp-color:v1
ステップ 4: 問題 4/16
Deployment frontend の現在の StrategyType は何ですか。
- Recreate
- BlueGreen
- RollingUpdate
- Canary
Hints
kubectl describe deployment コマンドを使用して StrategyType を確認します。
Solution
kubectl describe deployment frontend | grep -i strategy コマンドを実行します。
Answer
RollingUpdate
ステップ 5: 問題 5/16
現在の設定でアプリケーションをアップデートした場合、何が起こりますか。
- アップデートが実行される前に、まずすべての Pod がシャットダウンされる。
- Pod が一度に数個ずつアップデートされる。
Answer
Pod が一度に数個ずつアップデートされる。
ステップ 6: 問題 6/16
Deployment frontend のコンテナイメージを qualia906/webapp-color:v2 にアップデートしてください。
この Deployment は /root/manifests/frontend-deployment.yaml を使って定義されています。 Deployment を削除して再作成はせずに、現在の Deploeyment のコンテナイメージだけを更新してください。
また、Labels は変更しないでください。
- イメージ:
qualia906/webapp-color:v2
Hints
/root/manifests/frontend-deployment.yaml を編集してイメージの設定を更新します。
Solution
/root/manifests/frontend-deployment.yaml を編集して image フィールドを qualia906/webapp-color:v2 に更新します。kubectl apply -f /root/manifests/frontend-deployment.yaml を実行します。
ステップ 7: 問題 7/16
再びアプリケーションにアクセスして、アプリケーションが Version 2 にアップデートされたことを確認してください。
まだ、Rolling Update が実行中の場合、Version 1 が表示されることがありますが、ブラウザを何度かリロードすると Version 2 が表示されるようになります。
ステップ 8: 問題 8/16
Deployment frontend では、Rolling Update の際、一度に何個までの Pod が削除されますか。
- 1
- 2
- 3
- 4
Hints
kubectl describe deployment frontend を実行し、maxUnavailable フィールドを確認します。
https://kubernetes.io/ja/docs/concepts/workloads/controllers/deployment/#deployment%E3%81%AE%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88
Solution
kubectl describe deployment frontend を実行すると、maxUnavailable フィールドが 25% であることがわかります。これは、Rolling Update の際、一度にレプリカ数 4 個のうちの 25% まで、すなわち 1 個の Pod が削除されることを意味します。
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
Answer
1
ステップ 9: 問題 9/16
Deployment frontend のアプリケーションのバージョンを Version 1 にロールバックしてください。 以下のリンクからアプリケーションにアクセスして、ロールバックされたことを確認してください。
Hints
kubectl rollout undo コマンドを使用します。
または /root/manifests/frontend-deployment.yaml を編集して image フィールドを元の値に戻すこともできます。
Solution
kubectl rollout undo deployment frontend を実行します。
ステップ 10: 問題 10/16
Blue/Green デプロイメントでアプリケーションを Version 2 にアップデートします。
以下の設定で新しい Deployment を作成してください。
- Deployment 名:
frontend-green - イメージ:
qualia906/webapp-color:v2 - レプリカ数:
4 - Pod のラベル:
name=webapp,version=v2(matchLabelsにも注意してください) - containerPort:
8080 - protocol:
TCP
Hints
/root/manifests/frontend-definition.yaml をコピーして使用して構いません。
Solution
/root/manifests/frontend-definition.yaml をコピーして、例えば、/root/manifests/frontend-green.yaml という名前で以下の内容のマニフェスト ファイルを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-green
namespace: default
spec:
replicas: 4
revisionHistoryLimit: 10
selector:
matchLabels:
name: webapp
version: v2
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
name: webapp
version: v2
spec:
containers:
- image: qualia906/webapp-color:v2
imagePullPolicy: IfNotPresent
name: simple-webapp
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl apply -f frontend-green.yaml を実行して Deployment を作成します。
ステップ 11: 問題 11/16
Version 1 のアプリケーションにアクセスするための Serive frontend-service は /root/manifests/frontend-service.yaml で定義されています。
いま作成した frontend-green の Version 2 のアプリケーションにアクセス先が切り替わるように frontend-service を更新してください。
アクセス先が正しく切り替わったかどうかは、以下のリンクからアプリケーションにアクセスして確認できます。
Hints
/root/manifests/frontend-service.yaml を編集して selector フィールドを更新します。
Solution
/root/manifests/frontend-service.yaml を以下のように更新します。
apiVersion: v1
kind: Service
metadata:
name: frontend-service
namespace: default
spec:
ports:
- nodePort: 30080
port: 8080
protocol: TCP
targetPort: 8080
selector:
name: webapp
version: v2
type: NodePort
kubectl apply -f /root/manifests/frontend-service.yaml を実行します。
ステップ 12: 問題 12/16
Deployment frontend を削除してください。
(この作業によって Version 1 のアプリケーションが削除されます)
Hints
kubectl delete deployment コマンドを使用します。
Solution
kubectl delete deployment frontend を実行します。
ステップ 13: 問題 13/16
続いて、カナリアリリースで新しいバージョン (Version 3) のアプリケーションをデプロイします。
以下の設定で新しい Deployment を作成してください。
- Deployment 名:
frontend-canary - イメージ:
qualia906/webapp-color:v3 - レプリカ数:
1 - Pod のラベル:
name=webapp,version=v3(matchLabelsにも注意してください) - containerPort:
8080 - protocol:
TCP
Hints
/root/manifests/frontend-definition.yaml をコピーして使用して構いません。
Solution
/root/manifests/frontend-definition.yaml をコピーして、例えば、/root/manifests/frontend-canary.yaml という名前で以下の内容のマニフェスト ファイルを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-canary
namespace: default
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
name: webapp
version: v3
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
name: webapp
version: v3
spec:
containers:
- image: kodekloud/webapp-color:v3
imagePullPolicy: IfNotPresent
name: simple-webapp
ports:
- containerPort: 8080
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
kubectl apply -f frontend-green.yaml を実行して Deployment を作成します。
ステップ 14: 問題 14/16
Version 2 と Version 3 のアプリケーションにアクセスできるように Service frontend-service を更新してください。
アクセス先が正しく切り替わったかどうかは、以下のリンクからアプリケーションにアクセスして確認できます。
ブラウザを何度かリロードして 2 つのバージョンにアクセスできることを確認してください。
Hints
/root/manifests/frontend-service.yaml を編集して selector フィールドを更新します。
Solution
/root/manifests/frontend-service.yaml を以下のように更新し、2 つのバージョンに共通するラベルである name: webapp だけを selector フィールドに設定します。
apiVersion: v1
kind: Service
metadata:
name: frontend-service
namespace: default
spec:
ports:
- nodePort: 30080
port: 8080
protocol: TCP
targetPort: 8080
selector:
name: webapp
type: NodePort
kubectl apply -f /root/manifests/frontend-service.yaml を実行します。
ステップ 15: 問題 15/16
Deployment frontend-canary のレプリカ数を 4 にスケールアウトしてください。
- Deployment 名:
frontend-canary - レプリカ数:
4
Hints
マニフェスト ファイルの replicas フィールドを変更します。
または kubectl scale deployment コマンドを実行します。
Solution
kubectl scale deployment frontend-canary --replicas=4 を実行します。
ステップ 16: 問題 16/16
Deployment frontend-green を削除してください。
以下のリンクから、Version 3 のアプリケーションにだけアクセスできるようになったことを確認してください。
Solution
kubectl delete deployment frontend-green を実行します。
完了
チャレンジ完了!
お疲れ様でした!