Kubernetes ハンズオン演習
ホーム
ホーム
  • 0. ラボの使い方
  • 1. kubectl コマンドを使ってみる
  • 2. マニフェストファイルによる Pod の操作
  • 3. Deployment
  • 4. Service によるアプリケーションの公開
  • 5. デプロイ戦略
  • 6. PersistentVolume と StatefulSet の使用

5. デプロイ戦略

このラボでは Kubernetes での Rolling Update、Blue/Green デプロイメント、カナリアリリースについて学習します。

テキストを参照しながら各問題にチャレンジしてください。
必要があればウェブで調べても構いません。

ステップ 1: 問題 1/16

(※ スクリプトの実行が完了してから開始してください)
frontend という名前の Deployment を作成してシンプルなウェブ アプリケーションをデプロイしました。
また、このアプリケーションへアクセスするための Service frontend-service も作成されています。
以下のリンクからアプリケーションにアクセスして、アプリケーションの現在のバージョンとカラーを確認してください。

  1. Version 1 - Green
  2. Version 1 - Blue
  3. Version 2 - Yellow
  4. Version 2 - Orange
Answer

Version 1 - Blue

ステップ 2: 問題 2/16

Deployment frontend によってデプロイされた Pod の数はいくつですか。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
Hints

kubectl get pods コマンドを使用します`

Answer

4

ステップ 3: 問題 3/16

Deployment frontend で使用されているコンテナイメージはどれですか。

  1. webapp
  2. frontend
  3. qualia906/webapp-color:v2
  4. qualia906/webapp-color:v1
  5. simple-webapp
Hints

kubectl describe deployment コマンドを使用して、使われているイメージを確認します。

Solution

kubectl describe deployment frontend | grep Image コマンドを実行します。

Answer

qualia906/webapp-color:v1

ステップ 4: 問題 4/16

Deployment frontend の現在の StrategyType は何ですか。

  1. Recreate
  2. BlueGreen
  3. RollingUpdate
  4. Canary
Hints

kubectl describe deployment コマンドを使用して StrategyType を確認します。

Solution

kubectl describe deployment frontend | grep -i strategy コマンドを実行します。

Answer

RollingUpdate

ステップ 5: 問題 5/16

現在の設定でアプリケーションをアップデートした場合、何が起こりますか。

  1. アップデートが実行される前に、まずすべての Pod がシャットダウンされる。
  2. 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. 1
  2. 2
  3. 3
  4. 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 を実行します。

完了


チャレンジ完了!

お疲れ様でした!

Prev
4. Service によるアプリケーションの公開
Next
6. PersistentVolume と StatefulSet の使用