• Русский
  • Выбор контейнерного рантайма

    Содержание

    Overview

    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
    • Более короткая цепочка вызовов
    • Меньше компонентов
    • Более стабильный
    • Меньше потребляет ресурсов узла
    • Поддержка docker-in-docker
    • Возможность использовать команды docker build/push/save/load на узлах
    • Возможность вызова Docker API
    • Поддержка docker compose или docker swarm

    Отличия между Docker и Containerd

    Общие команды

    ContainerdDockerОписание
    crictl psdocker psПросмотр запущенных контейнеров
    crictl inspectdocker inspectПросмотр деталей контейнера
    crictl logsdocker logsПросмотр логов контейнера
    crictl execdocker execВыполнение команд в контейнере
    crictl attachdocker attachПодключение к контейнеру
    crictl statsdocker statsОтображение использования ресурсов контейнером
    crictl createdocker createСоздание контейнера
    crictl startdocker startЗапуск контейнера
    crictl stopdocker stopОстановка контейнера
    crictl rmdocker rmУдаление контейнера
    crictl imagesdocker imagesПросмотр списка образов
    crictl pulldocker pullЗагрузка образа
    Nonedocker pushОтправка образа
    crictl rmidocker rmiУдаление образа
    crictl podsNoneПросмотр списка подов
    crictl inspectpNoneПросмотр деталей пода
    crictl runpNoneЗапуск пода
    crictl stoppdocker imagesПросмотр образов
    ctr images lsNoneОстановка пода
    crictl stoppdocker load/saveИмпорт/экспорт образов
    ctr images import/exportNoneОстановка пода
    ctr images pull/pushdocker pull/pushЗагрузка/отправка образов
    ctr images tagdocker 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 имеет более короткую цепочку вызовов, меньше компонентов, большую стабильность и меньше потребляет ресурсов узла.

    Сравнение логов и параметров

    СравнениеDockerContainerd
    Путь храненияПри использовании 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, указывающую на каталог на точке монтирования диска данных.

    Сравнение CNI-сети

    СравнениеDockerContainerd
    Кто вызывает CNIcri-dockerdcri-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"