初心者の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.1.2/manifests/mattermost](https://github.com/kubernetes-practical-guide/examples/tree/master/ch6.1.2/manifests/mattermost)

## Pod の動作を安定させる仕組みの恩恵を受けるには

- Kubernetes にアプリケーションの状態を伝える必要がある。
- Kubernetes には状態を伝える仕組みとして **Probe** という仕組みが用意されている
- **Probe** は設定されたアクションを行って Kubernetes はそのアクションの結果を判断してくれる

|Probe のアクション|内容|
|---|---|
|exec|任意のコマンドを実行する|
|httpGet|http/https の Get リクエストを送信する|
|tcpSocket|tcp コネクションを確立する|

> Kubernetes のProbe は Liveness Probe と Readiness Probe の 2 種類の Probeがあるとのこと

### Liveness Probe

- Kubernetes はコンテナが正常に起動しているかを調べる為にこれを使用する
- Probe が失敗した場合は、正常に起動していないと判断して**コンテナ**を再起動する

### Readiness Probe

- Kubernetes はコンテナの準備ができてトラフィックを受け付ける状態になったかどうかを調べるためにこれを使用する
- Probe が成功した場合は、Service のロードバランス先に Pod を追加する

### Probe の設定確認

```diff:mattermost-deploy.yaml(Probeの設定を追加)
+         livenessProbe:
+           initialDelaySeconds: 90
+           timeoutSeconds: 5
+           periodSeconds: 15
+           httpGet:
+             path: /api/v4/system/ping
+             port: 8065
+         readinessProbe:
+           initialDelaySeconds: 15
+           timeoutSeconds: 5
+           periodSeconds: 15
+           httpGet:
+             path: /api/v4/system/ping
+             port: 8065
```

```diff:mysql-sts.yaml(Probeの設定を追加)
           mountPath: /etc/mysql/conf.d
         - name: backup
           mountPath: /mnt/backup
+        livenessProbe:
+          exec:
+            command:
+            - /bin/bash
+            - -ec
+            - >-
+              mysqladmin -h localhost --user=root --password=${MYSQL_ROOT_PASSWORD} ping
+          initialDelaySeconds: 5
+          periodSeconds: 30
+          timeoutSeconds: 5
+        readinessProbe:
+          exec:
+            command:
+            - /bin/bash
+            - -ec
+            - >-
+              mysql -h localhost --user=root --password=${MYSQL_ROOT_PASSWORD} -e "SELECT 1"
+          initialDelaySeconds: 5
+          periodSeconds: 30
+          timeoutSeconds: 5
       volumes:
       - name: initdb
         emptyDir: {}
```

### Probe に設定できるパラメータ

|パラメータ|説明|デフォルト値|
|---|---|---|
|initialDelaySeconds|Probe を開始するまで待機する秒数|なし|
|periodSeconds|Probe の実行間隔|10|
|timeoutSeconds|Probe のタイムアウト|1|
|successThreshold|Probe が成功したとみなす回数のしきい値|1|
|failureThreshold|Probe が失敗したとみなす回数のしきい値|3|

### グレースフルに終了できるようにする

- 実行中の処理などを正常に終わりに向かわせてからプロセスを終了させる
- PreStop フックを使うことで終了させる時間を調整して Pod をシャットダウンすることができる

```diff:mattermost-deploy.yaml(グレースフルシャットダウンのためのPreStopフックの設定)
+        lifecycle:
+          preStop:
+            exec:
+              command:
+              - sleep
+              - 5s
```

### 最低起動してほしい Pod の数を伝える

- 対象 Node の停止が伴うメンテナンスを行う場合には、動いている Pod を削除する必要がある
- Pod を削除するとコンテナが停止してしまう為、Pod を他のノードへ退避しないといけない
- 瞬時に違う Node へ Pod を対しすると瞬間的に動いていない時間が発生してしまう

上記のケースを避ける為に Kubernetes は **PodDisruptionBudget** という仕組みが用意されている

```yaml:mattermost-pdb.yaml
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: mattormost-pdb
spec:
  maxUnavailable: 1
  selector:
    matchLabels:
      app: mattermost
```

|パラメータ|説明|
|---|---|
|minAvailable|最低動作してほしい Pod の最小数または割合|
|maxUnavailable|動作しないことを許容する Pod の最大数または割合|
> maxUnavailable は指定したときの削除できる Pod の数は少数点以下切り上げて算出するので最低値が 1 になり、minAvailable は小数点以下を切り捨てて 0 となる

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

**「負荷に応じてアプリケーションの処理能力を向上させる」**です。

# 最後に

今回は **アプリケーションの状態** を Kubernetes へ伝えるということについて書籍では **health-check** として mattermost の API を叩いて確認する MySQL の接続をコマンドを叩いて確認する。
この部分に感動を覚えました。

自分が作成するアプリに対しても mattermost のドキュメントのような項目、もしくはサービスのサーバがどのようになっているのかをいち早く確認することへの再確認に繋がりました。

# 今までの投稿
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)