Container Runtime — это программный инструмент или компонент, отвечающий за создание контейнеров и управление ими на уровне операционной системы. Это один из основных компонентов технологии контейнеризации, который используется для запуска приложений внутри контейнеров и обеспечивает такие функции, как изоляция, управление ресурсами и безопасность. В Kubernetes среда выполнения контейнера — это компонент, отвечающий за управление контейнерами и их запуск. В прошлом Docker был наиболее часто используемой средой выполнения контейнеров, но со временем контейнеры стали еще одним популярным выбором среды выполнения контейнеров для Kubernetes.
Описание. Dockershim был удален из проекта Kubernetes начиная с версии Kubernetes 1.24.
К основным задачам среды выполнения контейнера относятся:
В сегодняшней тенденции облачных технологий технология контейнеризации стала основным выбором для развертывания современных приложений. Kubernetes (K8s) — популярная система оркестрации контейнеров, широко используемая при управлении крупномасштабными кластерами контейнеров. В K8s выбор среды выполнения контейнера играет решающую роль в производительности, надежности и безопасности. В этой статье мы сравним две распространенные среды выполнения контейнеров K8s: Containerd и Docker, а также рассмотрим их сходства и различия.
Появление Docker, одной из первых контейнерных технологий, подорвало традиционные методы виртуализации и позволило упаковывать, доставлять и эксплуатировать приложения посредством облегченной контейнеризации. Docker сыграл ключевую роль в популяризации контейнерной технологии. Его удобные инструменты командной строки и графический интерфейс делают контейнерную технологию более удобной и простой в использовании для разработчиков. На какое-то время Docker стал почти синонимом контейнеризации. Однако с появлением Kubernetes позиции Docker в K8s постепенно подвергаются сомнению. С одной стороны, Docker, как полноценная контейнерная платформа, включает в себя множество функций, которые не нужны K8s, что приводит к пустой трате ресурсов. С другой стороны, сам K8s предоставляет функции оркестрации и планирования контейнеров, которые пересекаются с Docker, вызывая определенную степень конфликта. Чтобы не допустить доминирования Docker, реализация Docker была разделена на несколько стандартизированных модулей. Цель стандартизации заключалась в том, чтобы модули могли быть заменены другими реализациями и не контролировались каким-либо одним производителем. Докер от
Он состоит из контейнера, поэтому контейнер является одним из основных компонентов Docker. Управление контейнерами в Docker в основном осуществляется через контейнер. Итак, что такое контейнер?
Containerd — это среда выполнения контейнеров с открытым исходным кодом, разработанная командой Docker. Она ориентирована на предоставление легкой и высокопроизводительной среды выполнения контейнеров. Будучи чистой средой выполнения контейнера, Containerd спроектирован так, чтобы лучше соответствовать архитектуре и потребностям K8s. Он требует меньше ресурсов, ускоряет время запуска и повышает производительность. Сообщество K8s признает преимущества Containerd и использует его в качестве стандартной среды выполнения контейнеров в экосистеме K8s. Containerd может управлять полным жизненным циклом контейнера на хосте: передачей и хранением образа контейнера, выполнением и управлением контейнером, хранилищем и сетью и т. д. Подробно, Containerd отвечает за следующие вещи:
Интерфейс среды выполнения контейнера (Container Runtime интерфейс), называемый CRI。 CRI представляет собой подключаемый интерфейс, который позволяет kubelet Возможность использовать различные среды выполнения контейнеров без перекомпиляции компонентов кластера. Вам нужна работающая среда выполнения контейнера на каждом узле кластера. так kubelet Можно начать Pod и его контейнеры. Интерфейс времени выполнения контейнера (CRI)да kubelet Основной протокол для связи со средами выполнения контейнеров.
На диаграмме архитектуры Kubernetes видно, что ниже Kubelet находится слой среды выполнения Contianer, который фактически взаимодействует с ОС. Эта среда выполнения контейнера действительно управляет всем жизненным циклом контейнера, извлекает образы и т. д. в рабочем состоянии.
Когда мы впервые используем Kubernetes, мы обычно используем Docker в качестве среды выполнения контейнера по умолчанию. Фактически, CRI поддерживается с версии Kubernetes 1.5. Через интерфейс CRI вы можете указать использование других сред выполнения контейнера в качестве бэкэнда Pod. , серверные части, поддерживающие CRI:
Когда Kubernetes предложил рабочую спецификацию CRI, Docker просто отделил контейнеры и не поддерживал стандарт CRI. Поскольку Docker был наиболее распространенной и авторитетной контейнерной технологией в то время, хотя Kuberentes предложил спецификацию интерфейса CRI, ей все равно необходимо было адаптировать соединение между CRI и Docker. Поэтому для подключения среды выполнения contianer Kubelet требовался промежуточный уровень или прокладка. и Докер. Итак, в kubelet был добавлен Dockershim (shim означает временный и совместимый). При использовании Docker в качестве среды выполнения фактический процесс запуска контейнера выглядит следующим образом:
На этом этапе компонент dockershim находится в коде Kubelet, а это значит, что Dockershim разрабатывается и поддерживается организацией K8S! Поскольку выпуск версии компании Docker не может контролироваться и управляться организацией K8S, каждый раз, когда Docker выпускает новый выпуск, организация K8S должна сосредоточиться на быстром обновлении и поддержке Dockershim. Kubernetes версии 1.24 официально удаляет dockershim и объявляет его устаревшим. Суть этого дела — отказаться от встроенной функции dockershim и напрямую подключиться к Containerd (который в будущем будет поддерживать CRI). Этот метод более стандартен, а вызывающая ссылка проще.
runtime да docker Цепочка вызовов на данный момент: отношение вызова: kubelet --> dockershim (существовать kubelet в ходе выполнения) --> dockerd --> containerd runtime да containerd Цепочка вызовов на данный момент: отношение вызова: kubelet --> cri plugin(существовать containerd в ходе выполнения) --> containerd Резюме: с точки зрения k8s выбирайте Containerd Еще лучше в качестве компонента среды выполнения, потому что Containerd Цепочка вызовов короче, имеет меньше компонентов, более стабильна и занимает меньше ресурсов узла.
ctr да containerd Клиентский инструмент. crictl да CRI Совместимый интерфейс командной строки среды выполнения контейнера, который можно использовать для проверки и отладки. k8s Среды выполнения контейнеров и приложения на узле. ctr -v Выходное изда containerd версия, критл -v Выходное издаток k8s версия, по результатам видно, что можно думать crictl дафор k8s из.
docker | ctr(containerd) | crictl(kubernetes) | |
---|---|---|---|
Просмотр запущенных контейнеров | docker ps | ctr task ls/ctr container ls | crictl ps |
Посмотреть изображение | docker images | ctr image ls | crictl images |
Просмотр журналов контейнера | docker logs | никто | crictl logs |
Просмотр информации о данных контейнера | docker inspect | ctr container info | crictl inspect |
Просмотр ресурсов контейнера | docker stats | никто | crictl stats |
Запустить/остановить существующие контейнеры | docker start/stop | ctr task start/kill | crictl start/stop |
Запустить новый контейнер | docker run | ctr run | никто (самая маленькая единица — капсула) |
Изменить метку изображения | docker tag | ctr image tag | никто |
Создать новый контейнер | docker create | ctr container create | crictl create |
Импортировать изображение | docker load | ctr image import | никто |
Экспортировать изображение | docker save | ctr image export | никто |
Удалить контейнер | docker rm | ctr container rm | crictl rm |
Удалить изображение | docker rmi | ctr image rm | crictl rmi |
Вытащить изображение | docker pull | ctr image pull | ctictl pull |
Отправить изображение | docker push | ctr image push | никто |
Выполнение команд внутри контейнера | docker exec | никто | crictl exec |