Docker 公式ブログに「What developers need to know about Docker, Docker Engine, and Kubernetes v1.20 という投稿があり、何が書かれているのか要点を日本語でまとめました。
書かれているポイントは「Kubernetes で Docker が非推奨ではなく、これまで通り使い続けられる」であり「Docker イメージの話と、ランタイムの話は別」との内容です。
今回のDockerのブログ投稿を捕捉しますと、Kubernetes における docker-shim の話と、 Docker イメージの扱いは別だ、という内容でもあります。つまり、前提として「Docker Engineとcontainerd、Dockerコンテナとイメージの話」も分けて考えたり議論する必要があります。
また、Cloud Native Refernce Architecture において、kubernetesとcontainerd(およびDocker)がどの位置にあるかの理解も必要です。
以下は、例によってブログに書かれている内容を共有します。なお、本文中の括弧内は、私が追加した説明です。
概要
The net/net is support for your container images built with Docker tools is not being deprecated and will still work as before.
(太字強調は原文通り)
- 「要点:要点は、Docker ツールで構築するコンテナイメージのサポートは非推奨になはならず、これまで通り動作しつづけること。」
- Kubernetes の最新版 Kubernetes v1.20.0-rc.0 が利用できるようになった
- Kubernetes プロジェクトは来年リリースされるであろうリリースで、 Docker Engine サポートの depricated(日本語では「非推奨」や「廃止」と翻訳されることがある)を計画している(Docker Engine のサポートの話であり、Docker イメージに対するサポートの話ではない)
Docker と Kubernetes にどのような影響があるのか?
- まず始めに「慌てるな(don’t panic)」、開発者は引き続き Docker プラットフォームで構築・共有し、 Kubernetes 上でコンテナを実行できる
- (関連情報へのリンク:)
- 今回の変更が主に影響するのは、Kubernetes の運用担当ないし管理者であり、開発者のワークフローには影響を与えない
- Docker でビルドするイメージは OCI(オープンコンテナイニシアチブ)互換であり、containerd が完全にサポートしているものであり、 Kubernetes 上でも動作し続ける
Docker と containerd(「コンテナ・ディー」と発音)
- Docker を使っているのであれば、containerd も既に使用中であり、containerd 上で Docker の利用環境が整っている
- プロダクション環境であれば、Kubernetes のような最小のコンテナ実行環境として(containerd などの)lightweight な(ライトウェイト=小さくて小回りが利く、の意味での)ランタイムが便利であり、おそらく Docker の開発作業が(プロダクションでは)不要だろう
containerd の成り立ち・経緯
- containerd プロジェクトは、2016 年、Docker、Google、IBM と発足(関連)
- (Docker サイドの主張としては)docker-shim およびランタイムとしての Docker Engine の非推奨が意味するのは、Kubernetes 上に最新のランタイムを提供するという、長期的な目標の達成を意味する
- contaired は 2017 年に CNCF に寄贈 され、Kubernetes のインターフェースとしての containerd CRI プロジェクト を取り込みながら成長
- 2019 年には CNCF の graduated (誰もが利用可能な状態のプロダクトになった)プロジェクトとして位置付けられ、CNCF では成熟した状態に位置付けられた唯一のランタイムになった
Docker ツールでビルドする「コンテナ・イメージは非推奨にならない」
- Docker ツールで構築したコンテナ・イメージは、Kubernetes 上でも動作し続ける
- BuildKit という次世代の構築基盤は柔軟なアーキテクチャであり、Docker の構築で使えるだけでなく、Docker が無いインフラ上では containerd や runc と直接やりとりできる
- Docker はcontainerd の開発にコミットしており今後も投資を継続し、buildkit コミュニティは成長しており、インフラがどこで・どのようにホストされていようが Docker 構築に役立つ
- Docker イメージの構築・実行は、ローカル環境だけでなくKubernetes クラスタでも利用し続けられるため、今回の非推奨は、開発作業(experience)には何ら影響を与えない。
Kubernetes プロジェクトは今何を非推奨にするのか?
- Kubernetes が非推奨としたのは dockershim
- dockershim は、Kubernetes の kubelet (Kubernetes のノード上で動作するエージェント)のコンポーネントで、Docker Engine と通信するもの(つまり、Docker コンテナやイメージが非推奨ではない)
- Dockershim Deprecation FAQ | Kubernetes
- 関連する tweet、tweet
何か対策が必要?
- 今日現在、 Kubernetes v1.20 は Kubernetes 管理者は
docker
コマンドを利用し続けられる状態であり、kubectl
コマンドで Kubernetes クラスタの管理を継続できる(今日、今すぐ何か影響が出るわけではない) - 今後の Kubernetes マイナーリリース(v1.20.x)では、最終的に dockershim のサポートが削除されるため、docker コマンドを使ってクラスタの調査(inspect)が行えなくなる
- (そのかわり、docker コマンドではなく)、同様の kubectl や ctl コマンド(containerd のコマンドライン・インターフェース)を使う
- 開発者は今もなお Docker ツールをつかって docker build、docker pushできますし、docker run で コンテナおよびコンテナ・イメージを Kubernetes クラスタ上でできる
詳細な背景
- KEP-1985: Removing dockershim from kubelet
- https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/1985-remove-dockershim
- kubelet から dockershim を削除する提案