3. Deployment
このラボでは Deployment の作成や操作、および Namespace (名前空間) について学習します。
テキストを参照しながら各問題にチャレンジしてください。
必要があればウェブで調べても構いません。
ステップ 1: 問題 1/20
現在この環境には何個の Pod が存在しますか。(Namespace default について)
- 0
- 1
- 2
- 3
Hints
kubectl get pods コマンドを使用します。
短縮名を使用して kubectl get po と書くこともできます。
Answer
0
ステップ 2: 問題 2/20
現在この環境には何個の ReplicaSet が存在しますか。(Namespace default について)
- 0
- 1
- 2
- 3
Hints
kubectl get replicasets コマンドを使用します。
短縮名を使用して kubectl get rs と書くこともできます。
Answer
0
ステップ 3: 問題 3/20
現在この環境には何個の Deployment が存在しますか。(Namespace default について)
- 0
- 1
- 2
- 3
Hints
kubectl get deployments コマンドを使用します。
短縮名を使用して kubectl get deploy と書くこともできます。
Answer
0
ステップ 4: 問題 4/20
(※ スクリプトの実行が完了してから開始してください) 新たな Deployment を作成しました。
現在この環境には何個の Deployment が存在しますか? (Namespace default について)
- 0
- 1
- 2
- 3
Hints
kubectl get deployments コマンドを使用します。
短縮名を使用して kubectl get deploy と書くこともできます。
Answer
1
ステップ 5: 問題 5/20
現在この環境には何個の ReplicaSet が存在しますか。(Namespace default について)
- 0
- 1
- 2
- 3
Hints
kubectl get replicasets コマンドを使用します。
短縮名を使用して kubectl get rs と書くこともできます。
Answer
1
ステップ 6: 問題 6/20
作成された Deployment frontend-dep のレプリカ数はいくつですか。
- 1
- 2
- 3
- 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 の場合は、その状態から変わるまで待って回答してください)
- 0
- 2
- 3
- 4
Hints
kubectl get deployments コマンドを実行して、READY 列を確認します。
Answer
0
ステップ 8: 問題 8/20
Deployment frontend-dep の Pod では何のイメージが使用されていますか。
- nginx
- frontend
- busybox
- 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 状態にならない原因は何ですか。
- Deployment が正常に作成されなかった
- Kubernetes クラスタに異常がある
- busybox999 というイメージが存在しない
- イメージ内のアプリケーションに異常がある
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 がありますか。
- 3
- 5
- 7
- 9
Hints
kubectl get namespaces コマンドを使用します。
短縮名を使用して kubectl get ns と書くこともできます。
Answer
9
kubectl get nsコマンドを使用すると、この環境には 9 つの namespace があることがわかります。
ステップ 14: 問題 14/20
Namespace research には何個の Pod が存在しますか。
- 0
- 1
- 2
- 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
完了
チャレンジ完了!
お疲れ様でした!