この記事は、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 |
<<: 三国競争は単なる表面的な現象なのでしょうか?国内パブリッククラウド市場は活況を呈している
>>: [分散] リソースとトランザクション: 可観測性の基本的な二重性
GigsGigsCloudは、香港VPSの新シリーズ「CLOUDLET V*」を発表しました。KVM...
2012 年は Baidu にとって激動の年でした。このような混乱を経験した後、私たち草の根ウェブマ...
ビジネスを始めることは、インターネット業界で働く多くの人が抱いたことがあるアイデアです。良いプロジェ...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますさまざまな...
[51CTO.com オリジナル記事] 6月7日と8日の「大学入試戦争」が全国を席巻した。候補者は全...
NetEase Youdao Search は本日改訂されました。社内コード名「Tanggula」の...
新規事業であるmaxkvm(今年5月設立)は、米国(ロサンゼルス、ダラス、ニューヨーク)、オランダ(...
2012 年は魔法の数字です。それは世界の終わりと SEOER の終わりが予測されています。 SEO...
ExtraVM は、日本 VPS (東京) を含む複数のデータセンターで VPS サービスを提供して...
奇妙な停電、私の Wi-Fi に何が起こったのでしょうか?新たな商品が倉庫に到着し、阿珍にとってまた...
国が新たなインフラ戦略を継続的に推進するにつれ、国内の5Gネットワーク構築は急速な発展段階に入っ...
A5 Webmaster Network (www.admin5.com) は5月22日に次のように...
正直に言うと、123systems の openvz はあまり理想的ではありません。 過剰販売などの...
飲食業界のリーダーとして、海底撈は話題に事欠かない。例えば、先日発表された「2019年胡潤世界長者番...
solidseovps(2009年設立)は、Linux、MacOS、WindowsのVPS事業をメイ...