Container Runtime — это ключевой компонент Kubernetes, отвечающий за управление жизненным циклом образов и контейнеров.
При создании кластеров через платформу вы можете выбрать в качестве компонента рантайма либо Containerd, либо Docker.
Примечание: Kubernetes версии 1.24 и выше официально больше не поддерживает Docker runtime. Официально рекомендуемый рантайм — Containerd. Если вам всё же необходимо использовать Docker runtime, сначала нужно включить cri-docker в feature gate, после чего при создании кластера можно будет выбрать Docker в качестве компонента рантайма. Подробнее о работе с feature gates смотрите в разделе Feature Gate Configuration.
| Выберите Containerd | Выберите Docker |
|---|---|
|
|
| Containerd | Docker | Описание |
|---|---|---|
| crictl ps | docker ps | Просмотр запущенных контейнеров |
| crictl inspect | docker inspect | Просмотр деталей контейнера |
| crictl logs | docker logs | Просмотр логов контейнера |
| crictl exec | docker exec | Выполнение команд в контейнере |
| crictl attach | docker attach | Подключение к контейнеру |
| crictl stats | docker stats | Отображение использования ресурсов контейнером |
| crictl create | docker create | Создание контейнера |
| crictl start | docker start | Запуск контейнера |
| crictl stop | docker stop | Остановка контейнера |
| crictl rm | docker rm | Удаление контейнера |
| crictl images | docker images | Просмотр списка образов |
| crictl pull | docker pull | Загрузка образа |
| None | docker push | Отправка образа |
| crictl rmi | docker rmi | Удаление образа |
| crictl pods | None | Просмотр списка подов |
| crictl inspectp | None | Просмотр деталей пода |
| crictl runp | None | Запуск пода |
| crictl stopp | docker images | Просмотр образов |
| ctr images ls | None | Остановка пода |
| crictl stopp | docker load/save | Импорт/экспорт образов |
| ctr images import/export | None | Остановка пода |
| ctr images pull/push | docker pull/push | Загрузка/отправка образов |
| ctr images tag | docker tag | Тегирование образов |
Docker в качестве контейнерного рантайма Kubernetes имеет следующую цепочку вызовов:
kubelet > cri-dockerd > dockerd > containerd > runC
Containerd в качестве контейнерного рантайма Kubernetes имеет следующую цепочку вызовов:
kubelet > cri plugin (в процессе containerd) > containerd > runC
Итог: Несмотря на то, что dockerd добавляет такие возможности, как swarm cluster, docker build и Docker API, он может приводить к ошибкам и добавляет дополнительный уровень в цепочку вызовов. Containerd имеет более короткую цепочку вызовов, меньше компонентов, большую стабильность и меньше потребляет ресурсов узла.
| Сравнение | Docker | Containerd |
|---|---|---|
| Путь хранения | При использовании Docker в качестве контейнерного рантайма Kubernetes логи контейнеров хранятся Docker в каталогах вида /var/lib/docker/containers/$CONTAINERID. Kubelet создаёт символические ссылки в /var/log/pods и /var/log/containers, указывающие на файлы логов в этом каталоге. | При использовании Containerd в качестве контейнерного рантайма Kubernetes логи контейнеров хранятся Kubelet в каталоге /var/log/pods/$CONTAINER_NAME, при этом в каталоге /var/log/containers создаются символические ссылки на файлы логов. |
| Параметры конфигурации | Задаются в конфигурационном файле Docker:"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "5"} | Метод 1: Задаются параметрами kubelet:--container-log-max-files=5--container-log-max-size="100Mi"Метод 2: Задаются в KubeletConfiguration: "containerLogMaxSize": "100Mi","containerLogMaxFiles": 5, |
| Сохранение логов контейнеров на диске данных | Монтировать диск данных в "data-root" (по умолчанию /var/lib/docker). | Создать символическую ссылку /var/log/pods, указывающую на каталог на точке монтирования диска данных. |
| Сравнение | Docker | Containerd |
|---|---|---|
| Кто вызывает CNI | cri-dockerd | cri-plugin, встроенный в Containerd (начиная с containerd 1.1) |
| Как настраивать CNI | Параметры cri-dockerd: --cni-conf-dir, --cni-bin-dir, --cni-cache-dir | Конфигурационный файл Containerd (toml):[plugins.cri.cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d" |