初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)安定編


背景

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

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

引用や参考と今回の自分の勉強用の書籍の紹介

技術評論社『Kubernetes実践入門』のサンプルコード
Kubernetes実践入門 プロダクションレディなコンテナ&アプリケーションの作り方

実際の学びについて

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

勉強開始

リポジトリ

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 の設定確認

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
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 をシャットダウンすることができる
mattermost-deploy.yaml(グレースフルシャットダウンのためのPreStopフックの設定)
+        lifecycle:
+          preStop:
+            exec:
+              command:
+              - sleep
+              - 5s

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

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

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

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編
  2. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)NameSpace 編
  3. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Label 編
  4. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)ReplicaSet 編
  5. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Deployment 編
  6. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Service 編
  7. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)ConfigMap 編
  8. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Secret 編
  9. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)操作編
  10. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編
  11. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート2
  12. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート3(Label操作)
  13. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)体感編パート3(OwnerReference 操作)
  14. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)マニュフェスト編
  15. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)マニュフェスト(ConfigMap)編
  16. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編
  17. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート2
  18. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート3
  19. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)通信編 パート4
  20. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート1(NodePort)
  21. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート2(LoadBalancer)
  22. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)公開編パート3(Ingress)
  23. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)外部ストレージ編
  24. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)外部ストレージ編パート2
  25. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatefulSet編
  26. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatefulSet編 パート2
  27. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)StatefulSet編 パート3
  28. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)スケール編
  29. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Mattermost接続編
  30. 初心者のKubernetes入門(書籍 Kubernetes 実践入門の写経から学ぶ)Job編