[Перевод] Использование Docker CE (Community Edition) с Kubernetes

Прим. перев.: Автор статьи — Melvin Dave Vivas, возглавляющий команду разработчиков и SRE-инженеров в сингапурском банке, — делится своим опытом знакомства с поддержкой Kubernetes в платформе Docker.

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

59e6da1e8e30f685686004.png

Поэтому после анонса я решил проверить наличие этой поддержки в Edge-версии, о чём писал Michael Frills в блоге Docker. Но на тот момент её не оказалось. И вот, после нескольких месяцев ожиданий, она наконец-то появилась.

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

qfu-14mppaybkfvcfizv6i4mjvk.png

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

iams4vfhuxaro5hpr7ojnuwhlmi.png

После активации Kubernetes я попробовал выполнить команды с kubectl, однако подключение к серверу возвращало ошибку:

sdobkpzpimbyp77ltyk9gasuz6k.png

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

$ kubectl config use-context docker-for-desktop


krwrwfodj9wom9cq07kaz3mimik.png

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

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


g1pjefo-yvnrfnqb3lax6jx0ziu.png

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

cgqcajrdezomogzuzawj7adtj3s.png

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

$ kubectl describe services 


di6pfvw5okzdrz3l3mwzi_ibl-e.png

Проверить контейнеры можно и с помощью docker ps. Вывод должен быть эквивалентен kubectl get pods:

pzmsrylollhqmbh1zzkvfay8gm4.png

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

$ kubectl expose deployment ms1 --type=NodePort --name=ms1-service
$ kubectl expose deployment nginx --type=NodePort --name=nginx-service


3k1cbztkkxs65uoo0c8zrcnytuy.png

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

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


sezlwm8ilcwdhgjkf5catusj4mm.png

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

ictv4kvngvyq4-se8hxn9ohhc_g.png

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

6w6gqktaeaunesowe-tw41cvyqm.png

При этом docker ps выведет список всех контейнеров, будь они в Kubernetes или в Swarm:

3lav3m5cfbepofj5iagwtsvp3zo.png

Kubernetes Dashboard


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

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
$ kubectl proxy


trdtkhlgcqc9jg4nvz1zlrgkanc.png

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

Общий вид:

_ia6lsf4ifneyqownb1oy_yhkyu.png

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

cme7typqfgro4y9wekmbkqvm-_0.png

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

bc9fzjz1jdfslbis0jn7tz55-py.png

P.S. от переводчика


Читайте также в нашем блоге:

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

© Habrahabr.ru