SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Kubernetes 1.20からDockerが非推奨になる件に関して整理する

f:id:arakan_no_boku:20201204003935p:plain

 Kubernetes 1.20からDockerが非推奨になる件について、頭の整理をしてみます。

目次

KubernetesとDockerは最強の組み合わせかと思ってた  

2018年に自分が記事に書いたときは、Kubernetes とDockerって、開発や保守の両面でメリットがある将来的にも有望な「最強・最良の組み合わせ」みたいに自分には見えてましたし、周囲の人間も、ほぼ100%そういう見解でした。

arakan-pgm-ai.hatenablog.com

ところがどっこい、その2年後に、こんなニュースを聞くことになるとは。

github.com

上記には

Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community. We encourage you to evaluate moving to a container runtime that is a full-fledged implementation of CRI (v1alpha1 or v1 compliant) as they become available. (#94624, @dims) [SIG Node]

kubeletでのDockerサポートは非​​推奨になり、将来のリリースで削除される予定です。kubeletは、DockerのCRIサポートを実装する「dockershim」と呼ばれるモジュールを使用しており、Kubernetesコミュニティでメンテナンスの問題が発生しています。CRI(v1alpha1またはv1準拠)が利用可能になったら、本格的な実装であるコンテナーランタイムへの移行を評価することをお勧めします。(#94624、@ dims)[SIGノード]

なんてことが、v1.20.0-beta.1以降の変更点として、しれっと書いてあります。

整理にあたって、まず、言葉のおさらいから  

自分は KubernetesやDockerのエキスパートではありませんから、まずは、言葉のおさらいからはいります。

Kubernetes

クーべネティスまたはクーバーネティスと読みます。

複数のコンテナを関連するリソース(e.g. 永続化ボリューム)とともに一元管理します。

コンテナ

想環境のことですが、ハードウェアまでエミュレートする「仮想マシン」と違って、OSのカーネルの機能で論理的に隔離された環境上でアプリケーションプロセスを動かすだけなので、軽量(起動時間やリソース消費量が小さいな)のが特徴です。

Pod

Kubernetes上のワークロードの最小単位です。

Kubernetes上でPodごとに論理リソースが隔離され、IPアドレスが割り当てられます。

ちょうど、Kubernetes上の仮想マシンみたいな感じで、Podの中で一つないし複数のコンテナが動くことになります。

コンテナランタイム

コンテナを実行するためのプログラムです。

Kubernetes自身がコマンドを実行する機能を持っているわけでなく、kubeletというコンポーネントがコンテナランタイムのAPIやコマンドをたたいて、コンテナを実行するわけですが、このコンテナランタイムのひとつが「Docker」ということになります。

DockerはCRI非対応なのに特別扱いされてきた

kubeletには、コンテナランタイム間のインターフェースの標準化仕様[Container Runtime Interface (CRI)]があります。

原則、この仕様に対応しているコンテナランタイムを推奨、それ以外は非推奨です。

でも、Dockerは、このCRIに非対応ですが、例外的に扱われてきました。

なぜかというと、コンテナ技術は、最初Dockerありきであり、Kubernetesも、初期はコンテナランタイムはDocker一択だったという歴史があるからです。

Dockerは特別扱いされ、kubeletに「dockershim」を別途、組み込むことで扱えるようにしていたわけです。

現時点でKubernetesからDockerをコンテナランタイムとして、コンテナを扱う場合は、ざっくり以下の図のようなイメージになっています。

f:id:arakan_no_boku:20201205223541p:plain

普通に考えても、かなり無駄が多いことがわかります。

containerdの切り出しでDockerを特別扱いする意味がなくなった

ポイントは、上記でDockerの皇族にでてくる「containerd」や「runC」です。

containerdもrunCも、Docker社が開発しており、コンテナ管理やコンテナイメージ管理などのDockerのメインどころの機能をきりだして標準化したものになっていて、最近のDockerはそのへんの処理をほぼ、このcontainerdに丸投げしている構造です。

しかも。

containerdは、Container Runtime Interface (CRI)に対応しているので、Dockerがなくても、kubeletからcontainerdを直接たたいてコンテナを扱うことができます。

そう考えれば、最終的にはcontainerdに処理をゆだねているにすぎないDockerを通すためだけに「dockershim」を開発・保守するコストをかけるなんて、無駄以外の何物でもないことは、誰が考えてもわかります。

だから、1.20からDockerを非推奨にする=dockershimを非推奨にする・・ということにしたということのようです。

 

公式ブログのパニックになるな!の真意 

ここまで理解できると、公式の「Kubernetesブログ」に「パニックになるなよ」と書いてあった以下の文章の真意がわかります。

kubernetes.io

引用すると

Docker-produced images will continue to work in your cluster with all runtimes, as they always have.

If you’re an end-user of Kubernetes, not a whole lot will be changing for you. This doesn’t mean the death of Docker, and it doesn’t mean you can’t, or shouldn’t, use Docker as a development tool anymore. Docker is still a useful tool for building containers, and the images that result from running docker build can still run in your Kubernetes cluster.

Dockerで生成されたイメージは、常にそうであるように、すべてのランタイムでクラスター内で引き続き機能します。

Kubernetesのエンドユーザーの場合、大きな変化はありません。

これは、Dockerの死を意味するものではなく、Dockerを開発ツールとして使用できない、または使用すべきではないという意味でもありません。

Dockerは引き続きコンテナーを構築するための便利なツールであり、実行によって生成されたイメージdocker buildは引き続きKubernetesクラスターで実行できます。

あと、ここと。

What’s actually happening here is that Dockershim is being removed from Kubelet as early as v1.23 release, which removes support for Docker as a container runtime as a result.

ここで実際に起きていることは、v1.23リリースの時点でKubeletからDockershimが削除され、結果としてコンテナランタイムとしてのDockerのサポートが削除されるということです。

なるほど・・です。

Docker自体の機能を使ってなんかしてる(Dockerソケットとか?)とこがあれば、それを代替えする方法を考える必要はあるけど、単に、コンテナを動かすというだけなら、それほど心配することはなさそうかな・・って感じです。 

よしよし。 

とても参考になった記事のリンク

最後に、今回調べるにあたって、すごく参考になった記事のリンクを張っておきます。

www.kaitoy.xyz

今回はこんなところで。

ではでは。