初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）安定編パート２

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


## 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

## リポジトリ

[https://github.com/kubernetes-practical-guide/examples/tree/master/ch6.2.2/manifests/mattermost](https://github.com/kubernetes-practical-guide/examples/tree/master/ch6.2.2/manifests/mattermost)

# 負荷に応じてアプリケーションの処理能力を向上させる

## スケールアップする

### Resource Request

- コンテナに最低限割り当てたいリソース量を指定できる
- 指定しない場合はコンテナに割り当てるリソース量が０でも構わない
- リソース量以上の空き容量があるノードにスケジュールする
- すべてのノードに空き容量がなければスケジュールされず空きができるまで待機する
- メモリについては不足の場合はコンテナを終了されてしまう可能性がある

### Resource Limit

- コンテナが利用できる上限のリソース量を指定できる
- 指定しない場合は無制限利用しても良いという意味で動いてしまう
- CPU は指定した値以上は利用できない
- Request で指定した Pod Noリソースのほうが余剰 CPU リソースより優先される
- メモリについては指定した値以上のメモリ量を利用した場合、コンテがが終了されてしまう可能性がある

### 利用するリソース量を指定する

```diff:mattermost-deploy.yaml(コンテナに最低限割り当てたいリソース量を設定)
               command:
               - sleep
               - 5s
+        resources:
+          requests:
+            cpu: 100m     # コア数を指定
+            memory: 100Mi # メモリ容量のバイト数を指定
       volumes:
       - name: cm-volume
         configMap:
```

```console:マニュフェスト適用
$ kubectl apply -f mattermost-deploy.yaml
```

## スケールアウトする

### Mattermost の Pod をスケールアウトしてみる

```console:スケールアウトしてみる
# 実行前
$ 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 を自動的にスケールアウトする

```console:cpu-maxの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
```

```console:cpu-maxのPodのCPU使用率が100%近くになっていることを確認できる
$ 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 をオートスケールしてみる

```console:HorizontalPodAutoscalerオブジェクト作成
$ 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
```

```console:オートスケールされていることが確認できる
$ 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
```

```console:コマンドで作成したHorizontalPodAutoscalerオブジェクトを作成してみる
$ 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
```

```yaml:mattermost-hpa.yaml(これが適用されるとPodの変化を確認できる)
$ 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
```

```console:マニュフェスト適用
$ 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 が減らなかったのですが・・・増えることは確認ができたのと一旦、１０まで増やしたら減ったみたいだったので環境てきなのかな？と思いつつ、オートスケールは体感できました。

> TARGETS の **＜unknown＞/50%** の **unknown** は良いのだろうか？？？？

## 次は 7 章をやっていきます。

**「アプリケーションのセキュリティを強化する」**です。

# 最後に

今回は、スケールアップ、スケールアウト、そして **オートスケール** を学びました。
オートスケールの動きを今回確認できたのは目からウロコでした。Kubernetes ではないけどスケールアウトしたらいいじゃん！みたいに言われたりすることがあったけど、理論や論理としては知っていても動きが見えると本当に良かったが感じられました。

「ちょっとちょうどいい」が本当にあったと思います。


# 今までの投稿
1. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Pod編](https://qiita.com/nodokaodayaka/items/04d8bc3c9c40443c1cd3)
2. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）NameSpace 編](https://qiita.com/nodokaodayaka/items/73bc1c939a665aaa4b7b)
3. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Label 編](https://qiita.com/nodokaodayaka/items/fd5284475fb1ba920559)
4. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ReplicaSet 編](https://qiita.com/nodokaodayaka/items/fc9f749f123649a2dbd9)
5. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Deployment 編](https://qiita.com/nodokaodayaka/items/2c9d4eefec40d4896126)
6.  [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Service 編](https://qiita.com/nodokaodayaka/items/28955bd813eaf512baf5)
7. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ConfigMap 編](https://qiita.com/nodokaodayaka/items/09c7627eaa913da78cf8)
8. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Secret 編](https://qiita.com/nodokaodayaka/items/8bc1a5963a7c7c177010)
9. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）操作編](https://qiita.com/nodokaodayaka/items/09cb848164e4a1855c83)
10. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編](https://qiita.com/nodokaodayaka/items/ae95e04b064b7600f6af) 
11. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート２](https://qiita.com/nodokaodayaka/items/fa87fd7a3733957e7aca) 
12. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（Label操作）](https://qiita.com/nodokaodayaka/items/8f1892eb1627d0717180)
13. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（OwnerReference 操作）](https://qiita.com/nodokaodayaka/items/b4ad326be41626da9b2e)
14. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト編](https://qiita.com/nodokaodayaka/items/8d212a5f1eeb2685f51c)
15. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト(ConfigMap)編](https://qiita.com/nodokaodayaka/items/7dd2f3885d8e957ffaad)
16. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編](https://qiita.com/nodokaodayaka/items/71c6f7d469cf2f277d3d)
17. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート２](https://qiita.com/nodokaodayaka/items/2663e1931bd1ec007785)
18. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート３](https://qiita.com/nodokaodayaka/items/9ad45aa52d76bcb844d7)
19. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート４](https://qiita.com/nodokaodayaka/items/e6ef632223f9ac2cc99e)
20. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート１（NodePort）](https://qiita.com/nodokaodayaka/items/754a32235cf7e648e8f9)
21. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート２（LoadBalancer）](https://qiita.com/nodokaodayaka/items/79df5bbefbb0e1a938bd)
22. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート３（Ingress）](https://qiita.com/nodokaodayaka/items/f4433cce735f967c294e)
23. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編](https://qiita.com/nodokaodayaka/items/ae7dc8d442280b5bb9ab)
24. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編パート２](https://qiita.com/nodokaodayaka/items/beead2c136d591fe18d6)
25. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編](https://qiita.com/nodokaodayaka/items/9cd9cff01b15d7ab3e01)
26. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編 パート２](https://qiita.com/nodokaodayaka/items/bac0fa82f390b315f411)
27. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編 パート３](https://qiita.com/nodokaodayaka/items/5583bbbb70438b8f9a0f)
28. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）スケール編](https://qiita.com/nodokaodayaka/items/e524099729d6baabca87)
29. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Mattermost接続編](https://qiita.com/nodokaodayaka/items/59953e5a21e5394ecb6a)
30. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Job編](https://qiita.com/nodokaodayaka/items/de74818175eb2a6dfb5b)
31. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）安定編](https://qiita.com/nodokaodayaka/items/1e0184e65dc8ed9b161d)