Kubernetes コンテナ ランタイム インターフェース CRI

Kubernetes コンテナ ランタイム インターフェース CRI

私はずっと前に掘った穴を埋めるためにこの記事を書きました[1]。

この記事で取り上げるコンポーネントのソース コード バージョンは次のとおりです。

  • Kubernetes 1.24
  • 0.25.0 演色評価数
  • コンテナ 1.6

コンテナ ランタイムは、コンテナの管理と実行を担当するコンポーネントです。コンテナ イメージをホスト上で実行される実際のコンテナ プロセスに変換し、イメージ管理、コンテナ ライフサイクル管理、リソース分離、ファイル システム、ネットワーク構成などの機能を提供します。

写真

一般的なコンテナ ランタイムには、さまざまなレベルの機能とパフォーマンスを提供する次のものがあります。ただし、それらはすべて Container Runtime Interface (CRI) に準拠しているため、Kubernetes またはその他のコンテナ オーケストレーション システムと統合してコンテナをスケジュールおよび管理できます。

  • コンテナ[2]
  • クリオー[3]
  • Dockerエンジン[4]
  • ミランティスコンテナランタイム[5]

CRI を使用すると、Kubernetes を再コンパイルせずに、複数のコンテナ ランタイムを「自由に」切り替えることもできます。簡単に言えば、CRI はコンテナ上のすべての操作を定義し、コンテナ オーケストレーション システムとコンテナ ランタイム間の標準インターフェイスとして存在します。

CRIの過去と現在

写真

CRIはKubernetes 1.5[6]で初めて導入され、最初のバージョンはv1alpha1でした。これまで、Kubernetes は kubelet ソース コードで各コンテナ ランタイムのサポートを維持する必要がありました。

CRI を使用する場合、kubelet で CRI をサポートするだけで、中間層の CRI shim (grpc サーバー) を介してコンテナ ランタイムと対話できます。現時点では、さまざまな企業のコンテナ ランタイム実装がまだ CRI をサポートしていないためです。

昨年リリースされたKubernetes 1.24では、Dockershim[7]が正式に削除され、ランタイムとのやり取りが簡素化されました。

Kubernetes は現在、CRI の v1alpha2 と v1 をサポートしています。 v1 バージョンは Kubernetes 1.23 で導入されました。

kubelet が起動するたびに、最初に v1 API を使用してコンテナ ランタイムに接続しようとします。それが失敗した場合は、v1alpha2 を試します。

Kubelet と CRI

これまで行ってきたkubeletソースコード分析[8]では、ファイル、apiserver、httpからの変更を継続的に監視し、ポッドのステータスを更新します。その記事を書いたとき、分析はここで終了していました。この後の作業はコンテナランタイム[9]に引き渡され、サンドボックスと各種コンテナの作成と操作が完了します。`kubeGenericRuntimeManager#SyncPod()`[10]を参照してください。

kubeletが起動すると、CRIクライアント[11]を初期化し、コンテナランタイムとの接続を確立し、CRIのバージョンを確認します。

ポッド作成プロセス中、CRI はコンテナ ランタイムと対話します。

  • サンドボックスの作成
  • コンテナを作成する
  • 画像をプルする

参照ソースコード

  • pkg/kubelet/kuberuntime/kuberuntime_sandbox.go#L39[12]
  • pkg/kubelet/kuberuntime/kuberuntime_container.go#L176[13]
  • pkg/kubelet/images/image_manager.go#L89[14]

次に、Containerd を例にして、kubelet リクエストを処理する方法を見てみましょう。

Containerd と CRI

Containerdの`criService`[15]は、CRIインターフェース`RuntimeService`[16]と`ImageService`[17]のRuntimeServiceServerとImageServiceServerを実装しています。

cirServiceはさらに`instrumentedService`[18]にパッケージ化され、すべての操作がk8s.io名前空間で実行されるようにします。

ランタイムサービスサーバー


イメージサービスサーバー

イメージサービスサーバー[20]

 type ImageServiceServer interface { // ListImages lists existing images. ListImages(context.Context, *ListImagesRequest) (*ListImagesResponse, error) // ImageStatus returns the status of the image. If the image is not // present, returns a response with ImageStatusResponse.Image set to // nil. ImageStatus(context.Context, *ImageStatusRequest) (*ImageStatusResponse, error) // PullImage pulls an image with authentication config. PullImage(context.Context, *PullImageRequest) (*PullImageResponse, error) // RemoveImage removes the image. // This call is idempotent, and must not return an error if the image has // already been removed. RemoveImage(context.Context, *RemoveImageRequest) (*RemoveImageResponse, error) // ImageFSInfo returns information of the filesystem that is used to store images. ImageFsInfo(context.Context, *ImageFsInfoRequest) (*ImageFsInfoResponse, error) }

Containerd のソースコードを見るために、サンドボックスの作成を例に挙げてみましょう。

Containerd ソースコード分析

サンドボックスコンテナを作成する要求は、CRI UDS(Unixドメインソケット)[21]インターフェース/runtime.v1.RuntimeService/RunPodSandboxを介してcriServiceの処理フローに入ります。 criService#RunPodSandbox() では、サンドボックス コンテナの作成と実行、およびコンテナの状態が正常であることを確認する役割を担います。

  • sandobxコンテナイメージをダウンロードする
  • コンテナのメタデータを初期化する
  • ポッドネットワーク名前空間を初期化します。詳細については、前回の記事「ソースコード分析:kubeletとコンテナランタイムの観点から見たCNIの使用」[22]を参照してください。
  • コンテナのメタデータを更新する
  • ファイルシステムへの書き込み

参照ソースコード

  • pkg/cri/server/sandbox_run.go#L61[23]
  • サービス/タスク/local.go#L156[24]

要約する

CRI は、基盤となるコンテナ ランタイムと対話するための標準化されたインターフェースを提供します。これは、Kubernetes エコシステムの開発と成長にとって非常に重要です。

  • Kubernetes コントロール プレーンはコンテナ管理の特定の実装から分離されており、コンテナ ランタイムは独立してアップグレードまたは切り替えることができるため、拡張と最適化が容易になります。
  • Kubernetes は、クロスクラウド、クロスプラットフォーム、マルチ環境のコンテナ オーケストレーション システムとして、さまざまな環境やシナリオでさまざまなコンテナ プラットフォームを使用します。 CRI の登場により、プラットフォームの多様性と柔軟性が確保されます。

参考文献

[1] 昔私が掘った落とし穴: https://atbug.com/how-kubelete-container-runtime-work-with-cni/#Create-pod

[2] コンテナ: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd

[3] CRI-O: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cri-o

[4] Dockerエンジン: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker

[5] Mirantis コンテナ ランタイム: https://kubernetes.io/docs/setup/production-environment/container-runtimes/#mcr

[6] Kubernets 1.5: https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/

[7] Dockershimは正式に削除されました: https://kubernetes.io/blog/2022/05/03/dockershim-historical-context/

[8] Kubeletソースコード分析: https://mp.weixin.qq.com/s/O7k3MlgyonNtOUxNPrN8lg

[9] コンテナランタイム: https://kubernetes.io/docs/setup/production-environment/container-runtimes/

[10] kubeGenericRuntimeManager#SyncPod(): https://github.com/kubernetes/kubernetes/blob/023d6fb8f4a7d130bf5c8e725ca310df9e663cd0/pkg/kubelet/kuberuntime/kuberuntime_manager.go#L711

[11] CRIクライアントを初期化する: https://github.com/kubernetes/kubernetes/blob/14fcab83adf319b8ef8e82e1054412309c46f535/pkg/kubelet/kubelet.go#L285

[12] pkg/kubelet/kuberuntime/kuberuntime_sandbox.go#L39: https://github.com/kubernetes/kubernetes/blob/ea929715339da4553589df61c8638bac3bcae618/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go#L39

[13] pkg/kubelet/kuberuntime/kuberuntime_container.go#L176: https://github.com/kubernetes/kubernetes/blob/3946d99904fe37ea04b231a8d101085b9b80b221/pkg/kubelet/kuberuntime/kuberuntime_container.go#L176

[14] pkg/kubelet/images/image_manager.go#L89: https://github.com/kubernetes/kubernetes/blob/de37b9d293613aac194cf522561d19ee1829e87b/pkg/kubelet/images/image_manager.go#L89

[15] criサービス: https://github.com/containerd/containerd/blob/1764ea9a2815ddbd0cde777b557f97171b84cd02/pkg/cri/server/service.go#L77

[16] ランタイムサービス: https://github.com/kubernetes/cri-api/blob/master/pkg/apis/runtime/v1/api.proto#L34

[17] イメージサービス: https://github.com/kubernetes/cri-api/blob/master/pkg/apis/runtime/v1/api.proto#L128

[18]instrumentedService: https://github.com/containerd/containerd/blob/d3c7e31c8a8f7dc3f0ef0d189fda5a7caca42ce2/pkg/cri/server/instrumented_service.go#L32

[19] ランタイムサービスサーバー: https://github.com/kubernetes/cri-api/blob/v0.25.0/pkg/apis/runtime/v1/api.pb.go#L9301

[20] イメージサービスサーバー: https://github.com/kubernetes/cri-api/blob/v0.25.0/pkg/apis/runtime/v1/api.pb.go#L10131C9-L10131C9

[21] UDS(Unixドメインソケット): https://en.wikipedia.org/wiki/Unix_domain_socket

[22] ソースコード分析:kubeletとコンテナランタイムの観点からCNIを使用する:https://atbug.com/how-kubelete-container-runtime-work-with-cni/#Create-sandbox-container

[23] pkg/cri/server/sandbox_run.go#L61: https://github.com/containerd/containerd/blob/f2376e659ffa55e4ff2578baf4e4c7aab54042e4/pkg/cri/server/sandbox_run.go#L61

[24] services/tasks/local.go#L156: https://github.com/containerd/containerd/blob/bbe46b8c43fc2febe316775bc2d4b9d697bbf05c/services/tasks/local.go#L156


<<:  Kubernetesストレージ101: データ駆動型のパワーを解き放つKubernetesストレージの概念の簡単な紹介

>>:  k8sでのPrometheusの導入と実践的な運用の上級記事

推薦する

アリババはアプリケーションに焦点を当て、IPV6フルリンクの大規模導入を推進

2021年10月11日〜12日、「イノベーションによる力の強化、未来の構築」をテーマにした「2021...

ramnodeはどうですか?ニューヨークのramnodeのクラウドサーバーの簡単なレビュー

ramnodeはどうですか? ramnode ニューヨークはどうですか?アメリカ東海岸のニューヨーク...

Shi Yuzhuがウェブサイトのコンテンツを最適化する方法をガイドします

マーケティング業界の伝説的人物である石玉竹は、「巨人」、「美百品」、「黄金パートナー」などを通じて、...

エッジコンピューティングはネットワーク攻撃対象領域を拡大させる可能性がある

物理的なセキュリティに関する潜在的な固有の課題に加えて、エッジ コンピューティングの場所ではさらにデ...

oplink: ヒューストンの高トラフィック VPS、$5/KVM/1G メモリ/40gSSD/5T トラフィック、Windows 10 などをサポート。

Oplinkは本当に古いブランドです。主に米国ヒューストンのデータセンターでVPSと独立サーバー(ホ...

マーケティング事例の共有: コンテンツマーケティングの事例に挑む3つの有名子供向けブランド

ベビー用品の3ブランド、Babies R Us、Hasbro、Leap FrogのWebサイトはコン...

注: Baidu Webmaster Platformの「ハッキングアラートと不正行為アラート」機能が本日正式にリリースされました

A5ウェブマスターネットワークは6月5日に報道した。百度ウェブマスタープラットフォームの公式ニュース...

fliphost-新しいウェブサイトデザイン-VPSプロモーション/512MメモリKVM/月額6.5ドルの支払い

設立から2年以上経ったVPSビジネスを展開するFliphostが、ついにウェブサイトをリニューアルし...

#黑5# BandwagonHost「ブラックフライデー」特別オファーCN2乾物VPS、「Alipay」をサポート

BandwagonHost は、昨年のブラックフライデー特別価格の VPS、CN2 ネットワーク、K...

2020 年に企業はどのクラウド コンピューティング戦略を選択すべきでしょうか?

多くの組織は、クラウド コンピューティングがビジネスの将来において重要な役割を果たすと確信しています...

centexhosting-40USD/年/KVM/1GB RAM/30GB SSD/4TBトラフィック/ニューヨーク

centexhosting.comは確かに新しい会社です。今月から使い始めたばかりです。今月初めに、...

オンライン採用に関する雑談: すべてのウェブマスターは考えることを学ぶべき (I)

最近はよくYigedianにメッセージを残しに行きます。ウェブマスター業界に入ったばかりの初心者の友...

百度の調整の背後にはウェブマスターたちの血と涙がある

最近の Baidu のメジャーアップデートにより、多くのウェブサイトの権威がさまざまな程度に低下しま...

SEO 最適化には独創性や品質が必要ですか?

いつもと同じ話ですが、私は同僚と話をするために再びここに来ました。初心者のウェブマスターでも、経験豊...

オリジナル記事を書くことはランキングにランクインすることを意味しますか?

外部リンクは Baidu によって絶えず攻撃されているため、今日のウェブマスターは外部リンクの構築に...