[再投稿] Kubernetesポッドの作成プロセスを示す

グラフィカルなkubernetesポッド作成プロセスの大きな秘密

https:// www.kubernetes.org.cn/6766.html

 

kubernetesでのコンテナの作成は、間違いなく複雑なプロセスであり、さまざまな内部コンポーネントの統合コラボレーションや、外部CRIランタイムとのドッキングが含まれます。この記事では、コンテナ作成プロセスのさまざまな詳細を探索し、さまざまなコンポーネントのコラボレーションプロセスを理解しようとしています。したがって、フォローアップに問題がある場合は、少し方向を確認できる場合があります。

1.基礎工事

1.1コンテナ管理スレッドモデル

image.pngkubeletのスレッドモデルは、master / wrokerモデルに属しています。単一のマスターを介してさまざまなイベントソースを監視し、各ポッドがゴッドルーチンを作成して、ポッドのビジネスロジックを処理します。マスターとブローカーは、状態パイプラインを介して通信します

1.2イベント駆動型の最終的な整合性

image.pngyamlを介してポッドを作成した後、kubernetesは現在のイベントと現在のポッドの状態に従って調整を続け、最終的なターゲット状態の一貫性を実現します

1.3コンポーネントのコラボレーションプロセス

image.pngkubeletの構造宣言は最大300行を超えるコードで、その複雑さを示していますが、コンテナーに従ってこのプロセスを作成し、コアプロセスを観察します。実際には、kubelet、containerRuntime、CRIコンテナーランタイムの3つの部分に要約できます。

2.Kubeletコンテナー作成プロセス

image.png

2.1アドミッションチェック用のポッドの取得

kubeletのイベントソースには主に2つの部分が含まれます:静的ポッドとApiserver、ここでは通常のポッドのみを考慮し、管理のためにPodManagerにポッドを直接追加し、アドミッションチェックを実行します

アドミッションチェックには、主に2つの主要なコントローラーが含まれます。エビクション管理と事前選択チェックエビクション管理は、主に現在のリソースプレッシャーに基づいて、対応するポッドが現在のリソースプレッシャーを許容するかどうかを検出します。事前選択チェックは、現在アクティブなコンテナーと現在のノードに基づいています。アフィニティチェックなど、現在のポッドの基本的な動作環境を満たしているかどうかを確認するための情報。現在のポッドの優先度が特に高い場合、または静的なポッドの場合は、リソースのプリエンプトを試み、QOSレベルに従ってグレード付けされます。動作環境を満たすための優先権

2.2イベントパイプラインとコンテナ管理のメインスレッドを作成する

kubeletは、新しく作成されたポッドを受信すると、最初にそのポッドのイベントパイプラインを作成し、コンテナー管理のメインスレッドを開始してパイプラインのイベントを消費し、最後の同期時間(ローカルから)に基づいて現在のkubeletの最新のイベントを待ちますpodCacheから取得)、新しく作成されたポッドの場合、主にPLEGの更新時間操作を介して行われ、ブロードキャストのデフォルトの空の状態が最新の状態として使用されます。

2.3最新のステータスを同期する

イベントソースから取得した最新のステータス情報とポッド情報がローカルのpodCacheから取得されると、statusManagerおよびprobeManagerのポッド内のコンテナーの現在のステータスと連動して更新され、現在認識されている最新のポッドステータスが取得されます

2.4アクセス制御検査

前の承認チェックは、ポッドが実行するリソースのハード制限のチェックであり、ここでの承認チェックは、コンテナランタイムと一部のソフトウェア動作環境チェックのバージョンであるソフト状態です。チェックがここで失敗すると、対応するコンテナのステータスについて話しますブロックに設定

2.5コンテナのステータスを更新する

承認チェックに合格した後、statusManagerが呼び出されて、最新のPOdステータスを同期します。これは、apiserverと同期される場合があります

2.6 Cgroup設定

更新が完了すると、PodCOntainerManagerが起動します。主な機能は、QOSレベルに従って対応するポッドのCgroup設定を更新することです。

2.7ポッド基本運用環境の準備

次に、kubeletは、ポッドデータディレクトリの作成、ミラーキーの取得、ボリュームマウントの完了の待機などを含む、ポッド作成のための基本的な環境を準備します。ポッドデータディレクトリの作成は、主にポッド、プラグイン、ボリュームディレクトリ、およびキー情報は、ポッド構成のイメージプルキーを介して生成されます。kubeletによるコンテナーの作成作業は、基本的にこの時点で完了しています。

3.ContainerRuntime

image.png前に、ポッドに対する操作はイベントと状態の同期に基づいて最終的に完了すると説明しました。ContainerRUntimeは、対応するイベントが作成操作か更新操作かを区別せず、現在のポッド情報をターゲット状態と比較するだけです。ターゲット状態に到達するための対応する操作を構築するには

3.1ポッドコンテナーの変更を計算する

計算コンテナーの変更には、主に次のものが含まれます:ポッドのサンドボックスが変更されたかどうか、短い宣言サイクルコンテナー、初期化コンテナーが完了し、ビジネスコンテナーが完了しました。それに応じて、いくつかの対応するコンテナーのリストを取得します。強制終了する必要があるコンテナーのリスト、必要性開始されたコンテナーのリスト。最初のコンテナーが完了していない場合、実行するビジネスコンテナーは、開始する必要のあるコンテナーのリストに追加されません。この場所は2つの段階にあることがわかります

3.2初期化に失敗し、終了しようとしました

以前の初期化コンテナーの失敗が以前に検出された場合、現在のポッドのすべてのコンテナーとサンドボックスに関連付けられているコンテナーをチェックします。実行中のコンテナーがある場合、それらはすべてKill操作を実行し、操作が完了するまで待機します

3.3不明な状態のコンテナの補償

いくつかのポッドコンテナーが既に実行されているが、それらのステータスがまだ不明である場合、この場所で統合プロセスが実行され、すべてが強制終了され、次の再起動のためにクリーンアップされます。ここで、3.2はブランチのみを実行します、しかし、中心的な目標は、失敗したか、ステータスを取得できないコンテナをクリーンアップすることです

3.4コンテナサンドボックスを作成する

ポッドコンテナを開始する前に、まずサンドボックスコンテナが作成されます。現在のポッドのすべてのコンテナは、ポッドに対応するサンドボックスと同じネームスペースを共有して、ネームスペース内のリソースを共有します。サンドボックスの作成はより複雑で、後で紹介します。

3.5ポッド関連のコンテナーを起動する

ポッドコンテナーは現在、3つのカテゴリに分類されます:短ライフサイクルコンテナー、初期化コンテナー、ビジネスコンテナーです。起動シーケンスも左から右です。コンテナーの作成が失敗した場合、コンテナーの作成はバックオフメカニズムによって遅延されます。ここでcontainerRuntimeの下でコンテナーを開始するプロセスを紹介しましょう

3.5.1コンテナイメージがプルされているかどうかを確認する

イメージのプルは、最初に対応するコンテナーイメージをスプライスし、次に、以前に取得したプルのキー情報とイメージ情報をCRIランタイムに渡して、基になるコンテナーイメージをプルします。もちろん、ここにはさまざまなバックオフがあります。 kubeletのパフォーマンスに影響を与える頻繁なプルエラーを回避するメカニズム

3.5.2コンテナ構成の作成

コンテナー構成の作成とは、主にコンテナーの操作に対応する構成データを作成することで、主に次のものが含まれます:Podホスト名、ドメイン名、マウントされたボリューム、configMap、シークレット、環境変数、マウントされたデバイス情報、マウントされるディレクトリ情報、ポートマッピング情報、環境に応じて生成および実行されるコマンド、ログディレクトリ、その他の情報

3.5.3 runtimeServiceを呼び出してコンテナーの作成を完了する

runtimeServiceを呼び出してコンテナー構成情報を渡し、CRIを呼び出し、最後にコンテナーの作成インターフェースを呼び出してコンテナーの状態を完了します

3.5.4 runtimeServiceを呼び出してコンテナーを開始する

以前に作成されたコンテナーによって返されたコンテナーIDを使用して、対応するコンテナーを開始し、コンテナーの対応するログディレクトリを作成します。

3.5.5コンテナのコー​​ルバックフックを実行する

コンテナーがPostStartフックで構成されている場合、対応するフックがここで実行されます。フックタイプがExecクラスの場合、CNIのEXIインターフェースが呼び出され、コンテナーでの実行が完了します

4.サンドボックスコンテナを実行する

image.png

4.1サンドボックスイメージのプル

まず、サンドボックスの画像を取得します

4.2サンドボックスコンテナを作成する

4.2.1アプリケーションSecurityContext

コンテナーが作成される前に、コンテナーSecurityContextの構成は、主に特権レベル、読み取り専用ディレクトリ、実行中のアカウントグループなどの情報を含むSecurityContextの割り当て情報に従って構成されます。

4.2その他の基本情報

SecurityContextのアプリケーションに加えて、切断、OOMScoreAdj、Cgroupドライバーなどの情報をマップすることもできます。

4.3コンテナを作成する

上記のさまざまな構成情報に従って、コンテナを作成します

4.3チェックポイントを作成する

チェックポイントは、主に現在のサンドボックスの設定情報をシリアル化し、現在のスナップショット情報を保存することです

4.4サンドボックスコンテナを起動する

サンドボックスコンテナーが開始されると、StartContainerが直接呼び出され、以前に作成されたコンテナーによって返されたIDが渡されてコンテナーの開始が完了し、コンテナーをオーバーライドするDNS構成ファイルがこの時点で上書きされます。

4.5コンテナのネットワーク設定

コンテナーのネットワーク構成は、主にCNIプラグインを呼び出してコンテナーネットワークの構成を完了することです。

5.ポッドコンテナーの起動の概要

image.pngKubeletは、コンテナ管理の中心的なハウスキーパーです。さまざまなアドミッションコントロール、ステータス管理、検出管理、ボリューム管理、QOS管理、およびCSIドッキングの統合スケジューリングを担当します。また、ランタイムランタイムの基本データを準備し、ポッドの現在の状態をフィードバックします最新の状態のimage.pngランタイムレイヤーは、kubeletによって組み立てられたデータを使用して、CRIランタイムのターゲット構成とkubeletによって管理されるリソース構成情報に従ってリソースを再編成し、ポッドコンテナーの状態に従ってコンテナーの開始と停止、作成、その他の操作を決定します。コンテナーの基本構成環境の構築を完了し、最後にCRIを呼び出してコンテナーの作成を完了します。CRIが実行されると、渡されたさまざまなデータについて話し合い、さらに結合してホストに適用し、対応する名前空間リソースの制限に従います。独自のコンテナーサービスデータを整理し、コンテナーサービスを呼び出してコンテナーの最終的な作成を完了します

この記事はベーシックバージョンであり、今後もこのバージョンにさまざまな詳細を重ねていく予定です。興味のある友人がサポートしてくれます。ありがとうございます。

電子書籍のアドレスを読むk8sソースコード:https ://www.yuque.com/baxiaoshi/tyado3 

おすすめ

転載: www.cnblogs.com/jinanxiaolaohu/p/12503273.html
おすすめ