Альтернативы Kubernetes командам Docker
Docker обычно представляет собой первое знакомство разработчика с контейнерами. Kubernetes — это платформа оркестрации, которая решает проблемы, связанные с запуском контейнеров в производственной среде. Вот как команды Docker сопоставляются с их аналогами Kubernetes.
Вы не можете использовать интерфейс командной строки docker
для взаимодействия с контейнерами, работающими в Kubernetes. Kubernetes предоставляет собственный интерфейс командной строки, kubectl
, который помогает вам управлять кластером. Прочтите наше руководство по началу работы с kubectl
, если вы не знакомы с этим инструментом.
Ни одна из команд docker
не имеет такого же имени в kubectl
. Kubernetes предоставляет функциональность по-своему. Сами рабочие нагрузки принципиально различаются: Docker предназначен для одновременной работы с одним контейнером, тогда как Kubernetes позволяет управлять несколькими репликами.
Первое, на что следует обратить внимание, — это изменение терминологии. Docker относится к «контейнерам», в то время как Kubernetes использует «модули». Модуль может запускать один контейнер или несколько реплик, управляемых как единое целое. Помимо этой детали, когда вы видите «контейнер» в Docker, вы должны думать о «модуле» Kubernetes. Термины будут использоваться взаимозаменяемо в оставшейся части этой статьи.
Получение сведений о ваших контейнерах
В Docker вы используете docker ps -a
, чтобы увидеть все контейнеры на вашем компьютере.
Ближайшим эквивалентом Kubernetes является kubectl get pods
.
Вывод этих двух команд сильно отличается. Docker показывает больше информации о рабочей нагрузке, которую выполняет контейнер.
Kubernetes предоставит сведения об изображении и команде при использовании команды describe pod
. Вам нужно передать имя модуля. Это дает гораздо более подробную информацию, используя список вместо таблицы.
Выполнение команд в контейнерах
Docker позволяет выполнять команду в работающем контейнере с помощью docker exec
.
Эквивалент Kubernetes также называется exec
. Используйте имя модуля Kubernetes вместо имени контейнера Docker. Команда указывается немного по-другому — она должна быть отделена от имени пода последовательностью --
.
Вы можете использовать флаги -it
для получения интерактивного доступа так же, как и в Docker. Это сокращение для --stdin --tty
, и его следует использовать всякий раз, когда вы хотите запустить оболочку внутри модуля. Укажите имя оболочки, например bash
, в качестве команды.
Kubectl поддерживает команду attach
, когда вы хотите подключиться к процессу в уже запущенном контейнере. Он работает аналогично docker attach
, но вы должны передать флаги -it
, если вам нужен интерактивный доступ.
Просмотр журналов контейнеров
Чтобы просмотреть журналы контейнера с помощью Docker, используйте команду docker logs
. Добавление переключателя -f
будет «следить» за журналами, поэтому они будут непрерывно передаваться на ваш терминал.
Команда Kubectl logs
имеет тот же синтаксис. Укажите имя модуля так же, как Docker принимает имя контейнера.
И Docker, и Kubernetes собирают журналы из стандартных потоков вывода и стандартных ошибок (stdout
/stderr
) запущенных контейнеров. Kubernetes обрабатывает перезапуск контейнера иначе, чем Docker. В то время как в Docker перезапущенный контейнер добавляет свои журналы к существующим, Kubernetes создает новый журнал для каждого запуска. Вы можете получить журналы замененного контейнера, добавив флаг --previous
в команду logs
.
Создание контейнеров
Контейнеры Docker создаются с помощью команды run
. Вот как вы можете запустить сервер nginx
с помощью Docker:
docker run -d --name nginx --restart=always -p 80:80 nginx
Это создает контейнер с использованием базового образа nginx
и настраивает его на автоматический перезапуск. Сервер привязан к порту HTTP 80 по умолчанию.
Kubernetes требует, чтобы вы думали об абстракциях более высокого уровня при добавлении контейнеров в свой кластер. Вместо запуска контейнера вы создаете развертывание для представления своей рабочей нагрузки:
kubectl create deployment --image=nginx nginx
Это создаст развертывание nginx
. Модуль запускается автоматически; внутри модуля будет контейнер, на котором работает веб-сервер.
Создание развертывания не привязывает его контейнеры к каким-либо портам. Недавно созданный сервер еще недоступен. Порты должны быть открыты через службу. Поды эфемерны и могут содержать несколько реплицированных контейнеров. Службы определяют логическую коллекцию модулей и позволяют назначать им сетевые ресурсы, такие как IP-адрес и порт.
Предоставление развертывания nginx
на порту 80 позволит получить доступ к серверу:
kubectl expose deployment nginx --port=80 --name nginx-http
Попытка получить доступ к порту 80 на IP-адресе кластера по умолчанию теперь должна направить вас на сервер nginx
.
Kubectl напрямую не поддерживает другие параметры docker run
, такие как создание тома и привязка монтирования. Контейнеры, которым требуется постоянное хранилище, должны иметь тома, настроенные вручную с помощью команд kubectl
или манифеста тома.
Удаление контейнеров
Контейнеры Docker удаляются с помощью команды docker rm
с идентификатором контейнера.
Kubernetes не позволяет вам удалять контейнеры напрямую. Вместо этого вы работаете с развертыванием, создавшим модуль. Используйте команду kubectl удалить развертывание
, передав имя развертывания.
Docker позволяет останавливать контейнер, а не удалять его. Kubernetes удалил поддержку этого действия. Рекомендуемый способ временной приостановки развертывания — уменьшить количество реплик до 0. Если модули не запущены, рабочая нагрузка эффективно останавливается.
kubectl scale --replicas=0 deployment/my-deployment
Когда вы будете готовы возобновить развертывание, снова запустите команду scale
. Задайте для нового счетчика реплик значение 1
или выше. Использование большего количества реплик может повысить доступность вашей рабочей нагрузки.
Заключение
Между Docker CLI и kubectl
нет прямых параллелей. Синтаксис большинства команд Kubernetes отличается от их аналогов в Docker. Вам нужно будет изучить новые термины и параметры, прежде чем вы сможете перенести рабочие процессы на основе Docker в Kubernetes.
Во многих случаях не существует альтернативы kubectl
возможностям интерфейса командной строки Docker. Функциональность Docker ориентирована на концепцию контейнера. Kubernetes берет это и помещает в центр значительно расширенной экосистемы ресурсов.
Контейнеры редко рассматриваются изолированно. Вместо этого вам нужно будет работать с такими ресурсами, как развертывания, службы и наборы реплик. Вот почему изучение Kubernetes может показаться сложным, если рассматривать его с точки зрения пользователя Docker.
Если вы знакомы с основами Docker, переход на Kubernetes, тем не менее, должен быть относительно простым. Принципиальное отличие состоит в том, что то, что Docker видит в качестве контейнера, в Kubernetes обычно используется как агрегатный «модуль». Поды создаются «развертываниями», которые представляют рабочие нагрузки в вашем кластере. Если вы сомневаетесь, обратитесь к документации kubectl
, чтобы найти подходящее соответствие для команды Docker.