Прим. перев.: Автор статьи — Melvin Dave Vivas, возглавляющий команду разработчиков и SRE-инженеров в сингапурском банке, — делится своим опытом знакомства с поддержкой Kubernetes в платформе Docker.
Когда в октябре прошлого года на DockerCon 2017 технический директор Docker Inc Соломон Хайкс (Solomon Hykes) анонсировал родную поддержку Kubernetes, мне стало очень любопытно, как это будет работать.
![](https://habrastorage.org/r/w1560/webt/59/e6/da/59e6da1e8e30f685686004.png)
Поэтому после анонса я решил проверить наличие этой поддержки в Edge-версии, о чём писал Michael Frills в блоге Docker. Но на тот момент её не оказалось. И вот, после нескольких месяцев ожиданий, она наконец-то появилась.
Экспериментальная поддержка Kubernetes в Docker CE (Community Edition) была представлена в январском обновлении. В Release Notes сообщается, что она появилась с версии 17.12.0-ce. Сам я использую Edge, поэтому не уверен, что обновление доступно и в mainstream-версии.
![](https://habrastorage.org/r/w1560/webt/qf/u-/14/qfu-14mppaybkfvcfizv6i4mjvk.png)
В общем, увидев такое уведомление, я установил обновление. После инсталляции, однако, ещё требуется включить поддержку Kubernetes в настройках (Preferences):
![](https://habrastorage.org/r/w1560/webt/ia/ms/4v/iams4vfhuxaro5hpr7ojnuwhlmi.png)
После активации Kubernetes я попробовал выполнить команды с
![](https://habrastorage.org/r/w1560/webt/sd/ob/kp/sdobkpzpimbyp77ltyk9gasuz6k.png)
«Из коробки» не заработало, но всё дело оказалось в моей специфичной конфигурации. Как сообщается в документации Docker, если вы раньше использовали Minikube, необходимо переключить контекст. Для этого выполните команду:
![](https://habrastorage.org/r/w1560/webt/kr/wr/wf/krwrwfodj9wom9cq07kaz3mimik.png)
После этого всё работает — ошибки про таймаут пропали:
![](https://habrastorage.org/r/w1560/webt/mi/61/8h/mi618hg8acwmydqeqdsdpbvsha8.png)
Время перейти к интересной части. Как нам обещали, команды
Деплой Stack'а в кластере Kubernetes:
![](https://habrastorage.org/r/w1560/webt/g1/pj/ef/g1pjefo-yvnrfnqb3lax6jx0ziu.png)
Подождите несколько секунд, и вы увидите, что сервисы запустились. Сервисы в Kubernetes похожи на Services в Swarm, а поды — как контейнеры.
![](https://habrastorage.org/r/w1560/webt/cg/qc/aj/cgqcajrdezomogzuzawj7adtj3s.png)
Больше информации о каждом сервисе можно получить с помощью такой команды:
![](https://habrastorage.org/r/w1560/webt/di/6p/fv/di6pfvw5okzdrz3l3mwzi_ibl-e.png)
Проверить контейнеры можно и с помощью
![](https://habrastorage.org/r/w1560/webt/pz/ms/ry/pzmsrylollhqmbh1zzkvfay8gm4.png)
Для возможности получения доступа к сервису с хоста, которым в моём случае являлся компьютер с Mac, необходимо открыть сервис с использованием типа
![](https://habrastorage.org/r/w1560/webt/3k/1c/bz/3k1cbztkkxs65uoo0c8zrcnytuy.png)
После выполнения этих команд оба сервиса становятся доступными из браузера:
![](https://habrastorage.org/r/w1560/webt/5i/mq/mi/5imqmijzxgkzh--ka4ns6ic8wty.png)
Отлично! Наш Stack запущен в кластере Kubernetes.
Включив Kubernetes в Docker CE, эта система станет оркестратором по умолчанию вместо Swarm. Если же вы хотите использовать Swarm одновременно с Kubernetes, необходимо выставлять переменной окружения
Задеплоим тот же Stack в Swarm:
![](https://habrastorage.org/r/w1560/webt/se/zl/wm/sezlwm8ilcwdhgjkf5catusj4mm.png)
Через несколько секунд запустятся сервисы:
![](https://habrastorage.org/r/w1560/webt/ic/tv/4k/ictv4kvngvyq4-se8hxn9ohhc_g.png)
Обратите внимание, что если вы хотите проверить Services/Stacks в Swarm, всегда (перед каждой командой) требуется определять значение переменной окружения
![](https://habrastorage.org/r/w1560/webt/6w/6g/qk/6w6gqktaeaunesowe-tw41cvyqm.png)
При этом
![](https://habrastorage.org/r/w1560/webt/3l/av/3m/3lav3m5cfbepofj5iagwtsvp3zo.png)
Раз у нас работает Kubernetes, давайте установим его dashboard. Для этого достаточно выполнить две команды:
![](https://habrastorage.org/r/w1560/webt/tr/dt/kh/trdtkhlgcqc9jg4nvz1zlrgkanc.png)
После этого он станет доступен в браузере по адресу http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default.
Общий вид:
![](https://habrastorage.org/r/w1560/webt/_i/a6/ls/_ia6lsf4ifneyqownb1oy_yhkyu.png)
Просмотр View Deployments, Pods, ReplicaSets, Services:
![](https://habrastorage.org/r/w1560/webt/cm/e7/ty/cme7typqfgro4y9wekmbkqvm-_0.png)
Просмотр логов пода:
![](https://habrastorage.org/r/w1560/webt/bc/9f/zj/bc9fzjz1jdfslbis0jn7tz55-py.png)
Читайте также в нашем блоге:
Когда в октябре прошлого года на DockerCon 2017 технический директор Docker Inc Соломон Хайкс (Solomon Hykes) анонсировал родную поддержку Kubernetes, мне стало очень любопытно, как это будет работать.
![](https://habrastorage.org/webt/59/e6/da/59e6da1e8e30f685686004.png)
Поэтому после анонса я решил проверить наличие этой поддержки в Edge-версии, о чём писал Michael Frills в блоге Docker. Но на тот момент её не оказалось. И вот, после нескольких месяцев ожиданий, она наконец-то появилась.
Экспериментальная поддержка Kubernetes в Docker CE (Community Edition) была представлена в январском обновлении. В Release Notes сообщается, что она появилась с версии 17.12.0-ce. Сам я использую Edge, поэтому не уверен, что обновление доступно и в mainstream-версии.
![](https://habrastorage.org/webt/qf/u-/14/qfu-14mppaybkfvcfizv6i4mjvk.png)
В общем, увидев такое уведомление, я установил обновление. После инсталляции, однако, ещё требуется включить поддержку Kubernetes в настройках (Preferences):
![](https://habrastorage.org/webt/ia/ms/4v/iams4vfhuxaro5hpr7ojnuwhlmi.png)
После активации Kubernetes я попробовал выполнить команды с
kubectl
, однако подключение к серверу возвращало ошибку:![](https://habrastorage.org/webt/sd/ob/kp/sdobkpzpimbyp77ltyk9gasuz6k.png)
«Из коробки» не заработало, но всё дело оказалось в моей специфичной конфигурации. Как сообщается в документации Docker, если вы раньше использовали Minikube, необходимо переключить контекст. Для этого выполните команду:
$ kubectl config use-context docker-for-desktop
![](https://habrastorage.org/webt/kr/wr/wf/krwrwfodj9wom9cq07kaz3mimik.png)
После этого всё работает — ошибки про таймаут пропали:
![](https://habrastorage.org/webt/mi/61/8h/mi618hg8acwmydqeqdsdpbvsha8.png)
Время перейти к интересной части. Как нам обещали, команды
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
![](https://habrastorage.org/webt/g1/pj/ef/g1pjefo-yvnrfnqb3lax6jx0ziu.png)
Подождите несколько секунд, и вы увидите, что сервисы запустились. Сервисы в Kubernetes похожи на Services в Swarm, а поды — как контейнеры.
![](https://habrastorage.org/webt/cg/qc/aj/cgqcajrdezomogzuzawj7adtj3s.png)
Больше информации о каждом сервисе можно получить с помощью такой команды:
$ kubectl describe services <service-name>
![](https://habrastorage.org/webt/di/6p/fv/di6pfvw5okzdrz3l3mwzi_ibl-e.png)
Проверить контейнеры можно и с помощью
docker ps
. Вывод должен быть эквивалентен kubectl get pods
:![](https://habrastorage.org/webt/pz/ms/ry/pzmsrylollhqmbh1zzkvfay8gm4.png)
Для возможности получения доступа к сервису с хоста, которым в моём случае являлся компьютер с Mac, необходимо открыть сервис с использованием типа
NodePort
:$ kubectl expose deployment ms1 --type=NodePort --name=ms1-service
$ kubectl expose deployment nginx --type=NodePort --name=nginx-service
![](https://habrastorage.org/webt/3k/1c/bz/3k1cbztkkxs65uoo0c8zrcnytuy.png)
После выполнения этих команд оба сервиса становятся доступными из браузера:
![](https://habrastorage.org/webt/5i/mq/mi/5imqmijzxgkzh--ka4ns6ic8wty.png)
Отлично! Наш 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
![](https://habrastorage.org/webt/se/zl/wm/sezlwm8ilcwdhgjkf5catusj4mm.png)
Через несколько секунд запустятся сервисы:
![](https://habrastorage.org/webt/ic/tv/4k/ictv4kvngvyq4-se8hxn9ohhc_g.png)
Обратите внимание, что если вы хотите проверить Services/Stacks в Swarm, всегда (перед каждой командой) требуется определять значение переменной окружения
DOCKER_ORCHESTRATOR
. Если не менять её, то в роли оркестратора будет выступать Kubernetes:![](https://habrastorage.org/webt/6w/6g/qk/6w6gqktaeaunesowe-tw41cvyqm.png)
При этом
docker ps
выведет список всех контейнеров, будь они в Kubernetes или в Swarm:![](https://habrastorage.org/webt/3l/av/3m/3lav3m5cfbepofj5iagwtsvp3zo.png)
Kubernetes Dashboard
Раз у нас работает Kubernetes, давайте установим его dashboard. Для этого достаточно выполнить две команды:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
$ kubectl proxy
![](https://habrastorage.org/webt/tr/dt/kh/trdtkhlgcqc9jg4nvz1zlrgkanc.png)
После этого он станет доступен в браузере по адресу http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default.
Общий вид:
![](https://habrastorage.org/webt/_i/a6/ls/_ia6lsf4ifneyqownb1oy_yhkyu.png)
Просмотр View Deployments, Pods, ReplicaSets, Services:
![](https://habrastorage.org/webt/cm/e7/ty/cme7typqfgro4y9wekmbkqvm-_0.png)
Просмотр логов пода:
![](https://habrastorage.org/webt/bc/9f/zj/bc9fzjz1jdfslbis0jn7tz55-py.png)
P.S. от переводчика
Читайте также в нашем блоге:
- «Что и зачем Docker делает в Moby для интеграции с Kubernetes?»
- «CRI-O — альтернатива Docker для запуска контейнеров в Kubernetes».
- «Kubernetes 1.9: обзор основных новшеств».
- «Инфраструктура с Kubernetes как доступная услуга».
- «Обзор GUI-интерфейсов для управления Docker-контейнерами».
- «Шпаргалка с командами Docker».