Поиск по сайту:

Альтернативы 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.