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

3. Deployment

このラボでは Deployment の作成や操作、および Namespace (名前空間) について学習します。

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

ステップ 1: 問題 1/20

現在この環境には何個の Pod が存在しますか。(Namespace default について)

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get pods コマンドを使用します。
短縮名を使用して kubectl get po と書くこともできます。

Answer

0

ステップ 2: 問題 2/20

現在この環境には何個の ReplicaSet が存在しますか。(Namespace default について)

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get replicasets コマンドを使用します。
短縮名を使用して kubectl get rs と書くこともできます。

Answer

0

ステップ 3: 問題 3/20

現在この環境には何個の Deployment が存在しますか。(Namespace default について)

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get deployments コマンドを使用します。
短縮名を使用して kubectl get deploy と書くこともできます。

Answer

0

ステップ 4: 問題 4/20

(※ スクリプトの実行が完了してから開始してください) 新たな Deployment を作成しました。
現在この環境には何個の Deployment が存在しますか? (Namespace default について)

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get deployments コマンドを使用します。
短縮名を使用して kubectl get deploy と書くこともできます。

Answer

1

ステップ 5: 問題 5/20

現在この環境には何個の ReplicaSet が存在しますか。(Namespace default について)

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get replicasets コマンドを使用します。
短縮名を使用して kubectl get rs と書くこともできます。

Answer

1

ステップ 6: 問題 6/20

作成された Deployment frontend-dep のレプリカ数はいくつですか。

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

kubectl get deployments あるいは kubectl describe deployment コマンドを使用して確認できます。 また、kubectl get pods コマンドを使用して実際の Pod 数を確認することもできます。

Solution

kubectl describe deployment frontend-dep | grep Replicas を実行します。

Answer

4

ステップ 7: 問題 7/20

Deployment frontend-dep の Pod のうち READY 状態にある Pod は何個ですか。 (Pod の状態がまだ ContainerCreating の場合は、その状態から変わるまで待って回答してください)

  1. 0
  2. 2
  3. 3
  4. 4
Hints

kubectl get deployments コマンドを実行して、READY 列を確認します。

Answer

0

ステップ 8: 問題 8/20

Deployment frontend-dep の Pod では何のイメージが使用されていますか。

  1. nginx
  2. frontend
  3. busybox
  4. busybox999
Hints

kubectl describe コマンドを使用して Deployment あるいは Pod のイメージを確認します。

Solution

kubectl describe deployment frontend-dep | grep Image を実行します。
または、kubectl describe pod <POD_NAME> を実行して Image フィールドを確認します。

Answer

busybox999

ステップ 9: 問題 9/20

Deployment frontend-dep の Pod が READY 状態にならない原因は何ですか。

  1. Deployment が正常に作成されなかった
  2. Kubernetes クラスタに異常がある
  3. busybox999 というイメージが存在しない
  4. イメージ内のアプリケーションに異常がある
Hints

kubectl describe pod コマンドを実行し、Events フィールドを確認します。

Answer

busybox999 というイメージが存在しない

ステップ 10: 問題 10/20

命令型コマンドを使用して、以下の設定で Deployment を作成してください。

  • Deployment 名:webapp
  • イメージ:qualia906/simple-webapp
  • レプリカ数:3
Hints

kubectl create deployment コマンドを使用します。

Solution

kubectl create deployment webapp --image=qualia906/simple-webapp --replicas=3 を実行します。

ステップ 11: 問題 11/20

/root/manifests/ ディレクトリ以下にマニフェスト ファイル deployment-definition-1.yaml を用意しました。
ただし、この deployment-definition-1.yaml にはいくつかの誤りが含まれています。
誤りを修正した上で、このマニフェスト ファイルを使用して正常に実行される Deployment を作成してください。

  • Deployment 名:deployment-1
  • イメージ:busybox
  • レプリカ数:2
Hints

誤りを含んだマニフェスト ファイルを使用して Deployment を作成しようとする際に表示されるエラーメッセージから、誤りの内容を推測することができます。
マニフェスト ファイルから Deployment などのオブジェクトを作成する場合には kubectl apply -f コマンドを使用します。

Solution

deployment-definition-1.yaml の kind と image を修正し以下のように更新します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-1
spec:
  replicas: 2
  selector:
    matchLabels:
      name: deployment-1
  template:
    metadata:
      labels:
        name: deployment-1
    spec:
      containers:
      - name: busybox-container
        image: busybox
        command:
        - sh
        - "-c"
        - echo Hello Kubernetes! && sleep 3600

更新したら kubectl apply -f /root/manifests/deployment-definition-1.yaml を実行します。

ステップ 12: 問題 12/20

/root/manifests/ 以下に deployment-definition-2.yaml を作成して、以下の設定の Deployment を作成してください。

  • Deployment 名: deployment-2
  • イメージ: httpd:2.4-alpine
  • レプリカ数: 3
Hints

前の問題で使用した deployment-definition-1.yaml をコピーして必要な変更を加えることでマニフェスト ファイルを作成できます。
この場合、Deployment 名と合わせて忘れずに matchLabels と labels も変更します。

または、kubectl create deployment deployment-2 --image httpd:2.4-alpine --replicas 3 --dry-run=client -o yaml > /root/manifests/deployment-definition-2.yaml コマンドを使用してマニフェスト ファイルを作成することもできます。

Solution

deployment-definition-2.yaml を以下の内容で作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-2
spec:
  replicas: 3
  selector:
    matchLabels:
      name: deployment-2
  template:
    metadata:
      labels:
        name: deployment-2
    spec:
      containers:
      - name: httpd-container
        image: httpd:2.4-alpine

kubectl apply -f /root/manifests/deployment-definition-2.yaml を実行します。

ステップ 13: 問題 13/20

この環境にはいくつの Namespace がありますか。

  1. 3
  2. 5
  3. 7
  4. 9
Hints

kubectl get namespaces コマンドを使用します。
短縮名を使用して kubectl get ns と書くこともできます。

Answer

9

kubectl get ns コマンドを使用すると、この環境には 9 つの namespace があることがわかります。

ステップ 14: 問題 14/20

Namespace research には何個の Pod が存在しますか。

  1. 0
  2. 1
  3. 2
  4. 3
Hints

kubectl get pods コマンドで -n フラグを指定します。

Solution

kubectl get pods -n research を実行します。

Answer

2

ステップ 15: 問題 15/20

Namespace finance に以下の設定で Pod を 1 つ作成してください。

  • Pod 名: pod-1
  • イメージ: redis
Hints

kubectl run コマンドで -n フラグを指定します。

Solution

kubectl run pod-1 -n finance --image redis を実行します。

ステップ 16: 問題 16/20

この環境に dev という名前の Namespace を作成してください。

Hints

kubectl create namespace コマンドを使用します。
短縮名を使用して kubectl create ns と書くこともできます。

Solution

kubectl create namespace dev を実行します。

ステップ 17: 問題 17/20

/root/manifests 以下にphp-apache-definition.yaml を用意しました。
このマニフェスト ファイルを使って、Namespace dev に以下の設定で php-apache という名前の Deployment を作成してください。
ただし、このマニフェスト ファイルは不完全なため、必要な要素を追記して使用してください。

  • Deployment 名: php-apache
  • Namespace: dev
  • イメージ: registry.k8s.io/hpa-example
  • replicas: 3
  • cpu request: 100m
  • cpu limit: 300m
Hints

kubectl コマンドで -n フラグを使用して Namespace を指定します。

Solution

kubectl -n dev apply -f /root/manifests/php-apache-definition.yaml を実行します。

ステップ 18: 問題 18/20

いま作成した Deployment php-apache のレプリカ数を 1 に変更してください。
方法は命令型コマンドと宣言型オブジェクト設定のどちらを使用しても構いません。

  • Deployment 名: php-apache
  • Namespace: dev
  • replicas: 1
Hints

命令型コマンドを使用する場合は kubectl -n dev scale コマンドを使用します。
宣言型オブジェクト設定を使用する場合は php-apache-definition.yaml の定義を replicas: 1 に変更し、kubectl -n dev apply コマンドを使用します。

Solution

kubectl -n dev scale deployment php-apache --replicas 1 を実行します。

ステップ 19: 問題 19/20

命令型コマンドを使用して、Deployment php-apache のオートスケーリングを以下の設定で有効にしてください。

  • Deployment 名: php-apache
  • Namespace: dev
  • max: 5
  • min: 1
  • cpu-percent: 50
Hints

kubectl autoscale コマンドを使用します。
-n オプションを使用して、忘れずに Namespace を指定します。

Solution

kubectl -n dev autoscale deployment php-apache --max 5 --min 1 --cpu-percent 50 を実行します。

ステップ 20: 問題 20/20

設定したオートスケーリングの動作を確認します。

新しく Pod load-generator を実行して php-apache に負荷をかけます。
右のターミナル画面でタブを追加し、新しいタブで以下のコマンドを実行してください。

kubectl -n dev run -it load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

元のタブに戻り、以下を実行して HorizontalPodAutoscaler php-apache の TARGETS 値の変化を確認します。(Ctrl+C で終了できます)

watch -n 1 kubectl -n dev get hpa

本来であれば、HorizontalPodAutoscaler (hpa) が CPU 使用率などのメトリクスを取得するための Metrics Server の設定を別途行う必要がありますが、この環境では予め設定を済ませてあります。
Google Kubernetes Engine (GKE) にように、クラウドのマネージドサービスによっては Metrics Server が自動で設定されます。 Metrics Server の詳細は以下のドキュメントを参照してください。
https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/

以下のコマンドを実行して、Deployment php-apache の Pod 数がスケールアウトしたことを確認します。

watch -n 1 kubectl -n dev get pods

load-generator を実行しているタブに移動し、Ctrl+C で load-generator の実行を終了します。

元のタブに戻り、再度以下のコマンドを実行して Deployment php-apache がスケールインするのを確認します。

watch -n 1 kubectl -n dev get hpa
watch -n 1 kubectl -n dev get pods

スケールアウトに対してスケールインが実行されるまでにはしばらく時間がかかります。
これは stabilizationWindowSeconds (安定化ウィンドウ) の設定によるもので、この stabilizationWindowSeconds に適切な秒数を設定しておくことで、負荷の一時的な低下に対して安易にレプリカ数を削減してしまわないように動作させることができます。デフォルト値は 300 秒です。
詳細は以下のドキュメントを参照してください。
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#stabilization-window

完了


チャレンジ完了!

お疲れ様でした!

Prev
2. マニフェストファイルによる Pod の操作
Next
4. Service によるアプリケーションの公開