SlideShare a Scribd company logo
Copyright(c)2022 NTT Corp. All Rights Reserved.
Dockerからcontainerdへの移⾏
⽇本電信電話株式会社
ソフトウェアイノベーションセンタ
徳永 航平
須⽥ 瑛⼤
NTT Tech Conference 2022 (March 23rd)
Copyright(c)2022 NTT Corp. All Rights Reserved.
Dockerの復習
2
● docker composeで複数コンテナをまとめて管理
可能
● コンテナ開発に有⽤な機能を提供するツール
docker run -it --rm alpine
docker build -t foo /dockerfile-dir
docker push ghcr.io/ktock/myalpine:latest
Build
Ship
Run
● Mac,WindowsではDocker Desktopを利
⽤可能
Build(イメージ作成) Run(コンテナ実⾏)
レジストリ
Ship(コンテナ配布)
イメージ
材料 コンテナ
Copyright(c)2022 NTT Corp. All Rights Reserved.
Dockerに関する最近の話題︓Kubernetesでのdockershim⾮推奨化
3
kubectl apply
runc
スケジュールされたPodの管理
コンテナ実⾏状態の管理
Linux機能を使いコンテナの作成
ノード
apiserver
kubelet
Pod割り当て
コンテナ・イメージの管理
Docker
(⾮推奨化)
● Kubernetes v1.23まではノード上で
Dockerをコンテナランタイムとして利
⽤可能
● Kubernetes v1.20からkubeletから
Docker利⽤は⾮推奨に
● Kubernetes v1.24ではDockerのサポ
ート(dockershim)を削除予定
○ 今後独⽴のツールとしてMirantis
社によってメンテされる
○ https://github.com/Mirantis/cri-dockerd
Copyright(c)2022 NTT Corp. All Rights Reserved.
Dockerに関する最近の話題︓Docker Desktop有償化
4
● Docker Desktop 有償化︓”professional use in larger businesses”対象
• https://www.docker.com/blog/updating-product-subscriptions/
● GUI版のDocker Desktopは有償だが、Docker CLI + Docker EngineのVM
内での利⽤は有償化されない
• https://www.docker.com/pricing/faq
■ “Can I just install the Docker CLI instead of using Docker
Desktop?”
Copyright(c)2022 NTT Corp. All Rights Reserved. 5
containerdによるコンテナ管理
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerdによるコンテナ管理
6
● オープンソースなコンテナランタイム(CNCF graduatedプロジェクト)
● Docker/Moby、Kubernetesサービス(EKS、AKS、GKE)で使われるな
ど、採⽤が拡⼤している
https://github.com/containerd/containerd
引⽤元︓https://sysdig.com/blog/sysdig-
2021-container-security-usage-report/
(2021年1⽉)
引⽤元︓
https://www.cncf.io/report
s/cncf-annual-survey-2021/
(2022年2⽉)
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerdとDocker、Kubernetesの関係
7
コンテナ管理運⽤基盤
Linuxカーネル
コンテナ開発ツール
コンテナ管理運⽤基盤
Kubernetes
従来
分散環境上のコンテナ管理
ノード上のコンテナ管理
containerd
コンテナ実⾏状態の管理
runc
カーネルの機能を使いコンテナ作成
コンテナ開発ツール
Linuxカーネル
containerd
汎⽤のコンテナ管理フレームワーク
runc
カーネルの機能を使いコンテナ作成
nerdctl
(containerdの⼀部)
コンテナ作成/実⾏/配布など
開発⽀援機能の提供
Kubernetes
分散環境上のコンテナ管理
⾼速rootless、eStargzなど先進
機能を備えたDocker互換ツール
Docker
近年
containerd だけで Docker の機能をほぼカバー
containerdを直接利⽤
Docker
Copyright(c)2022 NTT Corp. All Rights Reserved.
nerdctl︓Docker互換なcontainerd⽤CLI
8
● Docker⾵のUI/UX(composeもサポート)
https://github.com/containerd/nerdctl
● 先進機能
● ⾼速イメージpull(eStargz)
● P2Pイメージ共有(IPFS)
● 暗号化イメージ (OCIcrypt)
● イメージへの署名/検証(cosign)
● ⾼速rootless(bypass4netns)
nerdctl CLI
containerd API
nerdctl run -it --rm alpine
nerdctl build -t foo /dockerfile-dir
nerdctl push ghcr.io/ktock/myalpine:latest
nerdctl compose up
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerdによるKubernetesでのコンテナ管理
9
● 各ノード上でコンテナランタイムと
してcontainerdを利⽤可能
● kubeletはContainer Runtime
Interface(CRI)経由で
containerdを直接利⽤
● EKS、AKS、GKEなどマネージド
Kubernetesサービスでも利⽤可能
kubectl apply
runc
スケジュールされたPodの管理
Pod、コンテナ、イメージの管理
Linux機能を使いコンテナの作成
ノード
apiserver
kubelet
CRI
Pod割り当て
Copyright(c)2022 NTT Corp. All Rights Reserved.
GKEでのcontainerdへの移⾏
10
https://cloud.google.com/kubernetes-engine/docs/deprecations/docker-containerd
https://cloud.google.com/kubernetes-engine/docs/how-to/migrate-containerd
● Dockerベースのノードイメージは1.24以降でサポートされなくなる
● containerdベースのノードイメージ(Linuxノードでは1.19、Windowsでは1.21
からデフォルト)に移⾏する必要がある
Dockerノードイメージ Containerdノードイメージ
Dockerを含むContainer-Optimized OS (cos) Containerdを含むContainier-Optimized OS (cos_containerd)
Dockerを含むUbuntu(ubuntu) Containerdを含むUbuntu(ubuntu_containerd)
Dockerを含むWindows Server LTSC(windows_ltsc) Containerdを含むWindows Server LTSC(windows_ltsc_containerd)
Dockerを含むWindows Server SAC(windows_sac) Containerdを含むWindows Server SAC(windows_sac_containerd)
● 移⾏作業のためのスクリプト`find-nodepools-to-migrate.sh`が提供されている
• クラスタを解析して、移⾏のための推奨コマンドを⽰してくれる
https://github.com/GoogleCloudPlatform/k8s-node-tools/blob/HEAD/migrating-to-containerd/find-nodepools-to-migrate.sh
● 推奨されたコマンド(`gcloud container clusters upgrade`)を使ってcontainerdに
移⾏可能
Copyright(c)2022 NTT Corp. All Rights Reserved.
EKSでのcontainerdへの移⾏
11
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/dockershim-deprecation.html
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-optimized-ami.html#containerd-bootstrap
● Amazon Linux AMIは1.21現在でDockerがデフォルトランタイム
● バージョン1.23以降、含まれるランタイムはcontainerdのみになる
● 1.21現在までのAMIでも、ブートストラップフラグ` --container-runtime
containerd`でcontainerdノードを利⽤可能
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: my-cluster
region: region-code
managedNodeGroups:
- name: my-nodegroup
ami: eks-optimized-AMI-ID
overrideBootstrapCommand: |
#!/bin/bash
set -eu -o pipefail
/etc/eks/bootstrap.sh my-cluster --container-runtime containerd
● あるいは、ランタイムとしてcontainerdを利⽤しているBottlerocket AMIまたはEKS
Fargateに移⾏するのも可
● WindowsノードでもKubernetes 1.20より新しいバージョンでcontainerdを選択可能
○ https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-windows-ami.html#containerd-bootstrap-windows
Copyright(c)2022 NTT Corp. All Rights Reserved.
AKSでのcontainerdへの移⾏
12
https://docs.microsoft.com/en-us/azure/aks/cluster-configuration#container-runtime-configuration
● LinuxノードではKubernetes v1.19からcontainerdがランタイムとして使われている
● AKSのバージョンを`az aks upgrade`などで1.19以降にアップグレードすることで
Linuxノードについてはcontainerdへ移⾏可能
● とはいえすでに1.19以前はEOLのため、サポートされているAKS全バージョンでLinux
ノードではcontainerdが使われていることになる
● Windowsノードでは1.20からcontainerdを利⽤可能。1.22以前のクラスタでは
Dockerがデフォルト。1.23からはcontainerdがデフォルトになる。
○ `az aks nodepool upgrade`などで移⾏可能︓https://docs.microsoft.com/en-us/azure/aks/windows-
container-cli#optional-using-containerd-with-windows-server-node-pools
Copyright(c)2022 NTT Corp. All Rights Reserved.
kubeadmでのcontainerdへの移⾏
13
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-
plane-node
● ノードにDockerが稼働していればcontainerdも既に稼働している
● kubeadm(v1.23現在)はDockerを優先的に使⽤するので、明⽰的にcontainerdのソケ
ットパス`--cri-socket=/run/containerd/containerd.sock`を指定する必要がある
sudo kubeadm reset
sudo kubeadm join 192.168.56.120:6443 --cri-socket=/run/containerd/containerd.sock
--token <省略> --discovery-token-ca-cert-hash <省略>
● ここで、containerdのconfig(/etc/containerd/config.toml)に`disabled_plugins =
[“cri”]`が指定されてないことを要確認
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: イメージを作り直す必要はあるか︖
14
A. No。既存のコンテナイメージがそのままcontainerdで使える。
標準準拠ランタイム
Docker
Docker
BuildKit
Kaniko
イメージビルダ
etc…
etc…
● イメージには標準仕様があるのでcontainerd移⾏後も引き続き実⾏可能
標準準拠イメージ
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: レジストリはそのまま使えるか︖
15
A. Yes。ただしレジストリミラー等の設定は移⾏が必要。
● レジストリには標準仕様があるのでcontainerd移⾏後も引き続き利⽤可能
● ただし、`/etc/docker/`にレジストリクライアント関連の設定(ミラーや証明書など)
をしていた場合は、`/etc/containerd/`で設定しなおす必要がある
• 設定⽅法(containerd >= 1.5)︓
https://github.com/containerd/containerd/blob/v1.6.1/docs/hosts.md
標準準拠レジストリ 標準準拠ランタイム
Docker
pull
Docker
BuildKit
Kaniko
イメージビルダ
push
etc…
etc…
標準準拠イメージ
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: ノードの作り直しは必要か︖
16
● GKE/EKS/AKSでは前述の通りノードの更新が必要。
● kubeadmでは、厳密にはNo。運⽤上はYes。
• Dockerが稼働していればcontainerdも稼働している
• しかしDockerを維持する理由がないならばDocker無
しでノードを作り直した⽅が良い
containerd
Docker
Kubernetes
(kubelet)
runc
クラウドの場合︓Yes。
kubeadmの場合︓厳密にはNo。運⽤上はYes。
A.
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: ノードのデバッグに`docker`コマンドは使い続けられるか︖
17
A. No。代わりにnerdctlが使える。
$ sudo nerdctl --namespace=k8s.io ps
CONTAINER
ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
1fe5fe717d05 k8s.gcr.io/pause:3.5 "/pause" 9 minutes
ago Up k8s://kube-system/etcd-ktock
226a45b850fa k8s.gcr.io/kube-controller-manager:v1.23.4 "kube-controller-man…" 9 minutes
ago Up k8s://kube-system/kube-controller-manager-ktock/kube-controller-manager
・・・
`--namespace=k8s.io`を指定するとKubernetesのコンテナをDocker同様のUIでデバッグ可能
● 他にもノード上で利⽤可能なCLIはあるが、独特なUIに慣れが必要
• ctr: containerdに付属するデバッグ専⽤CLI。containerd APIに⾁薄した操作(e.g.
snapshots、contents)や、containerd⾃体のデバッグに有⽤。
• https://github.com/containerd/containerd/tree/main/cmd/ctr
• crictl: Kubernetes SIG Nodeで開発されるCRI⽤CLI。YAMLファイルでPod,コンテ
ナ,イメージを操作可能
• https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: ノードのデバッグに`docker`コマンドは使い続けられるか︖
18
$ mkdir -p /tmp/ctx && cat <<EOF > /tmp/ctx/Dockerfile
FROM alpine:3.15
CMD [ "sh", "-c", "while true ; do echo hello ; sleep 1 ; done" ]
EOF
$ sudo nerdctl --namespace k8s.io build -t foo /tmp/ctx
$ kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: foo
imagePullPolicy: Never
EOF
$ kubectl logs foo
hello
`nerdctl build`を使ってノード上で
イメージをビルドして実⾏することも可能
A. No。代わりにnerdctlが使える。
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: ログ管理に影響はあるか︖
19
A. ログ基盤がDocker依存の設定をもつ場合は修正の必要あり。
● `/var/log/pods`のログフォーマットはDockerとCRIランタイムで異なる
● ⾮マネージドなログ基盤で、Docker⽤のパーサしか設定されていなかったり、Docker
APIに依存してログ収集しているなど、Docker依存の設定がある場合は変更が必要
{"log":"Log line is here¥n","stream":"stdout","time":"2019-01-01T11:11:11.111111111Z"}
https://docs.docker.com/config/containers/logging/json-file/
2016-10-06T00:17:09.669794202Z stdout P log content 1
https://github.com/kubernetes/kubernetes/blob/9a8defda15e4c34e9c1989
75968d9619f48a0786/pkg/kubelet/kuberuntime/logs/logs.go#L125-L169
Dockerのログフォーマット
CRIランタイム(containerd含)のログフォーマット
Copyright(c)2022 NTT Corp. All Rights Reserved.
FAQ: Pod内で`docker`コマンドは引き続き利⽤可能か︖
20
● GKE: Dockerに直接依存しないようワークロードをアップデートすべき。
• https://cloud.google.com/kubernetes-engine/docs/deprecations/docker-containerd#impact_of_migrating
● EKS: Docker socketをマウントするアプリケーションでは変更が必要になる。
• https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/dockershim-deprecation.html
● AKS: Dockerは利⽤不可。
• https://docs.microsoft.com/en-us/azure/aks/cluster-configuration#containerd-limitationsdifferences
● kubeadm: ノード上でCRIランタイムとしてcontainerdを使いつつ、Dockerも稼働させ
ておけば引き続き可能。
Pod内でDockerデーモンを稼働させる場合︓Yes
ノード上のDockerに依存する場合︓クラウドでは移⾏が推奨されている。
kubeadm利⽤時はYes。
A.
Copyright(c)2022 NTT Corp. All Rights Reserved.
Cluster
FAQ: Pod内で`docker`コマンドは引き続き利⽤可能か︖
21
BuildKit
buildctl
BuildKit
BuildKit
BuildKit
Service
BuildKit
buildctl
BuildKit
BuildKit BuildKit
buildctl
+
BuildKit
kubectl
Deployment+Service StatefulSet Job
ランダムロードバランシング。
レジストリを介したキャッシ
ュ共有により⾼速なビルドが
可能。
クライアント側でのロードバ
ランシング。consistent
hashを使えば効率的にロー
カルキャッシュを活⽤可能。
ワンショットなビルド実⾏。
BuildKitデーモンの稼動が不
要。ローカルキャッシュはビ
ルドのたびに削除。
Cluster Cluster
Kubernetes上でのビルドにはBuildKitの利⽤も有⽤
https://github.com/moby/buildkit/tree/master/examples/kubernetes
Copyright(c)2022 NTT Corp. All Rights Reserved. 22
containerd・nerdctlの持つ様々な機能
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerd・nerdctlの持つ様々な機能
23
● nerdctl コマンドの使い⽅は、docker コマンドの使い⽅とだいたい同じ
● 単に docker コマンドの置き換えを⽬指しているわけではなくて、コンテナ
ランタイム関連の新機能を実験、普及展開するためのプラットフォームとし
て開発している
○ ⾼速イメージpull(eStargz)
○ P2Pイメージ共有(IPFS)
○ 暗号化イメージ (OCIcrypt)
○ イメージへの署名/検証(cosign)
○ ⾼速rootless(bypass4netns)
Copyright(c)2022 NTT Corp. All Rights Reserved.
⾼速なイメージPull(eStargz)
24
● Lazy pulling: イメージのpull完了を待たずにコンテナを起動可能
● eStargz: OCI仕様に後⽅互換のlazy pulling可能なイメージ形式
• lazy pulling⾮対応なランタイムでも通常のイメージとして扱える
0 10 20 30 40 50
estargz
estargz-noopt
legacy
Start up time of python:3.7 (print “hello”)
pull create run [sec
]
Figure from “Faster Container Image Distribution on a Variety of Tools with Lazy Pulling
- Kohei Tokunaga & Tao Peng. KubeCon+CloudNativeCon North America 2021.
https://sched.co/lV2a “
$ nerdctl –-snapshotter=stargz run –it ghcr.io/stargz-containers/python:3.9-esgz
https://github.com/containerd/nerdctl/blob/master/docs/stargz.md
nerdctl
Kubernetes
Copyright(c)2022 NTT Corp. All Rights Reserved.
P2Pイメージ共有(IPFS)
25
nerdctl push ipfs://ubuntu:20.04
peer peer
IPFS
nerdctl run ipfs://bafkreicq4dg6nkef5ju422ptedcwfz6kcvpvvhuqeykfrwq5krazf3muze
● P2Pデータ共有プロトコルのIPFSを使ってコンテナイメージをP2P共有可能
● nerdctl各コマンドで”ipfs://CID“の形式でIPFS上のイメージを利⽤可能
● eStargzのlazy pulling、OCICryptなども依然利⽤可能
Experimental
https://github.com/containerd/nerdctl/blob/master/docs/ipfs.md
nerdctl
Kubernetes
※Kubernetesではnerdctl付
属のOCI互換プロキシを⽤いる
Copyright(c)2022 NTT Corp. All Rights Reserved.
イメージ暗号化・復号化(OCICrypt)
26
● キーペアを⽤いて、イメージの暗号化が可能
● 暗号化したイメージはcontainerdでPullして復号、実⾏できる
Registry
image image
公開鍵 秘密鍵
イメージの暗号化 イメージの復号
nerdctl image encrypt nerdctl image decrypt
https://github.com/containerd/nerdctl/blob/master/docs/ocicrypt.md
nerdctl
Kubernetes
Copyright(c)2022 NTT Corp. All Rights Reserved.
イメージ署名・検証(cosign)
27
● 署名を⽤いて、イメージが改竄されていないかを検証できる
● Notaryに似ているが、最近はcosignが流⾏りつつある
Registry
image
秘密鍵 公開鍵
イメージの署名 イメージの検証
nerdctl push --sign=cosign nerdctl pull --verify=cosign
https://github.com/containerd/nerdctl/blob/master/docs/cosign.md
nerdctl
Kubernetes
※Kubernetesではcosign付属
のadmission controllerを使⽤
image
Copyright(c)2022 NTT Corp. All Rights Reserved.
⾼速rootless(bypass4netns)
28
● rootlessコンテナでもrootfulと同等以上のNW性能を得られる
● rootlessコンテナに従来存在したユーザ空間TCP/IPスタック(slirp4netns)のネットワー
クオーバヘッドを回避
• SECCOMP_IOCTL_NOTIF_ADDFD で、bind(2) や connect(2) をホスト側にバイパ
スしている
Experimental
引⽤元︓”インターンレポート: RootlessコンテナのTCP/IP⾼速化”.
https://medium.com/nttlabs/accelerating-rootless-container-network-29d0e908dda4
https://github.com/containerd/nerdctl/blob/master/docs/rootless.md
nerdctl
Copyright(c)2022 NTT Corp. All Rights Reserved.
その他
29
● 完全にread-onlyなmountが出来る: nerdctl run -v /mnt:/mnt:rro
○ docker run -v /mnt:/mnt:ro だと、/mnt/usb とかread-only にならない
● nerdctl runの--netは複数指定できる (コンテナを複数ネットワークに同時接続できる)
○ DockerでもComposeでなら同じことが出来るが、docker runでは出来ない
● FreeBSD コンテナ (jails) も少しだけ動く
○ ネットワークには未対応
● CNIやOCIなどの標準への準拠度が⾼い
○ nerdctl はCNI対応、docker は未対応
○ nerdctl save/nerdctl load はOCI Image SpecとDocker Image Specの両⽅対応、
docker save/docker load はOCI Image Spec未対応
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerdに移⾏すると出来なくなること
30
● Kubernetesノード上での docker コマンド使⽤
○ nerdctlを代わりに使⽤できる
● Docker REST API
○ Docker REST API に頼るアプリは動かない
○ docker コマンドを直に exec するアプリは、nerdctl を exec するように書き換
えるだけで動く
● Docker Swarm
○ コンテナオーケストレーションにはKubernetesやNomadを利⽤できる
nerdctl –-namespace=k8s.io build -t foo:1.2.3 .
Copyright(c)2022 NTT Corp. All Rights Reserved. 31
containerd・nerdctlへの移⾏⽅法
※Kubernetesの場合の移⾏⽅法は前述
(スライド10-13)
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerd・nerdctl への移⾏(linux)
32
https://github.com/containerd/nerdctl/releases
$ sudo systemctl enable --now containerd
$ sudo nerdctl run -d --name nginx -p 80:80 nginx:alpine
$ containerd-rootless-setuptool.sh install
$ nerdctl run -d --name nginx -p 8080:80 nginx:alpine
Rootful
Rootless
tarballにcontainerd、nerdctl、runc等のバイナリ⼀式が全て含まれている
(/usr/local などのパスに展開)
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerd・nerdctl への移⾏(macOS)
33
● Lima (macOS⽤のWSL2のようなもの)に containerd・nerdctl も付属
● ホストのホームディレクトリが、ゲストからも⾒える
● ゲストのlocalhostに、ホストからもlocalhostとしてアクセスできる
https://github.com/lima-vm/lima
$ brew install lima
$ limactl start
$ lima nerdctl run …
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerd・nerdctl への移⾏(macOS)
34
● Rancher Desktop にも containerd・nerdctl が付属
○ 内部的にはやはりLima
○ GUI付き
○ https://rancherdesktop.io/
Copyright(c)2022 NTT Corp. All Rights Reserved.
containerd・nerdctl への移⾏(Windows)
35
● LinuxコンテナはWSL2上で動かせる
● Rancher Desktop for Windows にも containerd・nerdctl が付属
● 内部的にはWSL2
● Windowsネイティブなコンテナにも対応 (nerdctlではexperimental)
● https://github.com/containerd/nerdctl/issues/28
Copyright(c)2022 NTT Corp. All Rights Reserved.
まとめ
36
● Docker から containerd への移⾏が進んでいる
● kubeadmの場合は、--cri-socket=/run/containerd/containerd.sock を渡すだけ
● 従来の Docker イメージはそのまま使える
● docker コマンドの代わりに nerdctl (contaiNERD CTL) が使える
○ ただの docker コマンドの置き換えではなく、いろいろな新機能がついている
(⾼速イメージPull、暗号化、...)
○ macOS でもすぐ始められる (Windowsの場合はWSL2)
$ brew install lima
$ limactl start
$ lima nerdctl run …

More Related Content

Dockerからcontainerdへの移行

  • 1. Copyright(c)2022 NTT Corp. All Rights Reserved. Dockerからcontainerdへの移⾏ ⽇本電信電話株式会社 ソフトウェアイノベーションセンタ 徳永 航平 須⽥ 瑛⼤ NTT Tech Conference 2022 (March 23rd)
  • 2. Copyright(c)2022 NTT Corp. All Rights Reserved. Dockerの復習 2 ● docker composeで複数コンテナをまとめて管理 可能 ● コンテナ開発に有⽤な機能を提供するツール docker run -it --rm alpine docker build -t foo /dockerfile-dir docker push ghcr.io/ktock/myalpine:latest Build Ship Run ● Mac,WindowsではDocker Desktopを利 ⽤可能 Build(イメージ作成) Run(コンテナ実⾏) レジストリ Ship(コンテナ配布) イメージ 材料 コンテナ
  • 3. Copyright(c)2022 NTT Corp. All Rights Reserved. Dockerに関する最近の話題︓Kubernetesでのdockershim⾮推奨化 3 kubectl apply runc スケジュールされたPodの管理 コンテナ実⾏状態の管理 Linux機能を使いコンテナの作成 ノード apiserver kubelet Pod割り当て コンテナ・イメージの管理 Docker (⾮推奨化) ● Kubernetes v1.23まではノード上で Dockerをコンテナランタイムとして利 ⽤可能 ● Kubernetes v1.20からkubeletから Docker利⽤は⾮推奨に ● Kubernetes v1.24ではDockerのサポ ート(dockershim)を削除予定 ○ 今後独⽴のツールとしてMirantis 社によってメンテされる ○ https://github.com/Mirantis/cri-dockerd
  • 4. Copyright(c)2022 NTT Corp. All Rights Reserved. Dockerに関する最近の話題︓Docker Desktop有償化 4 ● Docker Desktop 有償化︓”professional use in larger businesses”対象 • https://www.docker.com/blog/updating-product-subscriptions/ ● GUI版のDocker Desktopは有償だが、Docker CLI + Docker EngineのVM 内での利⽤は有償化されない • https://www.docker.com/pricing/faq ■ “Can I just install the Docker CLI instead of using Docker Desktop?”
  • 5. Copyright(c)2022 NTT Corp. All Rights Reserved. 5 containerdによるコンテナ管理
  • 6. Copyright(c)2022 NTT Corp. All Rights Reserved. containerdによるコンテナ管理 6 ● オープンソースなコンテナランタイム(CNCF graduatedプロジェクト) ● Docker/Moby、Kubernetesサービス(EKS、AKS、GKE)で使われるな ど、採⽤が拡⼤している https://github.com/containerd/containerd 引⽤元︓https://sysdig.com/blog/sysdig- 2021-container-security-usage-report/ (2021年1⽉) 引⽤元︓ https://www.cncf.io/report s/cncf-annual-survey-2021/ (2022年2⽉)
  • 7. Copyright(c)2022 NTT Corp. All Rights Reserved. containerdとDocker、Kubernetesの関係 7 コンテナ管理運⽤基盤 Linuxカーネル コンテナ開発ツール コンテナ管理運⽤基盤 Kubernetes 従来 分散環境上のコンテナ管理 ノード上のコンテナ管理 containerd コンテナ実⾏状態の管理 runc カーネルの機能を使いコンテナ作成 コンテナ開発ツール Linuxカーネル containerd 汎⽤のコンテナ管理フレームワーク runc カーネルの機能を使いコンテナ作成 nerdctl (containerdの⼀部) コンテナ作成/実⾏/配布など 開発⽀援機能の提供 Kubernetes 分散環境上のコンテナ管理 ⾼速rootless、eStargzなど先進 機能を備えたDocker互換ツール Docker 近年 containerd だけで Docker の機能をほぼカバー containerdを直接利⽤ Docker
  • 8. Copyright(c)2022 NTT Corp. All Rights Reserved. nerdctl︓Docker互換なcontainerd⽤CLI 8 ● Docker⾵のUI/UX(composeもサポート) https://github.com/containerd/nerdctl ● 先進機能 ● ⾼速イメージpull(eStargz) ● P2Pイメージ共有(IPFS) ● 暗号化イメージ (OCIcrypt) ● イメージへの署名/検証(cosign) ● ⾼速rootless(bypass4netns) nerdctl CLI containerd API nerdctl run -it --rm alpine nerdctl build -t foo /dockerfile-dir nerdctl push ghcr.io/ktock/myalpine:latest nerdctl compose up
  • 9. Copyright(c)2022 NTT Corp. All Rights Reserved. containerdによるKubernetesでのコンテナ管理 9 ● 各ノード上でコンテナランタイムと してcontainerdを利⽤可能 ● kubeletはContainer Runtime Interface(CRI)経由で containerdを直接利⽤ ● EKS、AKS、GKEなどマネージド Kubernetesサービスでも利⽤可能 kubectl apply runc スケジュールされたPodの管理 Pod、コンテナ、イメージの管理 Linux機能を使いコンテナの作成 ノード apiserver kubelet CRI Pod割り当て
  • 10. Copyright(c)2022 NTT Corp. All Rights Reserved. GKEでのcontainerdへの移⾏ 10 https://cloud.google.com/kubernetes-engine/docs/deprecations/docker-containerd https://cloud.google.com/kubernetes-engine/docs/how-to/migrate-containerd ● Dockerベースのノードイメージは1.24以降でサポートされなくなる ● containerdベースのノードイメージ(Linuxノードでは1.19、Windowsでは1.21 からデフォルト)に移⾏する必要がある Dockerノードイメージ Containerdノードイメージ Dockerを含むContainer-Optimized OS (cos) Containerdを含むContainier-Optimized OS (cos_containerd) Dockerを含むUbuntu(ubuntu) Containerdを含むUbuntu(ubuntu_containerd) Dockerを含むWindows Server LTSC(windows_ltsc) Containerdを含むWindows Server LTSC(windows_ltsc_containerd) Dockerを含むWindows Server SAC(windows_sac) Containerdを含むWindows Server SAC(windows_sac_containerd) ● 移⾏作業のためのスクリプト`find-nodepools-to-migrate.sh`が提供されている • クラスタを解析して、移⾏のための推奨コマンドを⽰してくれる https://github.com/GoogleCloudPlatform/k8s-node-tools/blob/HEAD/migrating-to-containerd/find-nodepools-to-migrate.sh ● 推奨されたコマンド(`gcloud container clusters upgrade`)を使ってcontainerdに 移⾏可能
  • 11. Copyright(c)2022 NTT Corp. All Rights Reserved. EKSでのcontainerdへの移⾏ 11 https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/dockershim-deprecation.html https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/eks-optimized-ami.html#containerd-bootstrap ● Amazon Linux AMIは1.21現在でDockerがデフォルトランタイム ● バージョン1.23以降、含まれるランタイムはcontainerdのみになる ● 1.21現在までのAMIでも、ブートストラップフラグ` --container-runtime containerd`でcontainerdノードを利⽤可能 apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code managedNodeGroups: - name: my-nodegroup ami: eks-optimized-AMI-ID overrideBootstrapCommand: | #!/bin/bash set -eu -o pipefail /etc/eks/bootstrap.sh my-cluster --container-runtime containerd ● あるいは、ランタイムとしてcontainerdを利⽤しているBottlerocket AMIまたはEKS Fargateに移⾏するのも可 ● WindowsノードでもKubernetes 1.20より新しいバージョンでcontainerdを選択可能 ○ https://docs.aws.amazon.com/eks/latest/userguide/eks-optimized-windows-ami.html#containerd-bootstrap-windows
  • 12. Copyright(c)2022 NTT Corp. All Rights Reserved. AKSでのcontainerdへの移⾏ 12 https://docs.microsoft.com/en-us/azure/aks/cluster-configuration#container-runtime-configuration ● LinuxノードではKubernetes v1.19からcontainerdがランタイムとして使われている ● AKSのバージョンを`az aks upgrade`などで1.19以降にアップグレードすることで Linuxノードについてはcontainerdへ移⾏可能 ● とはいえすでに1.19以前はEOLのため、サポートされているAKS全バージョンでLinux ノードではcontainerdが使われていることになる ● Windowsノードでは1.20からcontainerdを利⽤可能。1.22以前のクラスタでは Dockerがデフォルト。1.23からはcontainerdがデフォルトになる。 ○ `az aks nodepool upgrade`などで移⾏可能︓https://docs.microsoft.com/en-us/azure/aks/windows- container-cli#optional-using-containerd-with-windows-server-node-pools
  • 13. Copyright(c)2022 NTT Corp. All Rights Reserved. kubeadmでのcontainerdへの移⾏ 13 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control- plane-node ● ノードにDockerが稼働していればcontainerdも既に稼働している ● kubeadm(v1.23現在)はDockerを優先的に使⽤するので、明⽰的にcontainerdのソケ ットパス`--cri-socket=/run/containerd/containerd.sock`を指定する必要がある sudo kubeadm reset sudo kubeadm join 192.168.56.120:6443 --cri-socket=/run/containerd/containerd.sock --token <省略> --discovery-token-ca-cert-hash <省略> ● ここで、containerdのconfig(/etc/containerd/config.toml)に`disabled_plugins = [“cri”]`が指定されてないことを要確認
  • 14. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: イメージを作り直す必要はあるか︖ 14 A. No。既存のコンテナイメージがそのままcontainerdで使える。 標準準拠ランタイム Docker Docker BuildKit Kaniko イメージビルダ etc… etc… ● イメージには標準仕様があるのでcontainerd移⾏後も引き続き実⾏可能 標準準拠イメージ
  • 15. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: レジストリはそのまま使えるか︖ 15 A. Yes。ただしレジストリミラー等の設定は移⾏が必要。 ● レジストリには標準仕様があるのでcontainerd移⾏後も引き続き利⽤可能 ● ただし、`/etc/docker/`にレジストリクライアント関連の設定(ミラーや証明書など) をしていた場合は、`/etc/containerd/`で設定しなおす必要がある • 設定⽅法(containerd >= 1.5)︓ https://github.com/containerd/containerd/blob/v1.6.1/docs/hosts.md 標準準拠レジストリ 標準準拠ランタイム Docker pull Docker BuildKit Kaniko イメージビルダ push etc… etc… 標準準拠イメージ
  • 16. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: ノードの作り直しは必要か︖ 16 ● GKE/EKS/AKSでは前述の通りノードの更新が必要。 ● kubeadmでは、厳密にはNo。運⽤上はYes。 • Dockerが稼働していればcontainerdも稼働している • しかしDockerを維持する理由がないならばDocker無 しでノードを作り直した⽅が良い containerd Docker Kubernetes (kubelet) runc クラウドの場合︓Yes。 kubeadmの場合︓厳密にはNo。運⽤上はYes。 A.
  • 17. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: ノードのデバッグに`docker`コマンドは使い続けられるか︖ 17 A. No。代わりにnerdctlが使える。 $ sudo nerdctl --namespace=k8s.io ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fe5fe717d05 k8s.gcr.io/pause:3.5 "/pause" 9 minutes ago Up k8s://kube-system/etcd-ktock 226a45b850fa k8s.gcr.io/kube-controller-manager:v1.23.4 "kube-controller-man…" 9 minutes ago Up k8s://kube-system/kube-controller-manager-ktock/kube-controller-manager ・・・ `--namespace=k8s.io`を指定するとKubernetesのコンテナをDocker同様のUIでデバッグ可能 ● 他にもノード上で利⽤可能なCLIはあるが、独特なUIに慣れが必要 • ctr: containerdに付属するデバッグ専⽤CLI。containerd APIに⾁薄した操作(e.g. snapshots、contents)や、containerd⾃体のデバッグに有⽤。 • https://github.com/containerd/containerd/tree/main/cmd/ctr • crictl: Kubernetes SIG Nodeで開発されるCRI⽤CLI。YAMLファイルでPod,コンテ ナ,イメージを操作可能 • https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md
  • 18. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: ノードのデバッグに`docker`コマンドは使い続けられるか︖ 18 $ mkdir -p /tmp/ctx && cat <<EOF > /tmp/ctx/Dockerfile FROM alpine:3.15 CMD [ "sh", "-c", "while true ; do echo hello ; sleep 1 ; done" ] EOF $ sudo nerdctl --namespace k8s.io build -t foo /tmp/ctx $ kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: foo spec: containers: - name: foo image: foo imagePullPolicy: Never EOF $ kubectl logs foo hello `nerdctl build`を使ってノード上で イメージをビルドして実⾏することも可能 A. No。代わりにnerdctlが使える。
  • 19. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: ログ管理に影響はあるか︖ 19 A. ログ基盤がDocker依存の設定をもつ場合は修正の必要あり。 ● `/var/log/pods`のログフォーマットはDockerとCRIランタイムで異なる ● ⾮マネージドなログ基盤で、Docker⽤のパーサしか設定されていなかったり、Docker APIに依存してログ収集しているなど、Docker依存の設定がある場合は変更が必要 {"log":"Log line is here¥n","stream":"stdout","time":"2019-01-01T11:11:11.111111111Z"} https://docs.docker.com/config/containers/logging/json-file/ 2016-10-06T00:17:09.669794202Z stdout P log content 1 https://github.com/kubernetes/kubernetes/blob/9a8defda15e4c34e9c1989 75968d9619f48a0786/pkg/kubelet/kuberuntime/logs/logs.go#L125-L169 Dockerのログフォーマット CRIランタイム(containerd含)のログフォーマット
  • 20. Copyright(c)2022 NTT Corp. All Rights Reserved. FAQ: Pod内で`docker`コマンドは引き続き利⽤可能か︖ 20 ● GKE: Dockerに直接依存しないようワークロードをアップデートすべき。 • https://cloud.google.com/kubernetes-engine/docs/deprecations/docker-containerd#impact_of_migrating ● EKS: Docker socketをマウントするアプリケーションでは変更が必要になる。 • https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/dockershim-deprecation.html ● AKS: Dockerは利⽤不可。 • https://docs.microsoft.com/en-us/azure/aks/cluster-configuration#containerd-limitationsdifferences ● kubeadm: ノード上でCRIランタイムとしてcontainerdを使いつつ、Dockerも稼働させ ておけば引き続き可能。 Pod内でDockerデーモンを稼働させる場合︓Yes ノード上のDockerに依存する場合︓クラウドでは移⾏が推奨されている。 kubeadm利⽤時はYes。 A.
  • 21. Copyright(c)2022 NTT Corp. All Rights Reserved. Cluster FAQ: Pod内で`docker`コマンドは引き続き利⽤可能か︖ 21 BuildKit buildctl BuildKit BuildKit BuildKit Service BuildKit buildctl BuildKit BuildKit BuildKit buildctl + BuildKit kubectl Deployment+Service StatefulSet Job ランダムロードバランシング。 レジストリを介したキャッシ ュ共有により⾼速なビルドが 可能。 クライアント側でのロードバ ランシング。consistent hashを使えば効率的にロー カルキャッシュを活⽤可能。 ワンショットなビルド実⾏。 BuildKitデーモンの稼動が不 要。ローカルキャッシュはビ ルドのたびに削除。 Cluster Cluster Kubernetes上でのビルドにはBuildKitの利⽤も有⽤ https://github.com/moby/buildkit/tree/master/examples/kubernetes
  • 22. Copyright(c)2022 NTT Corp. All Rights Reserved. 22 containerd・nerdctlの持つ様々な機能
  • 23. Copyright(c)2022 NTT Corp. All Rights Reserved. containerd・nerdctlの持つ様々な機能 23 ● nerdctl コマンドの使い⽅は、docker コマンドの使い⽅とだいたい同じ ● 単に docker コマンドの置き換えを⽬指しているわけではなくて、コンテナ ランタイム関連の新機能を実験、普及展開するためのプラットフォームとし て開発している ○ ⾼速イメージpull(eStargz) ○ P2Pイメージ共有(IPFS) ○ 暗号化イメージ (OCIcrypt) ○ イメージへの署名/検証(cosign) ○ ⾼速rootless(bypass4netns)
  • 24. Copyright(c)2022 NTT Corp. All Rights Reserved. ⾼速なイメージPull(eStargz) 24 ● Lazy pulling: イメージのpull完了を待たずにコンテナを起動可能 ● eStargz: OCI仕様に後⽅互換のlazy pulling可能なイメージ形式 • lazy pulling⾮対応なランタイムでも通常のイメージとして扱える 0 10 20 30 40 50 estargz estargz-noopt legacy Start up time of python:3.7 (print “hello”) pull create run [sec ] Figure from “Faster Container Image Distribution on a Variety of Tools with Lazy Pulling - Kohei Tokunaga & Tao Peng. KubeCon+CloudNativeCon North America 2021. https://sched.co/lV2a “ $ nerdctl –-snapshotter=stargz run –it ghcr.io/stargz-containers/python:3.9-esgz https://github.com/containerd/nerdctl/blob/master/docs/stargz.md nerdctl Kubernetes
  • 25. Copyright(c)2022 NTT Corp. All Rights Reserved. P2Pイメージ共有(IPFS) 25 nerdctl push ipfs://ubuntu:20.04 peer peer IPFS nerdctl run ipfs://bafkreicq4dg6nkef5ju422ptedcwfz6kcvpvvhuqeykfrwq5krazf3muze ● P2Pデータ共有プロトコルのIPFSを使ってコンテナイメージをP2P共有可能 ● nerdctl各コマンドで”ipfs://CID“の形式でIPFS上のイメージを利⽤可能 ● eStargzのlazy pulling、OCICryptなども依然利⽤可能 Experimental https://github.com/containerd/nerdctl/blob/master/docs/ipfs.md nerdctl Kubernetes ※Kubernetesではnerdctl付 属のOCI互換プロキシを⽤いる
  • 26. Copyright(c)2022 NTT Corp. All Rights Reserved. イメージ暗号化・復号化(OCICrypt) 26 ● キーペアを⽤いて、イメージの暗号化が可能 ● 暗号化したイメージはcontainerdでPullして復号、実⾏できる Registry image image 公開鍵 秘密鍵 イメージの暗号化 イメージの復号 nerdctl image encrypt nerdctl image decrypt https://github.com/containerd/nerdctl/blob/master/docs/ocicrypt.md nerdctl Kubernetes
  • 27. Copyright(c)2022 NTT Corp. All Rights Reserved. イメージ署名・検証(cosign) 27 ● 署名を⽤いて、イメージが改竄されていないかを検証できる ● Notaryに似ているが、最近はcosignが流⾏りつつある Registry image 秘密鍵 公開鍵 イメージの署名 イメージの検証 nerdctl push --sign=cosign nerdctl pull --verify=cosign https://github.com/containerd/nerdctl/blob/master/docs/cosign.md nerdctl Kubernetes ※Kubernetesではcosign付属 のadmission controllerを使⽤ image
  • 28. Copyright(c)2022 NTT Corp. All Rights Reserved. ⾼速rootless(bypass4netns) 28 ● rootlessコンテナでもrootfulと同等以上のNW性能を得られる ● rootlessコンテナに従来存在したユーザ空間TCP/IPスタック(slirp4netns)のネットワー クオーバヘッドを回避 • SECCOMP_IOCTL_NOTIF_ADDFD で、bind(2) や connect(2) をホスト側にバイパ スしている Experimental 引⽤元︓”インターンレポート: RootlessコンテナのTCP/IP⾼速化”. https://medium.com/nttlabs/accelerating-rootless-container-network-29d0e908dda4 https://github.com/containerd/nerdctl/blob/master/docs/rootless.md nerdctl
  • 29. Copyright(c)2022 NTT Corp. All Rights Reserved. その他 29 ● 完全にread-onlyなmountが出来る: nerdctl run -v /mnt:/mnt:rro ○ docker run -v /mnt:/mnt:ro だと、/mnt/usb とかread-only にならない ● nerdctl runの--netは複数指定できる (コンテナを複数ネットワークに同時接続できる) ○ DockerでもComposeでなら同じことが出来るが、docker runでは出来ない ● FreeBSD コンテナ (jails) も少しだけ動く ○ ネットワークには未対応 ● CNIやOCIなどの標準への準拠度が⾼い ○ nerdctl はCNI対応、docker は未対応 ○ nerdctl save/nerdctl load はOCI Image SpecとDocker Image Specの両⽅対応、 docker save/docker load はOCI Image Spec未対応
  • 30. Copyright(c)2022 NTT Corp. All Rights Reserved. containerdに移⾏すると出来なくなること 30 ● Kubernetesノード上での docker コマンド使⽤ ○ nerdctlを代わりに使⽤できる ● Docker REST API ○ Docker REST API に頼るアプリは動かない ○ docker コマンドを直に exec するアプリは、nerdctl を exec するように書き換 えるだけで動く ● Docker Swarm ○ コンテナオーケストレーションにはKubernetesやNomadを利⽤できる nerdctl –-namespace=k8s.io build -t foo:1.2.3 .
  • 31. Copyright(c)2022 NTT Corp. All Rights Reserved. 31 containerd・nerdctlへの移⾏⽅法 ※Kubernetesの場合の移⾏⽅法は前述 (スライド10-13)
  • 32. Copyright(c)2022 NTT Corp. All Rights Reserved. containerd・nerdctl への移⾏(linux) 32 https://github.com/containerd/nerdctl/releases $ sudo systemctl enable --now containerd $ sudo nerdctl run -d --name nginx -p 80:80 nginx:alpine $ containerd-rootless-setuptool.sh install $ nerdctl run -d --name nginx -p 8080:80 nginx:alpine Rootful Rootless tarballにcontainerd、nerdctl、runc等のバイナリ⼀式が全て含まれている (/usr/local などのパスに展開)
  • 33. Copyright(c)2022 NTT Corp. All Rights Reserved. containerd・nerdctl への移⾏(macOS) 33 ● Lima (macOS⽤のWSL2のようなもの)に containerd・nerdctl も付属 ● ホストのホームディレクトリが、ゲストからも⾒える ● ゲストのlocalhostに、ホストからもlocalhostとしてアクセスできる https://github.com/lima-vm/lima $ brew install lima $ limactl start $ lima nerdctl run …
  • 34. Copyright(c)2022 NTT Corp. All Rights Reserved. containerd・nerdctl への移⾏(macOS) 34 ● Rancher Desktop にも containerd・nerdctl が付属 ○ 内部的にはやはりLima ○ GUI付き ○ https://rancherdesktop.io/
  • 35. Copyright(c)2022 NTT Corp. All Rights Reserved. containerd・nerdctl への移⾏(Windows) 35 ● LinuxコンテナはWSL2上で動かせる ● Rancher Desktop for Windows にも containerd・nerdctl が付属 ● 内部的にはWSL2 ● Windowsネイティブなコンテナにも対応 (nerdctlではexperimental) ● https://github.com/containerd/nerdctl/issues/28
  • 36. Copyright(c)2022 NTT Corp. All Rights Reserved. まとめ 36 ● Docker から containerd への移⾏が進んでいる ● kubeadmの場合は、--cri-socket=/run/containerd/containerd.sock を渡すだけ ● 従来の Docker イメージはそのまま使える ● docker コマンドの代わりに nerdctl (contaiNERD CTL) が使える ○ ただの docker コマンドの置き換えではなく、いろいろな新機能がついている (⾼速イメージPull、暗号化、...) ○ macOS でもすぐ始められる (Windowsの場合はWSL2) $ brew install lima $ limactl start $ lima nerdctl run …