K8S の汚染と耐性を 5 分で理解する

K8S の汚染と耐性を 5 分で理解する

K8S では、ポッドがノード上の汚れを許容できる場合、そのポッドをそのノードにスケジュールできます。許容できない場合は、ノードをスケジュールできません。汚れと寛容さは恋する若いカップルのようなものです。双方とも喜んで応じます。少女は少年の欠点を知っていますが、一緒に暮らすためにそれを我慢することを選びます。女の子が男の子の欠点を許容できないなら、一緒に暮らすことはできない。

1. 理論

1.1.汚染と寛容の概念

  • テイント: ノード上で定義され、ポッドがそのノード上でテイント許容度を持たない限り、そのノードにポッドがスケジュールされることを拒否するために使用されます。 Taint でマークされたノードは障害のあるノードではありません。
  • 許容範囲: Pod 上で定義され、Pod が許容できるノード テイントを構成するために使用されます。 K8S スケジューラは、ポッドが許容できる汚染を持つノードにのみポッドをスケジュールできます。
  • スケジュール例図:

1.2.除外レベル

Pod オブジェクトのノード除外には 3 つのレベルがあります。

  • NoSchedule: この汚染許容度が設定されていない新しいポッドはこのノードにスケジュールできず、ノード上の既存のポッドは影響を受けません。
  • PreferNoSchedule: この汚染許容度が設定されていない新しいポッドは、可能な限りこのノードにスケジュールしないでください。適切なノードが見つからない場合でも、このノードにスケジュールされます。
  • NoExecute: この汚染許容度が設定されていない新しい Pod オブジェクトはこのノードにスケジュールできず、ノード上の既存の Pod は削除されます。

1.3.許容差演算子

Pod で許容範囲を定義する場合、Equal と Exists の 2 つの演算子がサポートされます。

  • 等しい: 許容値と汚染は、キー、値、効果において完全に一致する必要があります。
  • 存在する: 許容値と汚染はキーと効果の両方で完全に一致する必要があり、許容値の値フィールドには空の値を使用する必要があります。

1.4 使用方法

テイントはノードの nodeSpec で定義され、許容範囲はポッドの podSpec で定義されます。

汚染と許容範囲はどちらもキーと値のペアの形式ですが、除外レベル (効果) タグが追加されます。

構文の形式は「key=value:effect」です。

1.5.使用シナリオ

1. 排他ノード

  • 特定のポッドで使用するためにいくつかのノードを割り当てる場合は、ノードにテイントを追加してから、対応する許容値を特定のポッドに追加できます。
  • クラスター内の一部のマシンは、優れた CPU パフォーマンスと大容量のメモリを備えたマシンなど、特殊な場合があります。通常のポッドがこれらの特別なノードを占有することは望ましくありません。私たちは、汚染と寛容を通じてこの問題を解決できます。

2. ポッドの排除

上記は、Node による Pod の除外の 3 つのレベルを定義します。ノードに定義された除外レベルが NoExecute の場合、この汚染許容度が設定されていない Pod は削除されます。

K8S は、問題のあるノードを自動的に識別するためにテイントも使用します。たとえば、ノードのメモリが不足すると、ノード コントローラーは自動的にノードに汚染情報を追加し、除外レベルとして NoExecute を使用します。現時点では、このような汚染耐性を設定していない Pod は削除されます。

DaemonSet コントローラーは、重要な Pod をノードにデプロイできるように、このような汚染を無視します。

現在、以下のような多くの汚れが組み込まれています。

  • node.kubernetes.io/not-ready: ノードの準備ができていません
  • node.kubernetes.io/unreachable: ノードに到達できません
  • node.kubernetes.io/memory-pressure: ノードのメモリ領域がいっぱいです。
  • node.kubernetes.io/disk-pressure: ノードのディスク容量がいっぱいです。
  • node.kubernetes.io/network-unavailable: ノード ネットワークが利用できません。

2. 実際の戦闘

2.1.ノード汚染の管理

ノードに汚染を追加します。

 kubectl taint nodes node01 key=value:effect

ノードから汚染を削除します。ここでの効果は存在しない可能性があります。

 kubectl taint nodes node01 key[:effect]-

2.2.ポッド許容度の管理

前述のように、許容演算子には Equal と Exists の 2 種類があり、除外レベルも追加する必要があります。

平等なシナリオを使用する:

 tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoExecute"

Exists を使用するシナリオ:

 tolerations: - key: "key" operator: "Exists" effect: "NoExecute"

ノード上の汚染の除外レベルが NoExecute の場合、ノード上で実行されている Pod は汚染に対する許容度がない場合は直ちに排除されます。ただし、システムはポッドの排出を遅らせるために toleranceSeconds フィールドを追加します。

tolerationSeconds フィールドの意味は次のとおりです。Pod の許容設定に NoExecute の除外レベルがあり、属性 tolerationSeconds の値が指定されている場合、Pod はノード上で一定期間 (秒単位) 実行を継続できます。

 tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoExecute" tolerationSeconds: 3600

2.3 具体的な操作

2.3.1、予備知識

  • ノードラベルを確認します。ラベルはキー値データ形式です。
 kubectl get nodes --show-labels
  • ノードラベルを追加します。たとえば、キーを special-app 、値を specialwebapp に設定します。
 kubectl label node k8s-worker-2 special-app=specialwebapp

  • ノード汚染ステータスを確認する

ノードの汚染ステータスを確認します。 Taints 列が none になっていることがわかり、ラベルのステータスも確認できます。

 kubectl describe node k8s-worker-2

2.3.2.実例プロセス

ステップ

  1. k8s-worker-2 などの K8S ノードの場合、ノードにはラベルが付きます。 Pod はラベルに従って k8s-worker-2 にスケジュールされ、スケジュールは成功します。
  2. k8s-worker-2 に taint を追加すると、Pod のスケジューリングが失敗します。
  3. Pod に対してこのステインの許容値を設定すると、スケジュールが成功します。
  4. ノードの汚染を削除し、許容値を削除すると、デプロイメントは成功します。

操作プロセス

  • 染色の定着
kubectl taint nodes k8s-worker-2 question-node=broken-disk:NoSchedule

  • Pod をデプロイすると、許容度のない Pod は常に Pending 状態にあることがわかります。 Pod の説明を確認すると、理由も示されます: スケジュールが失敗した、ノードが汚染されている、Pod に許容度がない。

  • Podの許容範囲を設定し、正常にデプロイする

  • 汚染を削除し、許容範囲を削除して、正常にデプロイします
kubectl taint nodes k8s-worker-2 question-node-

完全な yaml ファイル:

 apiVersion: v1 kind: Pod metadata: name: webapp namespace: demo labels: app: webapp spec: nodeSelector: # 选择调度到具有这个label的节点"special-app": "specialwebapp" # kubernetes.io/hostname: k8s-worker-2 tolerations: - key: "question-node" operator: "Equal" value: "broken-disk" effect: "NoSchedule" containers: - name: webapp image: nginx ports: - containerPort: 80

要約する

K8S では、ポッドがノード上の汚れを許容できる場合、そのノードにポッドをスケジュールできます。許容できない場合は、ノードをスケジュールできません。

<<:  Kubernetes の Pause コンテナとは何ですか?

>>:  5 つのステップで Spring Boot サービスを Kubernetes に移行する

推薦する

ウェブサイトの最適化: 考え方を変えて、質の高いトラフィックを獲得する方法を学びましょう

営業に携わることが多い従業員は、顧客の認知度を高めて注文を迅速に獲得するためには、製品の機能や用途、...

#米国サーバー# フェニックスの最高級コンピュータールーム。サーバー割引も超格安。強くお勧めします

最近、米国アリゾナ州で最高に素晴らしいコンピュータ ルームを見つけました: phoenixnap.c...

リンク交換に関する包括的な理解

リンク交換は、友好リンクまたは相互リンクとも呼ばれます。このようなリンクはリソースを補完することがで...

ウェブサイトテンプレートの最適化テストの詳細分析

最適化におけるテンプレートの役割: テンプレートは、Web サイトのコンテンツのレイアウトと Web...

LetBox-$20/X3440/8G メモリ/500g ハードディスク/100M 無制限/シアトル

Letbox は特別価格で複数のサーバーをリリースしました。元の価格は月額 30 米ドルと非常に安い...

totyun: 香港データセンターCN2回線VPS評価、3ネットワークバックホールCN2、ウェブサイト構築にはかなり良いはずです

新商人totyunの香港VPSは、CN2回線と国際回線の2種類に分かれています。まずはHost Ca...

ギフトウェブサイトがホリデーマーケティングにドリフトボトルをどのように活用しているかについて簡単に説明します

QQドリフトボトルは、QQメールボックス内のこの小さなゲームがしばらくの間人気を博しました。最初は誰...

Baidu の重みをどのように改善できますか?

サードパーティのウェブマスターツールにおける「Baidu の重み」の提供に関する声明: Baidu ...

Google の公式最適化提案: 動的 URL と静的 URL

コアヒント: これは中国のウェブマスターのブログからの最適化記事です。多くの検索最適化の達人が語る最...

コンテナを本番環境で実行するための 6 つの注意事項と管理方法

コンテナ技術によりアプリケーションのパッケージ化が非常に簡単になり、コンテナは将来最も主流の展開方法...

モノのインターネットとビッグデータ、クラウドコンピューティング、産業用モノのインターネットについて

私たちの時代は急速に発展しています。モノのインターネット、ビッグデータ、クラウドコンピューティングな...

企業はインターネットマーケティング業務の KPI 評価を策定すべきでしょうか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています多くの企業...

米国ロサンゼルス Unicom as9929 回線の tmhhost VPS の簡単なレビュー

tmhhostは11月にロサンゼルス聯通AS9929ハイエンドラインでVPS(クラウドサーバー)を開...

ASO戦略について議論し、適切なキーワードを選択する

アプリに適切なキーワードを選択することは、成功を達成するための重要なステップです。残念ながら、この困...