この記事は、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 |
<<: 三国競争は単なる表面的な現象なのでしょうか?国内パブリッククラウド市場は活況を呈している
>>: [分散] リソースとトランザクション: 可観測性の基本的な二重性
インターナショナル・データ・コーポレーション(IDC)が発表した最新の「中国パブリッククラウドサービ...
[[332941]] JVMの内部キャッシュとは何ですかネイティブJava HashMap のチェー...
IT ブログ界の伝説である Moonlight Blog は、単なるシンプルなブログです。どのように...
2012年10月20日、かつては共同購入サイトのトップ5に入っていた、もう一つの大手共同購入サイト「...
LBXU#罗罗データ据は現在、メーデーの爽やかな夏のイベントを推進しており、月払いの場合は20%オフ...
以前、今年リリースされた webdock を紹介しました。LXC 仮想 VPS、大容量メモリ、マルチ...
最近の調査によると、クラウド コンピューティング サービスとクラウド セキュリティの脅威が大幅に増加...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています現代人の車...
優秀な SEO プロジェクト マネージャーになるのは、依然として非常に困難です。これには、プロジェク...
8月24日、2018年雲啓会議重慶サミットで、アリババクラウド社長胡暁明氏は、同社がスマート交通、ス...
外部リンク担当者は、もともとフォーラム、ブログ、Baidu 製品にのみ外部リンクを構築していました。...
7月5日、正式に商用化されてから10周年を迎え、Alibaba Cloud RDSデータベースが大幅...
最近、当社のウェブサイトに問題が発生しています。落ち着いてウェブサイトのデータ分析を行ったところ、ユ...
Dogyun は労働者の日のために特別なイベントを開催しました。ラッキーホイールでは、毎日コード、ト...
2014 年 3 月 20 日、これまで非常に高いランキングを獲得していた多くの Web サイトが突...