Прим. перев.: Автор статьи — Melvin Dave Vivas, возглавляющий команду разработчиков и SRE-инженеров в сингапурском банке, — делится своим опытом знакомства с поддержкой Kubernetes в платформе Docker.
Когда в октябре прошлого года на DockerCon 2017 технический директор Docker Inc Соломон Хайкс (Solomon Hykes) анонсировал родную поддержку Kubernetes, мне стало очень любопытно, как это будет работать.

Поэтому после анонса я решил проверить наличие этой поддержки в Edge-версии, о чём писал Michael Frills в блоге Docker. Но на тот момент её не оказалось. И вот, после нескольких месяцев ожиданий, она наконец-то появилась.
Экспериментальная поддержка Kubernetes в Docker CE (Community Edition) была представлена в январском обновлении. В Release Notes сообщается, что она появилась с версии 17.12.0-ce. Сам я использую Edge, поэтому не уверен, что обновление доступно и в mainstream-версии.

В общем, увидев такое уведомление, я установил обновление. После инсталляции, однако, ещё требуется включить поддержку Kubernetes в настройках (Preferences):

После активации Kubernetes я попробовал выполнить команды с

«Из коробки» не заработало, но всё дело оказалось в моей специфичной конфигурации. Как сообщается в документации Docker, если вы раньше использовали Minikube, необходимо переключить контекст. Для этого выполните команду:

После этого всё работает — ошибки про таймаут пропали:

Время перейти к интересной части. Как нам обещали, команды
Деплой Stack'а в кластере Kubernetes:

Подождите несколько секунд, и вы увидите, что сервисы запустились. Сервисы в Kubernetes похожи на Services в Swarm, а поды — как контейнеры.

Больше информации о каждом сервисе можно получить с помощью такой команды:

Проверить контейнеры можно и с помощью

Для возможности получения доступа к сервису с хоста, которым в моём случае являлся компьютер с Mac, необходимо открыть сервис с использованием типа

После выполнения этих команд оба сервиса становятся доступными из браузера:

Отлично! Наш Stack запущен в кластере Kubernetes.
Включив Kubernetes в Docker CE, эта система станет оркестратором по умолчанию вместо Swarm. Если же вы хотите использовать Swarm одновременно с Kubernetes, необходимо выставлять переменной окружения
Задеплоим тот же Stack в Swarm:

Через несколько секунд запустятся сервисы:

Обратите внимание, что если вы хотите проверить Services/Stacks в Swarm, всегда (перед каждой командой) требуется определять значение переменной окружения

При этом

Раз у нас работает Kubernetes, давайте установим его dashboard. Для этого достаточно выполнить две команды:

После этого он станет доступен в браузере по адресу http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default.
Общий вид:

Просмотр View Deployments, Pods, ReplicaSets, Services:

Просмотр логов пода:

Читайте также в нашем блоге:
Когда в октябре прошлого года на DockerCon 2017 технический директор Docker Inc Соломон Хайкс (Solomon Hykes) анонсировал родную поддержку Kubernetes, мне стало очень любопытно, как это будет работать.

Поэтому после анонса я решил проверить наличие этой поддержки в Edge-версии, о чём писал Michael Frills в блоге Docker. Но на тот момент её не оказалось. И вот, после нескольких месяцев ожиданий, она наконец-то появилась.
Экспериментальная поддержка Kubernetes в Docker CE (Community Edition) была представлена в январском обновлении. В Release Notes сообщается, что она появилась с версии 17.12.0-ce. Сам я использую Edge, поэтому не уверен, что обновление доступно и в mainstream-версии.

В общем, увидев такое уведомление, я установил обновление. После инсталляции, однако, ещё требуется включить поддержку Kubernetes в настройках (Preferences):

После активации Kubernetes я попробовал выполнить команды с
kubectl
, однако подключение к серверу возвращало ошибку:
«Из коробки» не заработало, но всё дело оказалось в моей специфичной конфигурации. Как сообщается в документации Docker, если вы раньше использовали Minikube, необходимо переключить контекст. Для этого выполните команду:
$ kubectl config use-context docker-for-desktop

После этого всё работает — ошибки про таймаут пропали:

Время перейти к интересной части. Как нам обещали, команды
docker
должны работать и с Kubernetes в Docker. Создадим новый deployment на базе Compose-файла для docker stack. Я использовал demo-docker-kube-stack.yml
, который можно забрать из этого репозитория:version: "3.3"
services:
ms1:
image: melvindave/spring-boot-example
ports:
- "8080:8080"
networks:
- backend
deploy:
replicas: 3
nginx:
image: nginx
ports:
- "80:80"
networks:
- frontend
deploy:
replicas: 1
networks:
backend:
Деплой Stack'а в кластере Kubernetes:
$ docker stack deploy --namespace docker-kube-demo --compose-file demo-docker-kube-stack.yml demo-docker-kube-stack

Подождите несколько секунд, и вы увидите, что сервисы запустились. Сервисы в Kubernetes похожи на Services в Swarm, а поды — как контейнеры.

Больше информации о каждом сервисе можно получить с помощью такой команды:
$ kubectl describe services <service-name>

Проверить контейнеры можно и с помощью
docker ps
. Вывод должен быть эквивалентен kubectl get pods
:
Для возможности получения доступа к сервису с хоста, которым в моём случае являлся компьютер с Mac, необходимо открыть сервис с использованием типа
NodePort
:$ kubectl expose deployment ms1 --type=NodePort --name=ms1-service
$ kubectl expose deployment nginx --type=NodePort --name=nginx-service

После выполнения этих команд оба сервиса становятся доступными из браузера:

Отлично! Наш Stack запущен в кластере Kubernetes.
Одновременный запуск другого Stack'а в Swarm
Включив Kubernetes в Docker CE, эта система станет оркестратором по умолчанию вместо Swarm. Если же вы хотите использовать Swarm одновременно с Kubernetes, необходимо выставлять переменной окружения
DOCKER_ORCHESTRATOR
значение swarm
.Задеплоим тот же Stack в Swarm:
$ DOCKER_ORCHESTRATOR=swarm docker stack deploy --compose-file demo-docker-kube-stack.yml demo-docker-swarm-stack

Через несколько секунд запустятся сервисы:

Обратите внимание, что если вы хотите проверить Services/Stacks в Swarm, всегда (перед каждой командой) требуется определять значение переменной окружения
DOCKER_ORCHESTRATOR
. Если не менять её, то в роли оркестратора будет выступать Kubernetes:
При этом
docker ps
выведет список всех контейнеров, будь они в Kubernetes или в Swarm:
Kubernetes Dashboard
Раз у нас работает Kubernetes, давайте установим его dashboard. Для этого достаточно выполнить две команды:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
$ kubectl proxy

После этого он станет доступен в браузере по адресу http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default.
Общий вид:

Просмотр View Deployments, Pods, ReplicaSets, Services:

Просмотр логов пода:

P.S. от переводчика
Читайте также в нашем блоге:
- «Что и зачем Docker делает в Moby для интеграции с Kubernetes?»
- «CRI-O — альтернатива Docker для запуска контейнеров в Kubernetes».
- «Kubernetes 1.9: обзор основных новшеств».
- «Инфраструктура с Kubernetes как доступная услуга».
- «Обзор GUI-интерфейсов для управления Docker-контейнерами».
- «Шпаргалка с командами Docker».