この記事は、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 |
<<: 三国競争は単なる表面的な現象なのでしょうか?国内パブリッククラウド市場は活況を呈している
>>: [分散] リソースとトランザクション: 可観測性の基本的な二重性
これまで、ビリビリの香港上場については何度か噂が流れており、最も古いものは2017年7月に遡り、調達...
H5の作り方は?職場での具体的な実践から得た私の考えやアイデアに基づき、事例と組み合わせて、H5 の...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス新浪微博から騰訊微博への...
垂直検索の市場はあるのでしょうか?垂直検索の市場があるかどうかは、批評家の主観的な判断ではなく、市場...
クラウド コンピューティングは、IaaS、PaaS、SaaS の 3 つの層に分かれています。多くの...
「女が三人いれば芝居がうまい」という古い諺があります。女性はおしゃべりが上手で、話題を見つけるのが得...
spinserversから最新ニュースを受け取りました:中国市場を拡大するために、「Alipay」と...
SEO に関する独立したブログといえば、まず思い浮かぶのは ZAC の「SEO Daily Post...
スーパーユーザーの時代、一言で言えば「高価」です。ユーザーは高価であり、チャネルは高価であり、製品の...
クラウドへの移行には多大なコストもかかり、企業が求めている価値を実際に得るためには、ワークロードの一...
近年、地方のウェブサイトが盛んになり、全国規模のウェブサイトも積極的に設立され、地方支部が開設される...
40年前、中国のマーケティング業界は新聞やテレビの広告から始まり、広告を出す余裕のあるブランドはほん...
ちょうど今、ウェブマスターの情報に注目していたところ、Baiduが新たな発表を出したことを知りました...
12年の歴史を誇るIDCのBalticserversが、6か月間、VPSを通常価格の10%割引で提供...
どの海外VPSを選択すればよいですか?使いやすい海外VPSはどれですか?どの海外VPSをお勧めします...