KubernetesのPod設定(manifest)に、ヘルスチェック(死活監視)を定義することが可能です。
今回は、ヘルスチェック回りの知識について、ご紹介しようと思います。
Podヘルスチェックの概要
k8sのワークロードにヘルスチェックの定義ができます。
ヘルスチェックというのは、コンテナが仕事をしてくれているかどいうかを判断することです。
k8sのヘルスチェックの動作で、以下の2種類に分けることが可能です。
- Liveness Probe:Podが正常に動作していることの確認。
- 失敗時の動作:Podの再起動(spec.restartPolicyに準ずる。※Jobの部分を参照)
- Readiness Probe:Podがサービスインする準備ができていることの確認
- 失敗時の動作:Podへトラフィックを流さない
LoadBalancerからNodeへのヘルスチェックはICMP(Ping)でのチェックしか行いません。
Podの状態をチェックしながら、ロードバランシング死体であれば、Podのspec.containersで上記のヘルスチェックを定義する必要があります。
ちなみに、Liveness ProbeとReadiness Probeは同時に同じPodに適用することも可能です。
ヘルスチェックの方式
Liveness ProbeもReadiness Probeも、ヘルスチェックの方式は同じです。
以下の3種類があります。
- exec:コマンドを実行し、終了コードが0(コマンドが正常完了の場合は0が返ってきます)でなければ、失敗
- httpGet:HTTP GETリクエストを実行し、Status Codeが200~300(リクエストが正常に受け付けられた)でなければ、失敗
- tcpSocket:TCPセッションが確立できなければ、失敗。(3ウェイハンドシェック)
ヘルスチェックの間隔
ヘルスチェックの間隔を定義することもできます。
定義できるものは以下になります。
- initialDelaySeconds:初回ヘルスチェック開始のタイミング(Pod再起動後の初回)
- periodSeconds:ヘルスチェックの間隔
- timeoutSeconds:タイムアウトまでの秒数
- successThreshold:成功と判断するまでのチェック回数
- failureThreshold:失敗と判断するまでのチェック回数
ヘルスチェック例
Liveness ProbeとReadiness Probe両方定義しているワークロードを例として出します。
apiVersion: v1
kind: Pod
metadata:
name: healthcheck-sample
labels:
app: sample-app
spec:
restartPolicy: OnFailure # Podが異常停止時のみ、再起動する
containers:
- name: nginx-container
image: nginx # nginx:latestと同じ、最新バージョンのイメージを取得する
ports:
- containerPort: 80
livenessProbe: # 失敗すると、再起動spec.restartPolicyの設定に従って、再起動などをする
httpGet: # http getの応答ステータスコードでヘルスチェック
# 'host' が定義されていない場合、'PodIP'が使用されます
# host: my-host # hostの定義例
# 'scheme'が定義されていない場合、HTTPスキームが使用されます。'HTTP'と'HTTPS'のみ
# scheme: HTTPS # schemeの定義例
port: 80
path: /index.html
initialDelaySeconds: 10 # Pod起動後、初回ヘルスチェックまでの遅延(秒)
timeoutSeconds: 5 # タイムアウトまでの時間
successThreshold: 1 # 成功1回で、成功とみなす
failureThreshold: 3 # 失敗3回で、失敗とみなす
periodSeconds: 3 # ヘルスチェックの間隔
readinessProbe: # 失敗すると、トラフィックは受け付けなくなる
exec: # コマンド実行結果のステータスコードでヘルスチェック
command: ["ls", "/usr/share/nginx/html/50x.html"]
initialDelaySeconds: 5
timeoutSeconds: 3
successThreshold: 2
failureThreshold: 3
periodSeconds: 3
restartPolicy
以前Jobワークロードの説明で触れていましたが、ここでもう一回restartPolicyについて説明しておきます。
manifestのリソース指定:
spec.restartPolicy
PodのrestartPolicy
設定値
- Always:デフォルト値。Podが停止すると、常に再起動
- OnFailure:予期せぬ失敗による停止(終了コードが0以外)すると、再起動
- Never:停止されても、再起動しない
JobのrestartPolicy
設定値
- OnFailure:予期せぬ失敗による停止(終了コードが0以外)すると、再起動
- Never:停止すると、元のPodが再起動しない。代わりに新規のPodを作成して、Jobを実行する
※Jobに、Always設定はありません。
最後に
今回でヘルスチェックについて、説明しました。
システムの監視を精密にチェックする場合、この機能は必要となるでしょう。
ここまで読んでいただいて、お疲れ様でした。
コメント