Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する連載。今回は、Kubernetes 1.24でDockerサポートが削除された背景と対応方法について解説する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
2020年12月8日。ノストラダムスは予言した。「DockerはいずれKubernetesから消え去るだろう」と。そしてv1.20で非推奨になった。予言から1年5カ月たった2022年5月3日のv1.24のリリースによって、ついにDockerはKubernetesのコードから消滅した。一体これから何が起こるのだろうか……。
Kubernetes信者の読者には既知の事実かもしれないが、改めてKubernetesに何が起こったのか、そしてわれわれはどうしていけばよいのか――。Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する本連載「Cloud Nativeチートシート」。今回は、その真相を究明する。
Kubernetes 1.24でKubernetesからDockerをサポートするコードが削除されたことで、KubernetesやDockerが流行している今、次のように不安を抱えている方もいるかもしれません。
本稿は、このような悩みや漠然とした不安感を解消するために執筆しました。読者の皆さんが気になる観点が書かれた章をつまみ食いしていただければ幸いです。なお、既に公開されている情報のまとめ的な記事になっているので、既にご存じの方はご了承ください。
KubernetesのDockerサポートの歴史と、「なぜ削除されたのか」の背景を見ていきます。
「Docker Engine」(別称「Docker CE」)はKubernetesで最初にサポートされたコンテナランタイム(=コンテナを実行する実行環境)でした。当時コンテナランタイムといえば、ほぼDockerのみだったので※1、当初はKubernetesにハードコーディングされていました。
※1:厳密には「OpenVz」「LXC」など先行するコンテナランタイムもありました。
その後、Docker Engine以外のコンテナラインタイムが発表され、KubernetesにDocker Engine以外のコンテナランタイムを組み込みやすくするために、CRI(Container Runtime Interface)としてコンテナとKubernetesのインタフェースが標準化されました。
それに伴い、Kubernetesのコードに直接組み込まれていたDocker Engineをサポートするコードは、「dockershim」というブリッジによってCRIを介してDocker Engineを利用するように変更されました。その後、Docker Engineも内部のリファクタリングが進み、Docker Engineの中で「containerd」というコンテナランタイムを利用し、containerd経由でコンテナを操作するように変更されました(図1の上側)。
dockershimによってKubernetesは引き続きDocker Engineをサポートしてきたわけですが、dockershimは「cgroups v2」「user namespaces」などの新しいKubernetesの機能と互換性がないという問題が出てきました。また、dockershimに関連するコードは、Cloud Native Computing Foundation(CNCF)のコードやツールに影響を与え、壊れやすいコードになっていました。これらの理由によってdockershimは、Kubernetesの開発に足かせとなっていました。
そこで、Kubernetesの開発の速度を上げるために、dockershimに関するコードがKubernetesから削除されました(図1の下側)。
containerd(もしくは、他のコンテナランタイム)を、CRIを介して直接呼び出す方式に移行することで、dockershimが不要になりますし、Docker Engineのオーバーヘッドもなくなります。
Docker Engine、dockershim、containerdといった用語が出てきましたが、これらの関係について構造的に理解していきましょう。
Docker Engineで使われているコンテナランタイムはcontainerdです。つまり、Docker Engineをcontainerdに置き換えた場合、結局コンテナエンジンとしてはcontainerdが使われるわけです。
Docker Engineにはコンテナランタイム以外にも、「Docker Swarm」など、Kubernetesで必ずしも利用しないものも含まれます。dockershimを削除し、Docker Engineに依存しない構造になり、下記の2.を意識しなくてよくなります。
これによって、Kubernetesプロダクトのメンテナンス性の向上につながることは容易に想像できることでしょう。
KubernetesからDockerサポートするモジュールdockershimが削除された後、どうしていけばよいのでしょうか? 以下の2つの対処があるので、順に説明します。
Docker Engineを使い続けるには、dockershimの代わりに、Mirantisから提供されるCRI準拠の「cri-dockerd」を図2のようにインストールすることになります。cri-dockerdが「kubelet」からCRIでコンテナ操作を仲介し、Docker Engineを操作します(図2)。
インストールの詳細はMirantisの記事「Mirantis to take over support of Kubernetes dockershim」をご参照ください。
マイグレーション方法については、公式サイト「Migrate Docker Engine nodes from dockershim to cri-dockerd」をご参照ください。
なお、後述のDocker Desktopはcri-dockerdを利用して、Docker Engineを使い続けています。
Docker Engineを使うのをやめる場合は、containerdやcri-oをランタイムとして使います。後述の「Amazon Elastic Kubernetes Service」(EKS)、「Google Kubernetes Engine」(GKE)、「Azure Kubernetes Service」(AKS)、「Microk8s」「kind」は特定のバージョンからcontainerdを採用しています。
Docker Engineを使うのをやめて、他のコンテナランタイムを利用する場合、本当に影響はないのでしょうか?
結論としては、Build、Ship、RunのBuildとShipは無影響。影響はRunの一部のケースのみです。つまり、「Dockerイメージ」「Dockerレジストリ」は利用可能です。もちろん、そもそもKubernetes経由でDocker Engineを使っていない場合は影響がありません。
以降、Build、Ship、Runについて解説します。
他のコンテナランタイムを利用した場合でも、従来のDockerイメージを利用できるので、従来のイメージはそのまま使い続けることができます。
イメージの作成を「docker build」などで行っている場合も、そのままdocker buildや他のコマンドでそのままイメージをビルドします。
既存のDockerレジストリは原則そのまま使えます。
ただし、ローカル環境にキャッシュレジストリを作成したり、オンプレミス環境でDockerレジストリのミラーを作成したりしている場合、「/etc/docker/daemon.json」などの設定の中でミラーを設定していると思いますが、移行先のコンテナランタイムでレジストリミラーの再設定などが必要になります。
詳しくは、Kubernetesの公式サイトをご参照ください。
環境によって異なりますが、Kubernetesをバージョンアップしない場合、多くの場合はノードをそのまま使えます。Kubernetesの古いバージョンを使っている場合で、かつ新しいKubernetesのバージョンにマイグレーションするタイミングなどでノードの再作成が必要になります。
以降、お使いの環境に該当するパートをご参照ください。
ただし、ノードにログインしてコンテナの動作状況を確認する場合、dockerコマンドが利用できなくなり、代わりに「crictl」コマンドを利用することになります。詳細は下記のコラムをご覧ください。
Dockerの代わりにCRI対応のコンテナエンジンを利用すると、dockerコマンドが使えなくなります。代わりにcrictlコマンドが提供されており、crictlを利用することで、コンテナを操作できます。crictlコマンドはほぼdockerコマンドと同じサブコマンドを持っていますが、Podに関する操作など、若干異なるコマンドもあります。
下記にdockerコマンドをcrictlコマンドの対応を掲載しておくので、crictlコマンドの使い方に迷った人は参考にしてください。
docker | crictl | 説明 |
---|---|---|
docker pull | crictl pull | コンテナイメージの取得 |
docker images | crictl images | コンテナイメージの一覧 |
docker rmi | crictl rmi | コンテナイメージの削除 |
docker image inspect | crictl inspecti | コンテナのイメージ情報を表示 |
docker | crictl | 説明 |
---|---|---|
docker create | crictl create | コンテナの作成 |
docker run | crictl run | コンテナの実行 |
docker ps | crictl ps | コンテナの一覧 |
docker inspect | crictl inspect | コンテナの詳細情報を表示 |
docker stats | crictl stats | コンテナのリソース消費情報を表示 |
docker attach | crictl attach | コンテナにコンソールをアタッチ |
docker exec | crictl exec | コンテナでプロセスを実行 |
docker logs | crictl logs | コンテナのログ表示 |
docker rm | crictl rm | コンテナの削除 |
docker kill/stop | crictl stop | コンテナの停止 |
docker start | crictl start | コンテナの開始 |
docker update | crictl update | コンテナの更新 |
docker | crictl | 説明 |
---|---|---|
- | crictl runp | Pod実行 |
- | crictl rmp | Pod削除 |
- | crictl inspectp | Pod情報表示 |
- | crictl stopp | Pod停止 |
- | crictl port-forward | Podのポートフォワード |
・マネージド環境
以下の通りKubernetesのバージョンに応じて対応が異なります。
ツール | どのバージョンからcontainerdがデフォルトか | containerdの有効化方法 |
---|---|---|
EKS | v1.22 | containerd ランタイムブートストラップフラグを有効にする |
GKE | v1.19(Linux)、v1.21(Windows) | ノード自動プロビジョニングのデフォルトのノードイメージを変更する |
AKS | v1.19(Linux)、v1.23(Windows) | create a new node pool with containerd enabled |
containerdがデフォルトになっているバージョンをお使いの方は、自然体でcontainerdを使っているので、今回のdockershimの削除の影響を受けません。それ以前のバージョンについては、containerdを有効化する手順が提供されています。
・PC環境
containerdがデフォルトになっているバージョンを使っている場合、自然体でcontainerdを使っているので、今回のdockershimの削除の影響を受けません。
ツール | 対応状況 | 影響バージョン |
---|---|---|
Docker Desktop | (Docker Engineの継続利用のためv4.7.0でdockershimからcri-dockerdに変更) | なし |
Minikube | (2022年5月18日時点でDocker Engine) | 現時点ではなし(2022年5月18日時点でKubernetesのバージョンが1.24より前なので) |
Microk8s | v1.14でcontainerdに変更 | v1.13まで |
kind | v0.3.0でcontainerdに変更 | v0.2.0まで |
「Web記事で概観をつかみ、正確なところは一次情報(公式サイト)から得たい」という方のために、ご参考として主要なページを列挙しておきます。
ここまで読むことで、「Dockerが使えなくなる!」という抽象的な理解から脱し、一歩踏み込んだ理解が得られたのではないでしょうか。ご自身の環境で「Kubernetesのバージョンアップなど適切に対応できる状態になった!」と自信を持っていただけたなら幸いです。
Copyright © ITmedia, Inc. All Rights Reserved.