背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。
その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。
引用や参考と今回の自分の勉強用の書籍の紹介
技術評論社『Kubernetes実践入門』のサンプルコード
Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方
実際の学びについて
書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
この章の勉強は本当に書籍の写経が主になるかもしれません・・・
勉強開始
リポジトリ
https://github.com/kubernetes-practical-guide/examples/tree/master/ch6.2.2/manifests/mattermost
負荷に応じてアプリケーションの処理能力を向上させる
スケールアップする
Resource Request
- コンテナに最低限割り当てたいリソース量を指定できる
- 指定しない場合はコンテナに割り当てるリソース量が0でも構わない
- リソース量以上の空き容量があるノードにスケジュールする
- すべてのノードに空き容量がなければスケジュールされず空きができるまで待機する
- メモリについては不足の場合はコンテナを終了されてしまう可能性がある
Resource Limit
- コンテナが利用できる上限のリソース量を指定できる
- 指定しない場合は無制限利用しても良いという意味で動いてしまう
- CPU は指定した値以上は利用できない
- Request で指定した Pod Noリソースのほうが余剰 CPU リソースより優先される
- メモリについては指定した値以上のメモリ量を利用した場合、コンテがが終了されてしまう可能性がある
利用するリソース量を指定する
command:
- sleep
- 5s
+ resources:
+ requests:
+ cpu: 100m # コア数を指定
+ memory: 100Mi # メモリ容量のバイト数を指定
volumes:
- name: cm-volume
configMap:
$ kubectl apply -f mattermost-deploy.yaml
スケールアウトする
Mattermost の Pod をスケールアウトしてみる
# 実行前
$ kubectl get pod -l app=mattermost
NAME READY STATUS RESTARTS AGE
mattermost-67d4ff7dd-xn72k 1/1 Running 4 3h17m
# 実行後
$ kubectl scale deployment mattermost --replicas=3
$ kubectl get pod -l app=mattermost
NAME READY STATUS RESTARTS AGE
mattermost-67d4ff7dd-44czk 1/1 Running 0 5s
mattermost-67d4ff7dd-4k56r 1/1 Running 0 5s
mattermost-67d4ff7dd-xn72k 1/1 Running 4 3h18m
自動的にスケールアウトする
- 手動で行うには
kubectl scale
で実行できるが、自動で行うには Kubernetes には HorizontalPodAutoscaler が用意されている - HorizontalPodAutoscaler は Deployment や ReplicaSet の Pod を自動的にスケールアウトする
$ kubectl run cpu-max --image=k8spracticalguide/busybox:1.28 --requests=cpu=50m --limits=cpu=100m -- dd if=/dev/zero of=/dev/null
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/cpu-max created
$ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
cpu-max-8545d4cb98-7jw86 98m 0Mi
mattermost-67d4ff7dd-44czk 0m 26Mi
mattermost-67d4ff7dd-4k56r 1m 26Mi
mattermost-67d4ff7dd-xn72k 0m 45Mi
mysql-0 1m 219Mi
mysql-1 2m 197Mi
HorizontalPodAutoscaler オブジェクトを設定して cpu-max の Pod をオートスケールしてみる
$ kubectl autoscale deployment cpu-max --cpu-percent=70 --min=1 --max=10
horizontalpodautoscaler.autoscaling/cpu-max autoscaled
$ kubectl get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
cpu-max Deployment/cpu-max 196%/70% 1 10 3 42s
$ kubectl describe hpa cpu-max
Name: cpu-max
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Wed, 06 May 2020 19:40:13 +0900
Reference: Deployment/cpu-max
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 199% (99m) / 70%
Min replicas: 1
Max replicas: 10
Deployment pods: 10 current / 10 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
ScalingLimited True TooManyReplicas the desired replica count is more than the maximum replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 4m11s horizontal-pod-autoscaler New size: 3; reason: cpu resource utilization (percentage of request) above target
Normal SuccessfulRescale 2m25s horizontal-pod-autoscaler New size: 6; reason: cpu resource utilization (percentage of request) above target
Normal SuccessfulRescale 2m10s horizontal-pod-autoscaler New size: 9; reason: cpu resource utilization (percentage of request) above target
Normal SuccessfulRescale 23s horizontal-pod-autoscaler New size: 10; reason: cpu resource utilization (percentage of request) above target
$ kubectl delete deployments.apps cpu-max
deployment.apps "cpu-max" deleted
kubectl get po
NAME READY STATUS RESTARTS AGE
cpu-max-8545d4cb98-52blp 1/1 Terminating 0 3m23s
cpu-max-8545d4cb98-69vjx 1/1 Terminating 0 96s
cpu-max-8545d4cb98-6xh4c 1/1 Terminating 0 3m38s
cpu-max-8545d4cb98-6zvks 1/1 Terminating 0 3m38s
cpu-max-8545d4cb98-7jw86 1/1 Terminating 0 12m
cpu-max-8545d4cb98-84pjj 1/1 Terminating 0 5m24s
cpu-max-8545d4cb98-d8lqh 1/1 Terminating 0 3m23s
cpu-max-8545d4cb98-mvln8 1/1 Terminating 0 3m23s
cpu-max-8545d4cb98-wxwkn 1/1 Terminating 0 3m38s
cpu-max-8545d4cb98-xqzw9 1/1 Terminating 0 5m24s
mattermost-67d4ff7dd-44czk 1/1 Running 0 23m
mattermost-67d4ff7dd-4k56r 1/1 Running 0 23m
mattermost-67d4ff7dd-xn72k 1/1 Running 4 3h42m
mysql-0 1/1 Running 2 3h34m
mysql-1 1/1 Running 2 3h34m
# HorizontalPodAutoscaler オブジェクト削除
$ kubectl delete hpa cpu-max
horizontalpodautoscaler.autoscaling "cpu-max" deleted
# しばらくすると Pod が消えていることを確認
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mattermost-67d4ff7dd-44czk 1/1 Running 0 27m
mattermost-67d4ff7dd-4k56r 1/1 Running 0 27m
mattermost-67d4ff7dd-xn72k 1/1 Running 4 3h46m
mysql-0 1/1 Running 2 3h38m
mysql-1 1/1 Running 2 3h38m
$ cat mattermost-hpa.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: mattermost-hpa
namespace: default
spec:
scaleTargetRef: # スケール対象のオブジェクトを指定
apiVersion: apps/v1
kind: Deployment
name: mattermost
minReplicas: 1 # レプリカの最小数
maxReplicas: 5 # レプリカの最大数
metrics: # オートスケールする問の指標
- type: Resource
resource:
name: memory
targetAverageUtilization: 50
$ kubectl apply -f mattermost-hpa.yaml
horizontalpodautoscaler.autoscaling/mattermost-hpa created
$ kubectl top pod
NAME CPU(cores) MEMORY(bytes)
mattermost-67d4ff7dd-44czk 0m 26Mi
mattermost-67d4ff7dd-4k56r 0m 26Mi
mattermost-67d4ff7dd-xn72k 0m 45Mi
mysql-0 2m 219Mi
mysql-1 1m 197Mi
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
mattermost-hpa Deployment/mattermost <unknown>/50% 1 5 5 10m
Pod が減らなかったのですが・・・増えることは確認ができたのと一旦、10まで増やしたら減ったみたいだったので環境てきなのかな?と思いつつ、オートスケールは体感できました。
TARGETS の <unknown>/50% の unknown は良いのだろうか????
次は 7 章をやっていきます。
**「アプリケーションのセキュリティを強化する」**です。
最後に
今回は、スケールアップ、スケールアウト、そして オートスケール を学びました。
オートスケールの動きを今回確認できたのは目からウロコでした。Kubernetes ではないけどスケールアウトしたらいいじゃん!みたいに言われたりすることがあったけど、理論や論理としては知っていても動きが見えると本当に良かったが感じられました。
「ちょっとちょうどいい」が本当にあったと思います。
今までの投稿
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Pod編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)NameSpace 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Label 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)ReplicaSet 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Deployment 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Service 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)ConfigMap 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Secret 編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)操作編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート3(Label操作)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート3(OwnerReference 操作)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)マニュフェスト編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)マニュフェスト(ConfigMap)編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート3
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート4
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート1(NodePort)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート2(LoadBalancer)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート3(Ingress)
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)外部ストレージ編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)外部ストレージ編パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatefulSet編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatefulSet編 パート2
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatefulSet編 パート3
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)スケール編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Mattermost接続編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Job編
- 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)安定編