Kubernetes Podの排除に関する詳細な説明

Kubernetes Podの排除に関する詳細な説明

Kubernetes Pod が削除されるとはどういう意味ですか?これらは通常、リソース不足のために終了しますが、なぜこのようなことが起こるのでしょうか?

削除は、ノードに割り当てられたポッドを終了するように要求するプロセスです。 Kubernetes で最も一般的な状況の 1 つはプリエンプションです。これは、リソースが限られたノードに新しい Pod をスケジュールするには、通常、別の Pod を終了する必要がある状況です。

さらに、Kubernetes はリソースの使用状況を常にチェックし、ノードの圧力が高すぎる場合はノードの圧力の排除をトリガーします。

毎日、何千ものポッドが家から追い出されています。立ち往生し、道に迷った彼らは、これまでの生活様式を諦めなければなりませんでした。彼らの中にはホームレスになる人もいるかもしれない。今日の社会では、CPU とメモリに対する要件はますます高くなります。

この記事では、以下の点について紹介します。

ポッドの排除の理由: プリエンプションとノードのプレッシャー

先制的な立ち退き

ポッド優先クラス

ノードストレス除去

サービス品質

その他の種類の立ち退き

Prometheus での Kubernetes ポッドの排除監視

ポッドが排除される理由: プリエンプションとノードの圧力

Kubernetes で Pod の削除が発生する理由はいくつかありますが、最も重要なものは次のとおりです。

押収する

ノードストレス除去

先制的な立ち退き

プリエンプションのプロセスは次のとおりです。新しい Pod をスケジュールする必要があるが、十分なリソースを持つ適切なノードがない場合、kube-scheduler は、新しい Pod をスケジュールできることを確認するために、優先順位の低い Pod の一部を削除 (終了) できるかどうかを確認します。

まず、Kubernetes のスケジューリングがどのように機能するかを理解しましょう。

ポッドのスケジューリング

Kubernetes スケジューリングは、ポッドをノードに割り当てるプロセスです。

デフォルトでは、コントロール プレーン上で実行される、スケジューリングを担当する kube-scheduler と呼ばれる Kubernetes エンティティがあります。一致するノードが見つかるまで、ポッドは保留状態で開始されます。

ポッドをノードに割り当てるプロセスは、この順序に従います。

  • 事前選考
  • スコアリング
事前選考

事前選択プロセス中に、kube-scheduler は現在の Pod を配置できるすべてのノードを選択します。ここでは、汚染や耐性などの特性が考慮されます。完了すると、そのポッドに適したノードのリストが表示されます。

スコアリング

スコアリング プロセス中に、kube-scheduler は前の手順で取得したリストから各ノードにスコアを割り当てます。このようにして、候補ノードは最も適切なものから最も不適切なものの順に並べ替えられます。 2 つのノードのスコアが同じ場合、kube-scheduler はそれらをシャッフルします。

画像.png

しかし、ポッドを実行するのに適したノードがない場合はどうなりますか?この場合、Kubernetes はプリエンプション プロセスを開始し、新しい Pod を割り当てられるように、優先度の低い Pod を排除しようとします。

ポッド優先クラス

プリエンプション中に特定のポッドが排除されるのを防ぐにはどうすればよいですか?場合によっては、特定の Pod が重要であり、終了してはならないことがあります。

そのため、Kubernetes には優先クラスがあります。

優先度クラスは、数値の優先度値を特定のポッドにマッピングできる Kubernetes オブジェクトです。値が高いものはより重要と分類され、立ち退きの可能性が低くなります。

現在の優先クラスを照会するには、次の方法があります。

 kubectl 優先度クラスを取得する
kubectl で PC を取得する

名前 値 グローバル-デフォルト 年齢
システム-クラスター-クリティカル2000000000 false 2d
システム-ノード-クリティカル2000001000 false 2d

テスト優先クラス

ここにはブルーベリー、ラズベリー、ストロベリーの 3 つのポッドがあります。

名前 準備完了 ステータス 再起動 年齢
ブルーベリー1 / 1ランニング0 4 h41m
ラズベリー1 / 1ランニング0 58 m
いちご1 / 1ランニング0 5 h22m

優先クラスには、trueberry と falseberry の 2 つがあります。その中で、trueberry の方が優先度が高いです。

 apiバージョン:スケジューリング.k8s .io / v1
種類: PriorityClass
メタデータ:
名前:トゥルーベリー
: 1000000
グローバルデフォルト: false
説明: 「この果物は本物のベリーです」

apiバージョン:スケジューリング.k8s .io / v1
種類: PriorityClass
メタデータ:
名前:フォルスベリー
: 5000
グローバルデフォルト: false
説明: 「この果物は偽のベリーです」

  • ブルーベリーはトゥルーベリーを使用します
  • ラズベリーとイチゴは、フルーセベリーを使用します

つまり、プリエンプションが発生した場合、優先度の高いポッドのためのスペースを確保するために、ラズベリーとストロベリーが削除される可能性が高くなります。

次に、Pod 定義に優先クラスを含めて、Pod に優先クラスを割り当てます。

優先度クラス名: trueberry

ここで、さらに 3 つの果物を追加してみましょう。すべての新しい果物には、trueberry と呼ばれる優先度の高いクラスが含まれます。

これら 3 つの新しいフルーツのメモリまたは CPU 要件はノードによって満たすことができないため、kubelet は新しいフルーツよりも優先度が低いすべての Pod を削除します。 Blueberry は優先度が高いため実行を続けます。

名前 準備完了 ステータス 再起動 年齢
バナナ0 / 1コンテナ作成0 2
ブルーベリー1 / 1ランニング0 4 h42m
ラズベリー0 / 1終了0 59 m
いちご0 / 1終了0 5 h23m
トマト0 / 1コンテナ作成0 2
スイカ0 / 1コンテナ作成0 2

最終結果は次のとおりです。

名前 準備完了 ステータス 再起動 年齢
バナナ1 / 1ランニング0 3
ブルーベリー1 / 1ランニング0 4 h43m
トマト1 / 1ランニング0 3
スイカ1 / 1ランニング0 3

ノードストレス除去

プリエンプションに加えて、Kubernetes はディスク負荷、CPU、メモリ不足 (OOM) などのノード リソースを継続的にチェックします。

ノードのリソース消費量 (CPU やメモリなど) が特定のしきい値に達すると、Kubelet はリソースを解放するために Pod の削除を開始します。削除順序を決定する際には、サービス品質 (QoS) が考慮されます。

サービス品質 (QoS)

Kubernetes では、ポッドに 3 つの QoS クラスのいずれかが割り当てられ、リソース不足によりポッドが排除される可能性が定義されます。 3 つの QoS は次のとおりです。

  • 保証
  • バースト可能
  • ベストエフォート

これらの QoS カテゴリは Pod にどのように割り当てられるのでしょうか?これは、CPU とメモリの制限と要求に基づいています。

  • 制限: コンテナが使用できるリソースの最大量。
  • リクエスト: コンテナの実行に必要なリソースの最小量。

保証

ポッドに保証された QoS レベルが割り当てられている場合、その特性は次のようになります。

  • Pod 内のすべてのコンテナには、CPU とメモリの制限と要求が設定されています。
  • ポッド内のすべてのコンテナには、同じ CPU 制限と CPU 要求値が設定されます。
  • Pod 内のすべてのコンテナには、同じメモリ制限とメモリ要求値があります。

保証されたポッドは、通常の状況では、ノード内の別のポッドに割り当てられるために追い出されることはありません。

バースト可能

Pod の QoS レベルが Burstable の場合、QoS レベルが割り当てられます。

  • 保証された QoS レベルはありません。
  • Pod 内のコンテナの制限またはリクエストを設定します。

Burstable Pod は排除される可能性がありますが、次のカテゴリよりも可能性は低くなります。

ベストエフォート

Pod には BestEffort の QoS クラスが割り当てられ、次のようになります。

  • Pod 内のどのコンテナにも制限やリクエストは設定されていません。

ノード内でノード ストレス プロセスが発生した場合、BestEffort Pod が削除される可能性が最も高くなります。

重要: 一時ストレージなど、制限やリクエストで使用可能な他のリソースが存在する場合もありますが、それらは QoS クラスの計算には使用されません。

前述のように、ノード ストレスの排除では QoS クラスが考慮されます。内部で何が起きているかを示します。

kubelet は、次の順序で削除する Pod をキューに入れます。

  • 要求された以上の容量を使用するベストエフォートポッドまたはバースト可能なポッド
  • 使用量が要求より少ないバースト可能なポッドまたは保証されたポッド

Kubernetes は、2 番目のグループの Pod よりも先に、最初のグループの Pod を削除しようとします。

上記の内容から得られたいくつかの洞察。

  • リクエストが非常に少ないコンテナを追加すると、そのポッドはグループ 1 に割り当てられる可能性があり、削除される可能性が高くなります。
  • どの特定の Pod が削除されるかを知る方法はありません。Kubernetes はグループ 2 の Pod よりも先にグループ 1 の Pod を削除しようとするだけです。
  • 保証された Pod は通常は削除されません。Kubelet は他の Pod をスケジュールするためにそれらを削除しません。ただし、一部のシステム サービスでさらに多くのリソースが必要な場合、kubelet は必要に応じて保証された Pod を常に最低の優先度で終了します。

その他の種類の立ち退き

この記事では、プリエンプションとノード圧力による削除に焦点を当てていますが、ポッドは他の方法でも削除できます。例:

API によるエビクション

Kubernetes Eviction API [1]を使用すると、ノードの1つからオンデマンドでポッドの削除を要求できます。

汚染ベースの排除

Kubernetes の taint と toleration を使用すると、Pod をノードに割り当てる方法を指示できます。ただし、既存のノードに NoExecute テイントを適用すると、それを許容しないすべての Pod が直ちに削除されます。

ノード排水

ノードが使用できなくなったり、もうそのノードで作業したくないと思う場合があります。 kubectl cordon コマンドを使用すると、新しい Pod がスケジュールされるのを防ぐことができますが、現在のすべての Pod を一度に完全にクリアすることもできます。 kubectl drain nodename を実行すると、そのノード内のすべての Pod が、正常な終了期間に従って削除されます。

Kubernetes ポッドの排除監視

クラウド ソリューションでは、Prometheus を使用して Pod の削除方法を簡単に監視できます。

 kube_pod_status_reason { reasnotallow = "立ち退き" } > 0

これにより、クラスター内で削除されたすべてのポッドが表示されます。これを kube_pod_status_phase{phase="Failed"} と組み合わせて、ポッドが失敗した後に削除されたポッドにアラートを出すこともできます。

さらに詳しく知りたい場合は、Prometheus でのリソースの監視に関する次の記事を参照してください。

  • Kubernetesのリソース制限を適切に調整する方法 [1]
  • Kubernetesのキャパシティプランニング:クラスターのリクエストを適切にスケジュールする方法 [2]

要約する

ご覧のとおり、エビクションは、限られたリソース (この場合は、ポッドが使用するノード) を制御できる Kubernetes のもう 1 つの機能です。

プリエンプション中、Kubernetes は優先度の低いポッドを排除して、新しいポッドをスケジュールするためのリソースを解放しようとします。優先度クラスを使用すると、どの Pod が排除される可能性が低いかによって、プリエンプション後に実行を継続する可能性が高いかを制御できます。

実行中、Kubernetes はノードの負荷をチェックし、必要に応じて Pod を削除します。 QoS クラスを使用すると、ノードに負荷がかかった場合にどの Pod が排除される可能性が高いかを制御できます。

メモリと CPU はノード内の重要なリソースであり、適切な量のメモリと CPU を使用するようにポッド、コンテナ、ノードを構成する必要があります。これらのリソースを適切に管理すれば、コストを節約できるだけでなく、どのような状況でも重要なプロセスが継続して実行されるようにすることができます。

ドキュメント【1】https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#create-eviction-pod-v1-core

【1】https://sysdig.com/blog/kubernetes-resource-limits/

【2】https://sysdig.com/blog/kubernetes-capacity-planning/


<<:  CIO 向けハイパフォーマンス コンピューティング ワークロードをクラウドに移行するためのガイド

>>:  2023 年のクラウド コンピューティング インフラストラクチャのトレンド

推薦する

bluevm のフィーチャーパネルの簡単なチュートリアル

bluevm が最新の KVM VPS プロモーションをリリースした後、初心者の友人から使い方が分か...

超格安ブログホストのおすすめ、海外ホスト、(専用)専用ブログホスト

現在のホスティング市場の価格はますます高くなっています。Bluehost に代表されるブログホストは...

新規サイトの SEO で Baidu の重みを高める方法

「百度ウエイト」という言葉がますます注目を集めています。百度ウエイトが本当に存在するかどうかに関わら...

Linodeについてはどうですか? [年] Linode カナダ データセンター クラウド サーバー レビュー

Linodeはどうですか? Linode Canada クラウド サーバーはいかがでしょうか?カナダ...

2022 年のクラウド ネイティブ セキュリティの開発に関する 24 の洞察

今日、クラウド ネイティブ テクノロジーは、企業に迅速な配信の利点をもたらすだけでなく、新たなセキュ...

サイト運営経験: 訪問者を維持することは、ウェブサイトの将来性を意味します

今では、大規模なウェブサイトから小規模なセルフメディアプラットフォームまで、誰もが訪問者を維持する方...

ウェブマスターネットワークからの毎日のレポート:FacebookのIPOは公聴会を目撃し、電子商取引の価格戦争は再び激化するだろう

1. 米国議会はフェイスブックのIPO初日の失敗について公聴会を開く予定北京時間6月15日朝のニュー...

画像の最適化により、ウェブサイトのランキングは依然として伝説的なものとなるでしょうか?

キーワードランキングのみに重点を置き、コンテンツ(画像)の最適化を無視する企業ウェブサイトが増えてお...

myserverplanet-3.59 USD/1G RAM/40G HDD/1T トラフィック

Hostcat は、myserverplanet のボスから特別な VPS を受け取りました。1G ...

ブロックチェーンと分散型台帳技術は同じものですか?

ビットコインに代表される暗号通貨の台頭に伴い、「ブロックチェーン」という概念も話題になっています。し...

共同購入企業上位5社が市場シェアの80%を占めている。第2ラウンドの再編が迫っている。

全体の売上から判断すると、国内の共同購入業界は依然として活況を呈している。しかし、これはすべての共同...

KDD 2022 アワード発表!アリババが最優秀論文賞を受賞、中国企業が受賞するのは初めて

8月18日、世界最高峰のデータサイエンスカンファレンス「KDD 2022」の受賞者が発表されました。...

TARS Foundation: オープンソースのマイクロサービス エコシステムの構築

[[318600]]導入 1960 年代と 1970 年代には、ソフトウェア開発者は、通常、メインフ...

豆板の商業的救済:「製品」同盟

Douban は成功した製品であると同時に、失敗した製品でもあります。 Douban がユーザー エ...

Zookeeper における Kafka のデータ構造を完全に説明する図

[[421933]] kafka_2.8.0 より前では、kafka を実行するには依然として zo...