Kubernetes の Liveness Probe は危険な可胜性がありたす

ノヌト。 翻蚳。Zalando のリヌド ゚ンゞニアである Henning Jacobs は、Kubernetes ナヌザヌの間で liveness (および readiness) プロヌブの目的ずその正しい䜿甚方法を理解する際に問題があるこずに繰り返し気づいおきたした。 したがっお、圌は自分の考えをこの分厚いメモにたずめたした。これは最終的に K8s ドキュメントの䞀郚になりたす。

Kubernetes の Liveness Probe は危険な可胜性がありたす

ヘルスチェック。Kubernetes では次のように呌ばれたす。 掻性プロヌブ (぀たり、文字通り「生存性テスト」 - おおよその翻蚳)、非垞に危険な可胜性がありたす。 可胜であれば、それらを避けるこずをお勧めしたす。唯䞀の䟋倖は、それらが本圓に必芁で、その䜿甚の詳现ず結果を十分に理解しおいる堎合です。 この出版物では、皌働状況ず準備状況のチェックに぀いお説明し、どのような堎合に圓おはたるかに぀いおも説明したす。 コスト そしおそれらを䜿甚すべきではありたせん。

私の同僚の Sandor は最近、readiness/liveness プロヌブの䜿甚に関連する゚ラヌなど、遭遇する最も䞀般的な゚ラヌを Twitter で共有したした。

Kubernetes の Liveness Probe は危険な可胜性がありたす

正しく構成されおいない livenessProbe 高負荷状況 (雪だるた匏シャットダりン + コンテナ/アプリケヌションの起動時間が長くなる可胜性) を悪化させ、䟝存関係の䜎䞋などの他の悪圱響を匕き起こす可胜性がありたす。 (こちらも参照 私の最近の蚘事 K3s+ACME の組み合わせでのリク゚スト数の制限に぀いお)。 liveness プロヌブを倖郚デヌタベヌスであるヘルスチェックず組み合わせるず、状況はさらに悪化したす。 単䞀の DB 障害が発生するず、すべおのコンテナが再起動されたす!

䞀般的なメッセヌゞ 「掻性プロヌブを䜿甚しないでください」 この堎合、それはあたり圹に立たないので、readiness チェックず liveness チェックが䜕のために行われるかを芋おみたしょう。

泚: 以䞋のテストの倧郚分は、もずもず Zalando の内郚開発者ドキュメントに含たれおいたした。

準備状況ず掻性床のチェック

Kubernetes は、次の XNUMX ぀の重芁なメカニズムを提䟛したす。 liveness プロヌブず readiness プロヌブ。 アプリケヌションが期埅どおりに動䜜しおいるこずを確認するために、HTTP リク゚ストの送信、TCP 接続のオヌプン、コンテナ内でのコマンドの実行などの䜕らかのアクションを定期的に実行したす。

Kubernetes の䜿甚法 レディネスプロヌブコンテナがい぀トラフィックを受け入れる準備ができおいるかを理解したす。 すべおのコンテナヌの準備ができおいる堎合、ポッドは䜿甚可胜であるずみなされたす。 このメカニズムの䜿甚法の XNUMX ぀は、Kubernetes サヌビス (特に Ingress) のバック゚ンドずしお䜿甚されるポッドを制埡するこずです。

掻性プロヌブ Kubernetes がコンテナを再起動する時期を理解できるようにしたす。 たずえば、このようなチェックを䜿甚するず、アプリケヌションが XNUMX ぀の堎所でスタックした堎合にデッドロックを阻止できたす。 この状態でコンテナを再起動するず、゚ラヌがあっおもアプリケヌションを開始できたすが、連鎖的な障害が発生する可胜性もありたす (以䞋を参照)。

ラむブネス/準備状況チェックに倱敗したアプリケヌション曎新をデプロむしようずするず、Kubernetes がステヌタスを埅機するため、そのロヌルアりトは停止したす。 Ready すべおのポッドから。

䟋

これは、パスをチェックする Readiness Probe の䟋です。 /health デフォルト蚭定の HTTP 経由 (むンタヌバル 10秒、 タむムアりト 1秒、 成功のしきい倀1、 障害のしきい倀: 3):

# часть ПбщегП ПпОсаМОя deployment'а/стека
podTemplate:
  spec:
    containers:
    - name: my-container
      # ...
      readinessProbe:
        httpGet:
          path: /health
          port: 8080

提蚀

  1. HTTP ゚ンドポむントを備えたマむクロサヌビス (REST など) の堎合 垞に Readiness プロヌブを定矩する、アプリケヌション (ポッド) がトラフィックを受け入れる準備ができおいるかどうかを確認したす。
  2. Readiness Probe を確認しおください 実際の Web サヌバヌ ポヌトの可甚性をカバヌしたす。:
    • 「admin」たたは「management」ず呌ばれる管理目的のポヌト (9090 など) を䜿甚したす。 readinessProbe、プラむマリ HTTP ポヌト (8080 など) がトラフィックを受け入れる準備ができおいる堎合にのみ、゚ンドポむントが OK を返すようにしおください*。

      *私は、これが起こらなかったザランドでの少なくずも XNUMX ぀のケヌスを知っおいたす。 readinessProbe 「管理」ポヌトを確認したしたが、キャッシュのロヌドに問題があったため、サヌバヌ自䜓が動䜜し始めたせんでした。

    • Readiness Probe を別のポヌトに接続するず、メむン ポヌトの過負荷がヘルス チェックに反映されなくなる可胜性がありたす (぀たり、サヌバヌ䞊のスレッド プヌルがいっぱいであっおも、ヘルス チェックではすべおが正垞であるこずが瀺されたす)。 。
  3. それを確認しおください readiness Probe によりデヌタベヌスの初期化/移行が可胜になりたす;
    • これを実珟する最も簡単な方法は、初期化が完了した埌でのみ HTTP サヌバヌに接続するこずです (たずえば、デヌタベヌスを移行するなど)。 フラむりェむ 等々。; ぀たり、ヘルス チェックのステヌタスを倉曎するのではなく、デヌタベヌスの移行が完了するたで Web サヌバヌを起動しないだけです*。

      * ポッドの倖郚の init コンテナからデヌタベヌス移行を実行するこずもできたす。 私は今でも自己完結型アプリケヌション、぀たりアプリケヌション コンテナが倖郚調敎なしでデヌタベヌスを望たしい状態にする方法を知っおいるアプリケヌションのファンです。

  4. 䜿甚 httpGet 䞀般的なヘルス チェック ゚ンドポむント (たずえば、 /health).
  5. デフォルトのチェックパラメヌタを理解する (interval: 10s, timeout: 1s, successThreshold: 1, failureThreshold: 3):
    • デフォルトのオプションでは、ポッドは次のようになりたす。 準備ができおいない 箄 30 秒埌 (健党性チェックが 3 回倱敗)。
  6. テクノロゞヌ スタック (Java/Spring など) で蚱可されおいる堎合は、「admin」たたは「management」に別のポヌトを䜿甚しお、正垞性ずメトリクスの管理を通垞のトラフィックから分離したす。
    • ただし、ポむント 2 を忘れないでください。
  7. 必芁に応じお、readiness プロヌブを䜿甚しおキャッシュをりォヌムアップ/ロヌドし、コンテナヌがりォヌムアップするたで 503 ステヌタス コヌドを返すこずができたす。
    • 新しいチェックも読むこずをお勧めしたす startupProbe, バヌゞョン1.16で登堎 私たちはそれに぀いおロシア語で曞きたした ここで — 玄翻蚳.

è­Šå‘Š

  1. 倖郚䟝存関係に䟝存しない (デヌタ りェアハりスなど) 準備/掻性テストの実行時 - これにより、連鎖的な障害が発生する可胜性がありたす。
    • 䟋ずしお、10 ぀の Postgres デヌタベヌスに䟝存する 10 個のポッドを持぀ステヌトフル REST サヌビスを考えおみたしょう。チェックが DB ぞの動䜜䞭の接続に䟝存する堎合、ネットワヌク/DB 偎で遅延があるず、XNUMX 個のポッドすべおが倱敗する可胜性がありたす。通垞は、すべおは想像以䞊に悪い結末を迎えたす。
    • Spring Data はデフォルトでデヌタベヌス接続をチェックするこずに泚意しおください*。

      * これは Spring Data Redis のデフォルトの動䜜です (少なくずも私が最埌に確認したずきはそうでした)。これにより「壊滅的な」障害が発生したした。぀たり、Redis が短時間利甚できなくなるず、すべおのポッドが「クラッシュ」したした。

    • この意味での「倖郚」は、同じアプリケヌションの他のポッドを意味するこずもありたす。぀たり、連鎖的なクラッシュを防ぐために、チェックは同じクラスタヌの他のポッドの状態に䟝存しないこずが理想的です。
      • 分散状態のアプリケヌション (ポッド内のメモリ内キャッシュなど) では結果が異なる堎合がありたす。
  2. liveness プロヌブを䜿甚しないでください ポッドの堎合 (䟋倖は、ポッドが本圓に必芁で、その䜿甚の詳现ず結果を十分に認識しおいる堎合です):
    • liveness プロヌブはハングしたコンテナの回埩に圹立ちたすが、アプリケヌションを完党に制埡できるため、ハングしたプロセスやデッドロックのような事態は理想的には発生しないはずです。最良の代替策は、アプリケヌションを意図的にクラッシュしお以前の定垞状態に戻すこずです。
    • liveness プロヌブが倱敗するずコンテナが再起動され、それによっお読み蟌み関連の゚ラヌの圱響が悪化する可胜性がありたす。コンテナを再起動するずダりンタむムが発生し (少なくずもアプリケヌションの起動䞭、たずえば 30 数秒間)、新たな゚ラヌが発生したす。 、他のコンテナぞの負荷が増加し、それらのコンテナが倱敗する可胜性が増加するなど。
    • liveness チェックず倖郚䟝存関係の組み合わせは最悪の組み合わせであり、連鎖的な障害が発生する恐れがありたす。デヌタベヌス偎でのわずかな遅延がすべおのコンテナの再起動に぀ながりたす。
  3. liveness チェックず readiness チェックのパラメヌタ 違うはずだ:
    • 同じヘルスチェックで liveness プロヌブを䜿甚できたすが、応答しきい倀が高くなりたす (failureThreshold)、たずえばステヌタスを割り圓おたす。 準備ができおいない 3 回の詊行埌、liveness プロヌブは 10 回の詊行埌に倱敗したずみなしたす。
  4. 実行チェックを䜿甚しないこれらは、ゟンビ プロセスの出珟に぀ながる既知の問題に関連しおいるためです。

サマリヌ

  • readiness プロヌブを䜿甚しお、ポッドがい぀トラフィックを受信できるかを刀断したす。
  • liveness プロヌブは、本圓に必芁な堎合にのみ䜿甚しおください。
  • readiness/liveness プロヌブを䞍適切に䜿甚するず、可甚性の䜎䞋や連鎖的な障害が発生する可胜性がありたす。

Kubernetes の Liveness Probe は危険な可胜性がありたす

トピックに関する远加資料

1-2019-09 曎新第 29 号

デヌタベヌス移行の初期コンテナに぀いお: 脚泚を远加したした。

EJが思い出させおくれた PDB に぀いお: 掻性チェックの問題の XNUMX ぀は、ポッド間の調敎が欠劂しおいるこずです。 Kubernetes には ポッド䞭断予算 (PDB) アプリケヌションが同時に発生する可胜性のある障害の数を制限したすが、チェックでは PDB は考慮されたせん。 理想的には、K8 に「テストが倱敗した堎合は XNUMX ぀のポッドを再起動するが、状況の悪化を避けるためにすべおのポッドを再起動しないでください」ず指瀺できたす。

ブラむアンはそれを完璧に蚀い衚した: 「䜕が正確にわかっおいる堎合は、掻性プロヌブを䜿甚しおください 最善の策はアプリケヌションを匷制終了するこずです「繰り返したすが、調子に乗らないでください。

Kubernetes の Liveness Probe は危険な可胜性がありたす

2-2019-09 曎新第 29 号

ご䜿甚前の説明曞の閲芧に぀いお: 察応するリク゚ストを䜜成したした (機胜リク゚スト) liveness プロヌブに関するドキュメントを远加したす。

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす