SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
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 …

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
Kubernetesによる機械学習基盤への挑戦
Kubernetesによる機械学習基盤への挑戦Kubernetesによる機械学習基盤への挑戦
Kubernetesによる機械学習基盤への挑戦
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
Guide To AGPL
Guide To AGPLGuide To AGPL
Guide To AGPL
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそうPython 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
入門 Kubeflow ~Kubernetesで機械学習をはじめるために~ (NTT Tech Conference #4 講演資料)
 
Paxos
PaxosPaxos
Paxos
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 

Semelhante a Dockerからcontainerdへの移行

Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Masahiro Nagano
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
Kazuyuki Mori
 

Semelhante a Dockerからcontainerdへの移行 (20)

Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
Docker/Aarukas入門ハンズオン資料~第1回さくらとコンテナの夕べ #さくらの夕べ 番外編
 
Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話Docker ComposeでMastodonが必要なものを梱包する話
Docker ComposeでMastodonが必要なものを梱包する話
 
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
そろそろ知っておきたい!!コンテナ技術とDockerのキホンそろそろ知っておきたい!!コンテナ技術とDockerのキホン
そろそろ知っておきたい!!コンテナ技術と Dockerのキホン
 
Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519Webアプリケーション開発者のためのDockerハンズオン20210519
Webアプリケーション開発者のためのDockerハンズオン20210519
 
Docker Swarm モード にゅうもん
Docker Swarm モード にゅうもんDocker Swarm モード にゅうもん
Docker Swarm モード にゅうもん
 
Webアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオンWebアプリケーション開発者のためのDockerハンズオン
Webアプリケーション開発者のためのDockerハンズオン
 
Docker入門
Docker入門Docker入門
Docker入門
 
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
 
Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法Docker for Windows & Web Apps for Containers 実践活用技法
Docker for Windows & Web Apps for Containers 実践活用技法
 
Docker超入門
Docker超入門Docker超入門
Docker超入門
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門
 
Dockerでlamp環境を作って見る
Dockerでlamp環境を作って見るDockerでlamp環境を作って見る
Dockerでlamp環境を作って見る
 
Dockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しようDockerでらくらく開発・運用を体感しよう
Dockerでらくらく開発・運用を体感しよう
 
Dockerハンズオン
DockerハンズオンDockerハンズオン
Dockerハンズオン
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念DockerとDocker Hubの操作と概念
DockerとDocker Hubの操作と概念
 
Docker講習会資料
Docker講習会資料Docker講習会資料
Docker講習会資料
 
コンテナ on Windows
コンテナ on Windowsコンテナ on Windows
コンテナ on Windows
 

Mais de Kohei Tokunaga

Mais de Kohei Tokunaga (17)

P2P Container Image Distribution on IPFS With containerd and nerdctl
P2P Container Image Distribution on IPFS With containerd and nerdctlP2P Container Image Distribution on IPFS With containerd and nerdctl
P2P Container Image Distribution on IPFS With containerd and nerdctl
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
Faster Container Image Distribution on a Variety of Tools with Lazy Pulling
Faster Container Image Distribution on a Variety of Tools with Lazy PullingFaster Container Image Distribution on a Variety of Tools with Lazy Pulling
Faster Container Image Distribution on a Variety of Tools with Lazy Pulling
 
Introduction and Deep Dive Into Containerd
Introduction and Deep Dive Into ContainerdIntroduction and Deep Dive Into Containerd
Introduction and Deep Dive Into Containerd
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
Starting up Containers Super Fast With Lazy Pulling of Images
Starting up Containers Super Fast With Lazy Pulling of ImagesStarting up Containers Super Fast With Lazy Pulling of Images
Starting up Containers Super Fast With Lazy Pulling of Images
 
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話
 
The overview of lazypull with containerd Remote Snapshotter & Stargz Snapshotter
The overview of lazypull with containerd Remote Snapshotter & Stargz SnapshotterThe overview of lazypull with containerd Remote Snapshotter & Stargz Snapshotter
The overview of lazypull with containerd Remote Snapshotter & Stargz Snapshotter
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
 
Startup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image DistributionStartup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image Distribution
 
Stargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略してcontainerdでコンテナを高速に起動する
 
OCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰するOCIランタイムの筆頭「runc」を俯瞰する
OCIランタイムの筆頭「runc」を俯瞰する
 
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
OCIv2?!軽量高速なイケてる次世代イメージ仕様の最新動向を抑えよう!
 
5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト
5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト
5分で振り返るKubeCon EU 2019:ランタイムとイメージの話題ダイジェスト
 
今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた今話題のいろいろなコンテナランタイムを比較してみた
今話題のいろいろなコンテナランタイムを比較してみた
 

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 …