この記事は、Brian Goff 氏が執筆した WeChat パブリック アカウント「Cloud Native Lab」から転載したものです。この記事を転載する場合は、Cloud Native Lab 公式アカウントまでご連絡ください。 Kubernetesバージョン1.20ではdockershimのサポートが廃止され、デフォルトのコンテナランタイムとしてContainerd[1]に置き換えられました。この記事では、Containerd の「shim」インターフェースについて紹介します。 各 Containerd または Docker コンテナには、対応する「shim」デーモンがあり、Containerd がコンテナの基本的なライフサイクル (開始/停止) の管理、コンテナ内での新しいプロセスの実行、TTY のサイズ変更、その他のプラットフォーム固有の操作に使用する API を提供します。 shim のもう 1 つの機能は、コンテナの終了ステータスを Containerd に報告することです。 Shim は、コンテナの終了ステータスが Containerd によって収集されるまで存在します。これはゾンビ プロセスと非常によく似ています。ゾンビ プロセスは親プロセスによってリサイクルされるまで存在し続けます。ただし、ゾンビ プロセスはリソースを占有しませんが、シムはリソースを占有します。 Shim は Containerd プロセスをコンテナのライフサイクルから分離します。具体的には、runc はコンテナを作成して実行した後に終了し、shim をコンテナの親プロセスとして使用します。 Containerd プロセスがクラッシュしたり再起動したりしても、コンテナには影響はありません。これを実行することの利点は明らかです。実行中のコンテナに影響を与えることなく、Containerd をアップグレードまたは再起動できます。 Dockerの--live-restore[2]機能も同様の機能を実装しています。 containerd はどのような shim をサポートしていますか?Containerd によって現在公式にサポートされている shim のリストは次のとおりです。 io.containerd.runtime.v1.linuxio.containerd.runtime.v1.linux は、Containerd 1.0 より前に設計されたオリジナルの shim API および実装 v1 です。この shim は runc を使用してコンテナを実行し、cgroup v1 のみをサポートします。現在、v1 shim API は非推奨となっており、Containerd 2.0 では削除される予定です。 io.containerd.runc.v1io.containerd.runc.v1 は実装が io.containerd.runtime.v1.linux に似ていますが、唯一の違いは v2 shim API を使用することです。 shim は依然として cgroup v1 のみをサポートしています。 io.containerd.runc.v2この shim は実装が v1 と完全に異なり、cgroup v1 と v2 の両方をサポートする v2 shim API を使用します。 shim プロセスは、Kubernetes の CRI 実装で複数のコンテナを実行するために使用され、1 つの Pod で複数のコンテナを実行できます。 io.containerd.runhcs.v1これは、Windows の HCSv2 API を使用してコンテナーを管理する Windows プラットフォーム用のシムです。 もちろん、公式にサポートされている shim に加えて、誰でも独自の shim を作成し、Containerd にその shim を呼び出させることもできます。 Containerd は、呼び出されると shim の名前をバイナリに解決し、$PATH でバイナリを検索します。たとえば、io.containerd.runc.v2 はバイナリ ファイル containerd-shim-runc-v2 に解析され、io.containerd.runhcs.v1 はバイナリ ファイル containerd-shim-runhcs-v1.exe に解析されます。クライアントは、コンテナを作成するときに使用する shim を指定できます。 shim が指定されていない場合は、デフォルトの shim が使用されます。 使用する shim を指定する例を次に示します。 パッケージメイン ⚠️注: WithRuntime は 2 番目のパラメーターとして interface{} を受け取るため、任意の型を shim に渡すことができます。 shim がこのタイプのデータを認識し、タイプが typeurl パッケージに登録されて正しくエンコードされることを確認してください。 各 shim には、コンテナーごとに個別に構成できる、サポートされている構成オプションのセットが独自に用意されています。たとえば、io.containerd.runc.v2 は、コンテナの stdout/stderr を別のプロセスに転送したり、shim を実行するためのカスタム cgroup を設定したりすることができます。コンテナの実行時にカスタム オプションを追加するためのカスタム シムを作成できます。一般に、shim API は、shim を作成/削除するための RPC といくつかのバイナリ呼び出し、および Containerd プロセスへのバックチャネルで構成されます。 独自の shim を実装したい場合は、次のリソースを参照してください。
インターフェースを実装するだけで、残りの作業は shim.Run が処理します。 shim で注意すべき重要な点はメモリ使用量です。各コンテナには shim プロセスがあり、コンテナの数が増えると shim のメモリ使用量が大幅に増加するためです。 shim APIはprotobufで定義されており、gRPC APIに少し似ていますが、実際にはshimはttrpc[6]と呼ばれるカスタムプロトコルを使用しており、gRPCと互換性がありません。 ttrpc は、メモリ使用量を抑えるために設計された生の RPC プロトコルです。 コンテナを作成するためのRPC呼び出しプロセスContainerd にはコンテナ オブジェクトがあります。コンテナ オブジェクトを作成すると、コンテナ関連のデータが作成され、そのデータがローカル データベースに保存されるだけで、システム内でコンテナは起動されません。コンテナ オブジェクトが正常に作成された後、クライアントはコンテナ オブジェクトからタスクを作成し、shim API を呼び出します。 RPC 呼び出しの全体的なフローは次のとおりです。
shim のもう 1 つの重要な部分は、TaskCreateTaskStart、TaskDelete、TaskExit、TaskOOM、TaskExecAdded、TaskExecStarted、TaskPaused、TaskResumed、TaskCheckpointed などのコンテナ ライフサイクル イベントを containerd に返すことです。タスクの詳細な定義については[7]を参照してください。 要約するContainerd は、shim を通じて、基盤となるコンテナ ランタイムにプラグ可能な機能を提供します。これは Containerd を使用してコンテナを管理する唯一の方法ではありませんが、組み込みの TaskService は現在この方法を使用しており、Kubernetes も shim を使用して CRI を呼び出して Pod を作成します。これは、シム アプローチが非常に人気があることを示しています。 Containerdのスケーラビリティを強化して、より多くのプラットフォームや仮想マシンベースのランタイム(firecracker[8]、kata[9])をサポートできるだけでなく、他のshim実装(systemd[10])を試すことも可能になります。 参考リンク[1]コンテナド: https://containerd.io/ [2]--ライブリストア: https://docs.docker.com/config/containers/live-restore/ [3](v2) shim RPC APIの詳細な定義: https://github.com/containerd/containerd/blob/v1.5.8/runtime/v2/task/shim.proto [4] shimバイナリとRPC APIを実装するためのヘルパーツール: https://github.com/containerd/containerd/blob/89370122089d9cba9875f468db525f03eaf61e96/runtime/v2/shim/shim.go#L181-L194 [5] shimの使い方: https://github.com/containerd/containerd/blob/v1.5.8/cmd/containerd-shim-runc-v2/main.go [6]ttrpc: https://github.com/containerd/ttrpc [7] タスクの詳細な定義: https://github.com/containerd/containerd/blob/v1.5.6/api/events/task.proto [8] ファイヤークラッカー: https://github.com/firecracker-microvm/firecracker-containerd/tree/main/runtime [9]kata: https://github.com/kata-containers/kata-containers/tree/2.3.0/src/runtime [10]systemd: https://github.com/cpuguy83/containerd-shim-systemd-v1 |
<<: 三国競争は単なる表面的な現象なのでしょうか?国内パブリッククラウド市場は活況を呈している
>>: [分散] リソースとトランザクション: 可観測性の基本的な二重性
[要約] インターネットビジネスの収益貢献度という点では、検索エンジンは他のメディアやソーシャルネッ...
Baidu のホームページで上位にランクインしたい場合、ウェブサイトのランキングを向上させるためにい...
段階的かつプロセス指向の方法でインターネット パーソナル ブランドを構築したい場合は、次の 9 つの...
背景分散アーキテクチャでは、一意のシリアル番号を生成することは、特にデータベースがシャーディングを使...
急速に発展するテクノロジー分野において、クラウド コンピューティングはますます重要な役割を果たしてい...
月額 10 ドルの KVM は、午前 2 時 30 分に起動し始めました。全体的に、あまり理想的では...
3か月後、QQはTencentによって恥ずかしげもなくアップグレードを強制されました。バージョンはQ...
ハイブリッド クラウド戦略を採用している企業はいくつありますか?いくつかの統計を調べてみましょう。統...
近年、ブログの台頭と電子商取引サイトの急速な発展により、オンラインプロモーション方法の 1 つである...
launchvps のクリスマス プロモーションはまだ有効です: ペンシルバニア データ センター、...
Zhihuにとって、ライブ放送モードを開始することで、より多くのコンテンツクリエイターを集め、ユーザ...
locvps は国慶節イベントを開催しました。ヨーロッパ地域の VPS は直接 40% 割引されます...
SEO トレーニングは現在すでに非常に人気があります。インターネット初心者で SEO でお金を稼ぎた...
現状では、ウェブサイト最適化の目的の一つは、企業製品の販売促進や企業ブランドの宣伝を目的としたいわゆ...
北京ビジネスデイリー(記者 江夢偉)現在、ウェブサイトやその他の配信チャネルでは音楽の著作権侵害が依...