広告

kubernetes – Podのヘルスチェック

infrastructure as code

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設定はありません。

最後に

今回でヘルスチェックについて、説明しました。
システムの監視を精密にチェックする場合、この機能は必要となるでしょう。

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました