Containerd - runtime для запуска контейнеров, который используется, например docker’ом. Также containerd предоставляет Container Runtime Interface, который использует Kubelet для запуска контейнеров. Часто встречается ситуация, когда на хосте установлен только containerd и было бы неплохо иметь возможность посмотреть что же запущено внутри и как оно работает.
Вообще, containerd представляет 3 утилиты для собственного управления:
- ctr - утилита входит в поставку containerd и позволяет получать отдебажить containerd
- netdctl - утилита с человеческим лицом для управления containerd - [
https://github.com/containerd/nerdctl](https://github.com/containerd/nerdctl)
- crictl - утилита для дебага CRI совместимых runtime - [
https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md](https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md)
Мы же сегодня немного посмотрим на ctr:
1. У containerd есть namespaces, по которым можно разделять образы, запущенные контейнеры и так далее, вывести список namespaces можно так:
# ctr ns list
NAME LABELS
default
k8s.io
Как видно, kubelet создает свой собственный namespace
k8s.io, в котором запускаются все контейнеры.
2. Мы можем посмотреть на список образов контейнеров в том или ином namespace:
# ctr -n k8s.io images ls | head -2
REF TYPE DIGEST SIZE PLATFORMS LABELS
docker.io/library/alpine:latest application/vnd.docker.distribution.manifest.list.v2+json sha256:8914eb54f968791faf6a8638949e480fef81e697984fba772b3976835194c6d4 3.2 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x io.cri-containerd.image=managed
3. Так же мы можем скачать нужный нам образ:
# ctr -n default image pull docker.io/library/postgres:14
docker.io/library/postgres:14: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:cfd6203fc331bdf87ddf8c0ae91d9a6a6eacd5f2037c8178b644f1bbc369fafe:
... skipped ...
elapsed: 5.7 s total: 101.6 (17.8 MiB/s)
Это часто бывает нужно для проверки возможности скачивания образов из приватных репозиториев - проверить что containerd принимает самоподписанный сертификат и так далее. К слову, аутентификацию в приватном registry можно настроить на уровне containerd и тогда не придется пихать всюду image pull secrets 🙂
4. Помимо этого вы можете подмонтировать образ контейнера в какую-нибудь директорию без запуска:
# ctr image mount docker.io/library/postgres:14 /mnt/
sha256:e242dad2cf72e07da948e090eb0f4cfd2a5e2820336ffc952afef4500a7ad117
/mnt/
[root@gis-s-app01 admin]# ls -la /mnt/
total 92
drwxr-xr-x. 1 root root 4096 Nov 30 21:10 .
dr-xr-xr-x. 18 root root 4096 Nov 27 21:06 ..
drwxr-xr-x. 2 root root 4096 Nov 14 03:00 bin
... skipped ...
5. Теперь самое главное! Контейнеры и задачи. Containerd разделяет эти две сущности. Суть в чем - контейнер (container) - это объект, который описывает окружение, что должно быть запущено и так далее. А вот задача (task) - это непосредственно процесс, который запускается в контейнере. Давайте посмотрим какие контейнеры у нас есть: