image


Мало найдется сегодня несогласных с тем, что Docker в конце концов стал "мейнстримом". Ну, точнее, контейнеры Docker стали. Правда есть фронт, где война еще не окончена, хотя для многих победитель уже очевиден, и победитель этот — Kubernetes, который по статистике использования сильно опережает основных конкурентов: Docker Swarm и Mesos + Mesosphere.


Я знаю людей и компании, которые не согласны с выводом большинства о том, что k8s это будущее оркестрации контейнеров. Но по некоторым причинам и аналогичные инструменты от других производителей их также часто не устраивают. Крупные компании в таком случае выбирают путь разработки своего собственного инструмента для оркестрации контейнеров. Другие останавливаются на Mesos или даже на Nomad. Но я пока не знаю никого, кто использовал бы Docker Swarm (mode).


Кстати, число "8" в слове k8s означает точно "8 букв", то есть: k8s = k[8_других_букв]s = kubernetes. Мода на такие сокращения появилась в бородатых 80-х прошлого века, и лично я не приветствую такие сокращения, поэтому далее буду называть инструменты их полным именем.


Ситуация с хайпом вокруг Kubernetes (а это именно хайп по моему мнению) заставляет вендоров озаботиться его поддержкой. Дошло до того, что даже Docker объявил о добавлении официальной поддержки Kubernetes в следующей версии Docker EE (Enterprise Edition), а также dev-версиях Docker CE (Community Edition) для Windows/macOS (да, о Linux версии речь не идет, пока).


Поддержка Kubernetes внутри Docker не ведет к автоматическому прекращению развития Swarm, напротив, Docker продолжит активно инвестировать в Swarm, получая при этом дополнительные преимущества от поддержки двух систем сразу — так прокомментировал новость David Messina, глава отдела маркетинга в Docker.


Как бы дела не обстояли на самом деле, но слова David Messina похожи на правду — архитектура Docker устроена так, что слой оркестрации находится ниже верхнего слоя абстракции. Это позволяет в теории легко менять логику оркестратора и даже заменять его полностью на другой компонент. На практике для взаимозаменяемости оркестраторов (Swarm и Kubernetes, в частности) они должны иметь схожий интерфейс, чего Docker активно добивался, начиная с версии Docker 1.12 (2016 год), когда впервые появились сервисы, а позднее, в версии 1.13, был представлен Docker Compose 3.0, формат которого во многом похож на формат описания конфигурации ресурсов Kubernetes.


В итоге, мы приходим к тому, что при использовании сервисов Docker у нас будет выбор как минимум из двух оркестраторов: Swarm или Kubernetes. И да, это пока только в Docker EE. Но с другой стороны, вы действительно хотите обслуживать Kubernetes своими силами?


Мастер нода Kubernetes
$ docker ps
CONTAINER ID        IMAGE                                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
f9882138b878        gcr.io/google_containers/pause-amd64:3.0                 "/pause"                 19 minutes ago      Up 19 minutes                           k8s_POD_kube-flannel-ds-hvnv6_kube-system_d9712e10-d1e9-11e7-9c5c-08002767d9b9_0
4d1ea67a0b76        gcr.io/google_containers/kube-proxy-amd64                "/usr/local/bin/kube…"   37 minutes ago      Up 36 minutes                           k8s_kube-proxy_kube-proxy-876f4_kube-system_60358c3c-d1e7-11e7-9c5c-08002767d9b9_0
37fb971730ce        gcr.io/google_containers/pause-amd64:3.0                 "/pause"                 37 minutes ago      Up 36 minutes                           k8s_POD_kube-proxy-876f4_kube-system_60358c3c-d1e7-11e7-9c5c-08002767d9b9_0
e1019f1fce5b        gcr.io/google_containers/kube-controller-manager-amd64   "kube-controller-man…"   37 minutes ago      Up 37 minutes                           k8s_kube-controller-manager_kube-controller-manager-kub-1_kube-system_422c166e980d1dc0f2b1d6dfe2a44a79_0
87cfb282f7ad        gcr.io/google_containers/kube-scheduler-amd64            "kube-scheduler --ad…"   37 minutes ago      Up 37 minutes                           k8s_kube-scheduler_kube-scheduler-kub-1_kube-system_e554495c6f8701f21accd04866090b05_0
50d678251d39        gcr.io/google_containers/kube-apiserver-amd64            "kube-apiserver --re…"   37 minutes ago      Up 37 minutes                           k8s_kube-apiserver_kube-apiserver-kub-1_kube-system_342c1a99aaa61a0ed9ad896f289102da_0
ccca79b694a8        gcr.io/google_containers/etcd-amd64                      "etcd --listen-clien…"   37 minutes ago      Up 37 minutes                           k8s_etcd_etcd-kub-1_kube-system_d76e26fba3bf2bfd215eb29011d55250_0
5b1f09ff23ca        gcr.io/google_containers/pause-amd64:3.0                 "/pause"                 37 minutes ago      Up 37 minutes                           k8s_POD_kube-scheduler-kub-1_kube-system_e554495c6f8701f21accd04866090b05_0
31874e59e951        gcr.io/google_containers/pause-amd64:3.0                 "/pause"                 37 minutes ago      Up 37 minutes                           k8s_POD_kube-controller-manager-kub-1_kube-system_422c166e980d1dc0f2b1d6dfe2a44a79_0
9a4c6aa0b861        gcr.io/google_containers/pause-amd64:3.0                 "/pause"                 37 minutes ago      Up 37 minutes                           k8s_POD_kube-apiserver-kub-1_kube-system_342c1a99aaa61a0ed9ad896f289102da_0
d908b820c2cb        gcr.io/google_containers/pause-amd64:3.0                 "/pause"                 37 minutes ago      Up 37 minutes                           k8s_POD_etcd-kub-1_kube-system_d76e26fba3bf2bfd215eb29011d55250_0

Рабочая нода Kubernetes
$ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
049836cefde0        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-flannel-ds-tt7nf_kube-system_d9718ab6-d1e9-11e7-9c5c-08002767d9b9_0
c9c39f7921f1        gcr.io/google_containers/kube-proxy-amd64   "/usr/local/bin/kube…"   3 hours ago         Up 3 hours                              k8s_kube-proxy_kube-proxy-6dz5d_kube-system_b46478e0-d1e7-11e7-9c5c-08002767d9b9_0
986964a3b9c8        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 3 hours ago         Up 3 hours                              k8s_POD_kube-proxy-6dz5d_kube-system_b46478e0-d1e7-11e7-9c5c-08002767d9b9_0

Что-то пошло не так на рабочей ноде Kubernetes
$ docker ps -a
CONTAINER ID        IMAGE                                       COMMAND                  CREATED              STATUS                              PORTS               NAMES
a9a80a385bef        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 1 second ago         Exited (0) Less than a second ago                       k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_201
0d807b577fcb        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 1 second ago         Exited (0) Less than a second ago                       k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_192
80d72880e96d        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 2 seconds ago        Exited (0) 1 second ago                                 k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_191
8afa248b3d7a        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 2 seconds ago        Exited (0) 1 second ago                                 k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_200
87b742a1f267        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 3 seconds ago        Exited (0) 2 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_199
775ed98c7c3f        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 3 seconds ago        Exited (0) 2 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_190
760c34dcdeed        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 4 seconds ago        Exited (0) 3 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_198
d8088f54906b        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 4 seconds ago        Exited (0) 3 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_189
e6b3bda7b916        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 5 seconds ago        Exited (0) 4 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_197
d6b086d07e2b        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 6 seconds ago        Exited (0) 4 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_188
a174b8540b65        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 6 seconds ago        Exited (0) 5 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_196
2661953dde42        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 7 seconds ago        Exited (0) 5 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_187
1fafde972df3        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 8 seconds ago        Exited (0) 6 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_195
714240831cd0        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 8 seconds ago        Exited (0) 7 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_186
025d5f953186        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 9 seconds ago        Exited (0) 8 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_194
53ada973b77d        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 9 seconds ago        Exited (0) 8 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_185
9079f3ef2238        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 10 seconds ago       Exited (0) 9 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_193
63713d562f90        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 10 seconds ago       Exited (0) 9 seconds ago                                k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_184
3c537074372e        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 11 seconds ago       Exited (0) 10 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_192
e07d254be81a        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 11 seconds ago       Exited (0) 10 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_183
497b03dbe981        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 12 seconds ago       Exited (0) 11 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_191
539c3bde5766        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 12 seconds ago       Exited (0) 11 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_182
b1bc951015c1        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 13 seconds ago       Exited (0) 12 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_190
c1448302112b        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 13 seconds ago       Exited (0) 12 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_181
afa7ac76512e        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 14 seconds ago       Exited (0) 13 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_180
2a0526c4b9ae        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 14 seconds ago       Exited (0) 13 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_189
4cd401e18c5a        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 15 seconds ago       Exited (0) 14 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_179
d8aea9b07ebf        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 15 seconds ago       Exited (0) 14 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_188
facf53fed8f4        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 16 seconds ago       Exited (0) 15 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_187
d4f5d552e6d3        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 16 seconds ago       Exited (0) 15 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_178
3e890f2710e8        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 17 seconds ago       Exited (0) 16 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_186
08d7ffd20989        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 17 seconds ago       Exited (0) 16 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_177
7636aee01b36        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 18 seconds ago       Exited (0) 17 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_185
f5c9f0462927        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 18 seconds ago       Exited (0) 17 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_176
08228f1dcc69        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 19 seconds ago       Exited (0) 18 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_175
3ebf9cbe0574        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 20 seconds ago       Exited (0) 19 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_184
8db8288b8e25        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 21 seconds ago       Exited (0) 20 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-tpcg6_default_5ccd5e03-d1fd-11e7-9c5c-08002767d9b9_174
04910fa590a3        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 21 seconds ago       Exited (0) 20 seconds ago                               k8s_POD_nginx-deployment-569477d6d8-ks262_default_5ccc8cd6-d1fd-11e7-9c5c-08002767d9b9_183
6bb21c072cdf        quay.io/coreos/flannel                      "/opt/bin/flanneld -…"   About a minute ago   Exited (1) 43 seconds ago                               k8s_kube-flannel_kube-flannel-ds-tgf4g_kube-system_d971b659-d1e9-11e7-9c5c-08002767d9b9_30
fd2adaea2775        quay.io/coreos/flannel                      "cp -f /etc/kube-fla…"   2 hours ago          Exited (0) 2 hours ago                                  k8s_install-cni_kube-flannel-ds-tgf4g_kube-system_d971b659-d1e9-11e7-9c5c-08002767d9b9_0
a4ab64d35f7a        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 2 hours ago          Up 2 hours                                              k8s_POD_kube-flannel-ds-tgf4g_kube-system_d971b659-d1e9-11e7-9c5c-08002767d9b9_0
8af917d54c0e        gcr.io/google_containers/kube-proxy-amd64   "/usr/local/bin/kube…"   3 hours ago          Up 3 hours                                              k8s_kube-proxy_kube-proxy-jrgzd_kube-system_9f8ce53d-d1e7-11e7-9c5c-08002767d9b9_0
b9abb6dbc139        gcr.io/google_containers/pause-amd64:3.0    "/pause"                 3 hours ago          Up 3 hours                                              k8s_POD_kube-proxy-jrgzd_kube-system_9f8ce53d-d1e7-11e7-9c5c-08002767d9b9_0

Для сравнения, вот что мы видим на нодах Docker в режиме Swarm:


Мастер нода Docker
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Рабочая нода Docker
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Инкапсуляция во всей своей красе! Прибавив к этому абсолютно тривиальнейший способ установки и запуска Docker, мы получаем настолько удобный и простой в использовании инструмент для оркестрации контейнеров, что я в совершенном недоумении, почему им до сих пор почти никто не пользуется (ведь PHP когда-то много людей начали использовать именно по причине простоты и всеобщей доступности). Может в комментариях кто поведает о причинах этого заговора странного факта.


В любом случае, с релизом поддержки Kubernetes в Docker даже у тех, кто не ищет легких путей, появится возможность поэкспериментировать с оркестрацией от Kubernetes сразу после установки Docker на свой новенький Mac/Windows. А пока, томясь в ожидании неизбежного, предлагаю сторонникам Kubernetes/Swarm/Nomad/Mesos поделиться соображениями о том, что могло склонить их на темную сторону выбрать именно этот инструмент.

Комментарии (57)


  1. eyeofhell
    26.11.2017 12:31

    А где в этой картинке расположена виртуальная сетка, создание сервисов, балансирование по ним нагрузки? Насколько я помню, одни из основных «фишек» docker swarm в том, что сетка между физическими нодами занимается balance loading и service discovery. То есть ping из любого контейнера сможет отрезолвить имя сервиса на другом контейнере и пакеты пойдут по наименее загруженному маршруту к наименее загруженному инстансу сервиса. k8s этот уровень тоже заменяет?


    1. farcaller
      26.11.2017 13:02

      1. eyeofhell
        26.11.2017 13:05

        Я правильно понимаю, что из коробки в созданном kubernetes решении сервисы точно так же смогут пинговать друг друга по имени и трафик будет раутиться по наименее загруженному каналу к наименее загруженной копии сервиса? Или нужно еще что-то руками докурчивать? В swarm это все работает сразу после «swarm join» и «service create»


        1. farcaller
          26.11.2017 13:09

          что из коробки в созданном kubernetes решении сервисы точно так же смогут пинговать друг друга по имени

          да


          и трафик будет раутиться по наименее загруженному каналу к наименее загруженной копии сервиса

          docker swarm поддерживает только round robin для сервисов же? k8s может тоже самое через iptables, в 1.9 упала поддержка ipvs и всех политик которые приходят с ним.


      1. renskiy Автор
        26.11.2017 13:22

        k8s значительно больше умеет.

        Чаще всего именно этот довод я слышу от тех, кто предпочитает использовать Kubernetes. А вы можете привести конкретный пример полезной фичи, которую вы действительно используете, и из-за отсутствия которой вы не можете использовать Swarm?


        1. farcaller
          26.11.2017 13:28

          Я на самом деле не использую swarm, так что для меня корректнее звучало бы "а что есть такого в swarm из-за чего я хотел бы переехать на него".


          Навскидку, в k8s ingress и сетевые политики. Первое в swarm можно решить "руками", второе заменить на calico cni.


          StatefulSet в k8s более фичаст чем service swarm'a и с ним проще масштабировать сервисы которые сами кластеризируются.


          Кастомные ресурсы тоже классная штука. У меня базы и юзеры мускуля вынесены в ресурсы и контроллер сам их настраивает. Это позволяет держать определения БД там же где и прочие зависимости приложения.


          Возможность мапить секреты в env/файлы — очень удобно и постоянно пользуюсь. В swarm можно наверно использовать vault для замены? но это требует опять же движений руками.


          1. renskiy Автор
            26.11.2017 13:43

            Возможно вы обладаете несколько устаревшей информацией, потому что все, что вы перечислили, в Swarm уже есть, причем из коробки.

            Ну разве что про кастомные ресурсы я не знаю, но это что-то очень специфическое и кастомное :)


            1. farcaller
              26.11.2017 13:46

              Ну так я же и говорю — я swarm уже давно не видел. Замечательно что он развивается.


        1. Gular
          26.11.2017 17:57

          Вот, справедливое замечание. Потому что читаю я сообщения, и не вижу упоминания CNI. Kubernetes — спасибо CNI, Swarm — используется свой, забыл название (CN… что-то там, легко ищется в документации). У Swarm умеет меньше.


          1. renskiy Автор
            26.11.2017 19:20

            CNM — Container Network Model. На хабре есть заметка о CNI, в которой есть ссылка на сравнение CNM vs. CNI.

            Но все это настолько далеко от обычного юзера. Я почему-то сомневаюсь, что именно на этом основывается выбор инструмента для управления контейнерами, или на этом?

            К тому же, в упомянутой статье в конце автор приводит мысль о том, что релиз Docker 1.12 существенно улучшил сетевую подсистему Docker, сделав ее вполне функциональной по сравнению с другими.


  1. farcaller
    26.11.2017 13:09

    del


  1. Akuma
    26.11.2017 13:09
    +1

    Эм. Ну вот он я — человек, который использует Docker Swarm :) Можете посмотреть на меня :)
    И знаете, он довольно неплохо работает.

    Есть непонятный глюк, который просиходит исключительно в dev-среде, когда контейнеры становятся недоступны извне при деплое. Но возникает он редко, да и именно deploy я использую только при изменении конфигурации сварма. А простая перезагрузка контейнеров делается по другому.

    Единственным относительно сложным моментом была настройка локального registry доступного из всех нод и при этом защищенного паролем и сертификатом. Ну денек поразбирался и работает.


    1. Akuma
      26.11.2017 13:15

      Ну еще минус, что нельзя ограничить максимальное число реплик-на-ноду. Если нода упала, то ее реплики переносятся на другие и на использование ресурсов Сварму наплевать. Хотя можно сделать global сервис по нодам с нужной меткой, как костыль пойдет.

      А из минусов k8s — при первом взгляде он какой-то нереально навороченный и сложный. Хотя может стоит разобраться и все будет проще, не знаю.


      1. farcaller
        26.11.2017 13:30

        при первом взгляде он какой-то нереально навороченный и сложный

        я так тоже раньше думал. Очень помогает поднятие кластера полностью руками, тот же kubernetes the hard way.


        1. Akuma
          26.11.2017 13:35

          Когда в документации 14 пунктов, она вызывает некоторое отторжение :)

          Плюс, его можно запускать через docker-machine? А то ж меня лапки Windows :)


          1. farcaller
            26.11.2017 13:39

            Когда в документации 14 пунктов, она вызывает некоторое отторжение :)

            Да я знаю, рассеянность внимания, многабукаф, все дела :-) почитайте и поиграйтесь все же. Полезно.


            Плюс, его можно запускать через docker-machine? А то жу меня лапки Windows :)

            Не знаю, его точно можно запускать через minikube (кубовое окружение для разработки), вот например дока для винды.


            Но для KTHW надо машинку с линуксом, там же все руками. Ну или руками адаптировать под винду.


            1. Akuma
              26.11.2017 13:42

              Да знаю, но уже в который раз шарахюсь по статьям вида «запускаем kubernetes за 10 минут» и все как-то… лень :)

              Может быть еще это отторгает. Конечно нет ничего плохого в отсутствии Windows-поддержки, но со Свармом я на сервер захожу просто чтоб поглазеть в htop ради интереса, иногда. Остальное с локальной машины.


              1. farcaller
                26.11.2017 13:47

                Конечно нет ничего плохого в отсутствии Windows-поддержки

                Еще раз — она есть. Вот свежий релиз миникуба и там дока как его запустить на винде: https://github.com/kubernetes/minikube/releases/tag/v0.23.0


                Но, minikube это готовый кластер. Поставил и работай. Это не "собери k8s из исходников и пойми как работает паззл".


                1. Akuma
                  26.11.2017 13:55

                  А, понял. Спасибо.

                  Вот кстати нашел такую онлайн-прибулду. ВОзможно кому-то вроде меня поможет:
                  www.katacoda.com/courses/kubernetes



            1. Akuma
              26.11.2017 13:44

              Кстати, а сколько ресуров отъедает k8s, не подскажете? Просто интересною


              1. farcaller
                26.11.2017 13:57

                Kubelet на нодах может съесть до сотни мб. Нагрузка на процессор незначительна по сравнению с рабочими подами.


                Вот скриншот с master-ноды у меня на стейджинге:


        1. renskiy Автор
          26.11.2017 15:07

          это слишком hard :) Для Ubuntu есть more easy way: www.techrepublic.com/article/how-to-quickly-install-kubernetes-on-ubuntu

          Хотя я поднял 3 виртуалки с Ubuntu и попробовал поднять кластер Kubernetes. Он вроде заработал, ноды начали друг друга видеть. Но поднять сервис из трех реплик nginx он не смог. Может памяти не хватило? Я использовал такие виртуалки (1024 мб оперативы по дефолту):

          Vagrantfile
          Vagrant.configure('2') do |config|
          
            config.vm.box = 'bento/ubuntu-16.04'
          
            config.vm.network 'private_network', type: 'dhcp'
          
            %w(
              kub-1
              kub-2
              kub-3
            ).each do |host_name|
              config.vm.define host_name do |host|
          
                host.vm.hostname = host_name
          
                # install Docker
                host.vm.provision 'docker'
          
                # install Kubernetes
                host.vm.provision 'shell', :privileged => true,
                  inline: <<-EOF
                    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add
                    echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list
                    apt-get update
                    apt-get install -y kubelet kubeadm kubectl kubernetes-cni
                    swapoff --all  # demands by kubectl
                  EOF
          
              end
          
            end
            
          end
          


          1. farcaller
            26.11.2017 15:09

            Эо объясняет как поднять кластер с нуля и кто вообще внутри происходит. Если надо просто кластер на поиграться есть minikube / kubeadm / kops наконец.


            Но поднять сервис из трех реплик nginx он не смог. Может памяти не хватило

            А ошибку какую возвращал?


            1. renskiy Автор
              26.11.2017 15:15

              А ошибку какую возвращал?

              никакую, просто не поднималось. На воркере можно было видеть то, что я статье привел в пример. А мастер показывал это:

              $ kubectl get pods
              NAME READY STATUS RESTARTS AGE
              nginx-deployment-569477d6d8-ks262 0/1 ContainerCreating 0 5m
              nginx-deployment-569477d6d8-tpcg6 0/1 ContainerCreating 0 5m
              nginx-deployment-569477d6d8-wj98c 0/1 ContainerCreating 0 5m


              1. farcaller
                26.11.2017 15:20

                Во-первых, посмотрите что в журнале событий:


                $ kubectl describe pod nginx-deployment-569477d6d8-ks262


                там может быть конкретная причина.


                Если в events ничего интересного нет (или вообще нет событий), посмотрите там же на какую ноду под зашедулился и гляньте логи kubectl.


                1. renskiy Автор
                  26.11.2017 15:21

                  ок, попробую еще раз. Отпишусь потом :)


                  1. farcaller
                    26.11.2017 15:25

                    В этом кстати просматривается положительная черта k8s, его относительно просто дебажить если вы поняли общий принцип работы. Вся информация на тему ошибок будет в логах, частично всплывая и в "пользовательський" интерфейс через события. Мониторинг можно легко построить на prometheus, так как все компоненты экспортируют метрики, рантайм (docker или rkt) можно изучить отдельно от kubelet и разобраться что и где пошло не так.


                1. renskiy Автор
                  26.11.2017 22:39

                  $ kubectl describe pod
                  $ kubectl describe pod nginx-5f9f9d8465-dxtvz
                  ...
                  Events:
                  Type Reason Age From Message
                  ---- ------ ---- ---- -------
                  Normal SuccessfulMountVolume 1m kubelet, kub-2 MountVolume.SetUp succeeded for volume "default-token-vmtmg"
                  Normal Scheduled 1m default-scheduler Successfully assigned nginx-5f9f9d8465-dxtvz to kub-2
                  Warning FailedCreatePodSandBox 1m (x8 over 1m) kubelet, kub-2 Failed create pod sandbox.
                  Warning FailedSync 1m (x8 over 1m) kubelet, kub-2 Error syncing pod
                  Normal SandboxChanged 1m (x8 over 1m) kubelet, kub-2 Pod sandbox changed, it will be killed and re-created.


                  1. farcaller
                    26.11.2017 22:46

                    Warning FailedCreatePodSandBox 1m (x8 over 1m) kubelet, kub-2 Failed create pod sandbox.


                    Что-то пошло не так между kubelet и docker. Думается мне и flannel потому же лежит. Что интересного в логах у kubelet на kub-2? Групайте на предмет "createPodSandbox for pod"


                    Контекст: событие создается тут, а парой строк выше в лог отправляется конкретная ошибка.


                  1. qwertyRu
                    27.11.2017 13:56

                    правильно определились, не стартовала flannel. Из за этого не поднялся dns и все что завязано через CNI.
                    на какую ОС пробовали поставить? Предположительно есть нюансы при установке k8s на firewalld


                    1. renskiy Автор
                      27.11.2017 18:04

                      Ставил на Ubuntu 16.04. И да, в логах есть инфа о том, что «CNI failed to retrieve network namespace». Видимо, если я хочу получить что-то вменяемое, нужно воспользоваться чем-то вроде minikube. А production решение получить нереально без мощной поддержки со стороны крупного облачного хостинга


                      1. farcaller
                        27.11.2017 18:58

                        Production-решение отлично можно развернуть на ubuntu + kubeadm + ceph на самом деле. С обновлениями и прочим, но без репликации мастера.


                        1. qwertyRu
                          27.11.2017 22:01

                          У вас есть такое решение? (если да, то можно подробности, версии ПО, контейнеров кол-во подов, политика обновления и пр.)


                          1. farcaller
                            28.11.2017 17:19

                            Нет, я сам только экспериментирую, но я видел развернутые варианты. Для себя я жду поддержку multi-master в kubeadm.


                            Я гонял много разной нагрузки, от сложносвязянных микросервисов до LAMP вордпресса. Ceph RBD работает стабильно. Ceph Cephfs имеет несколько багов с подчисткой ресурсов и общей стабильностью. Сам k8s работает абсолютно без нареканий, текущий кластер начинал с 1.7, потом обновлял вплоть до 1.9-alpha через kubeadm и нескольких плейбуков в ансибле. Calico работает очень стабильно и позволяет сделать простой L2-"меш" без оверхедов.


                      1. qwertyRu
                        27.11.2017 21:59

                        Поищите описание, как люди ставили на ubuntu, особенно обратите внимание на операции с firewalld. Была похожая проблема на centos7. Устанавливая по официальным докам получил проблему с flannel. Почитал как люди ставили, была разница в настройках firewalld. С учетом описания установки на контретной ОС, flannel завелся и все остальное тоже заработало как часы.


                        1. renskiy Автор
                          28.11.2017 13:53

                          Нашел причину сбоя Flannel: из двух сетевых интерфейсов он выбирает не тот, по которому общаются виртуалки между собой.

                          Указание нужного интерфейса через --iface мне не помогло. Буду дальше копать :)


  1. gtbear
    26.11.2017 23:19

    Использую nomad+consul на нескольких проектах. Очень удобно когда небольшая инсталляция и не хочется тащить кучу компонентов в систему. У этой связки все сервера равноправные и без жестко закрепленного мастера. Stateful сервисы тоже управляются через nomad.

    На k8s смотрю и изучаю, но есть желание дождаться когда он станет более стабильным и там закончится этап бесконечного накидывания фич и пойдет чисто багфиксинг.


    1. renskiy Автор
      27.11.2017 09:58

      а какой у вас был выбор? Почему именно Nomad вас заинтересовал?

      И что значит «без жестко закрепленного мастера»? Имеется в виду наверно Raft? В Swarm например тоже нет захардкоженного мастера, есть набор менеджеров, какждый из которых может взять на себя роль лидера на некоторый период. И да, в Swam все ноды тоже равноправны, но можно принудительно уменьшить права ноды, чтобы она всегда была только рабочей нодой.


      1. gtbear
        27.11.2017 10:12

        Решение принималось почти два года назад.

        И что значит «без жестко закрепленного мастера»
        да, raft. Все сервера и мастера и клиенты ( ну это потому что кластер небольшой)

        В Swarm например тоже нет захардкоженного мастера, есть набор менеджеров, какждый из которых может взять на себя роль лидера на некоторый период.

        про swarm тоже в курсе, на тот момент он был еще сырой. я думаю поковыряюсь еще со swarm, так как он все таки встроенный в docker. Однако с nomad удобно то, что он поддерживает достаточно много функций связанных с оркестрацией, кроме того он позволяет управлять не только контейнерами но и вообще любыми исполняемыми типами, включая запуск обычных бинарников или виртуальных машин (kvm/qemu).


  1. ssaavv
    27.11.2017 10:07

    По-моему странное сравнение — полный опенсорс (k8s) и почти интепрайз Docker. Логичнее сравнивать Docker swarm с IBM Cloud Private и RedHat Openshift и их бесплатные версии соответсвенно.


  1. hippoage
    27.11.2017 10:53

    Swarm пробовали, сырой (нестабильный) был. Надеюсь, Docker Inc. угомонятся с фичами через какое-то время и стабилизируют решение. Можно будет повторно посмотреть, хотя уже вряд ли будет иметь смысл переезжать.

    Kubernetes изначально выглядит как что-то сложное, но достаточно быстро понимаешь, что ничего страшного. Он в том или ином виде поддерживается GCP (Google Kubernetes Engine), AWS (kops), Azure (Azure Container Service), on-prem (разные варианты). При этом и от Kubernetes хочется большей стабильности (например, приходится пользоваться альфа/бета фичами), но уж что поделать.


  1. Ipeacocks
    27.11.2017 12:38

    На самом деле дела обстоят немного по-другому, чем говорят официальные лица (как всегда). Docker по-факту чихал на обратную совместимось и на сервисы/продукты, которые от него зависят. Потому Кубернетис комьюнити (точнее RedHat) почти доделал свою систему контейнеризации cri-o, которая в свою очередь будет привязана к релиз-циклу Куберенетиса. Более того сам Docker владеет слишком многими фичами, которые не особо нужны Куберентису, многие вещи дублируются.

    Так вот теперь Докер, проигнорировав рынок, пытается сесть в поезд, который уже готов ехать без него. Опять же, это просто мои мысли, не судите строго.

    Swarm я пробовал и немного присматривался к нему, т.е. имею действительно субьективные представления. Он действительно кажется базовым и не таким мейнстримным, сложно о нем найти какие-то «рецепты успеха». Кроме самой системы оркестрации нужно еще много: CI/CD, интеграции с хардварными балансерами, LDAP, хотя бы базовые веб-админки и т.п. Если это и есть в Сварме, то не в таком изобилии.


  1. shurup
    27.11.2017 14:00

    Подробнее о том, что деятельность Docker, связанная с Kubernetes, шире пресловутой (описанной здесь) поддержки в платформе, я писал в этой статье.

    Осталось непонятным (подозрительным) настроение автора:

    Ситуация с хайпом вокруг Kubernetes (а это именно хайп по моему мнению

    Что вы хотели этим сказать: что в Kubernetes «хайпового» или что вы сами называете «хайпом»? Как «Docker стал мейнстримом», так и с Kubernetes происходит аналогичное. Проекту, напомню, два с небольшим года, а количество влившихся в него ИТ-гигантов уже зашкаливает — по-моему, это не «хайп», а признание индустрией (причём важно, что в экосистеме далеко не только стартапы, но и настоящие тяжеловесы включая Cisco, IBM, Microsoft, Oracle, Pivotal/Dell, Red Hat… — многим ли удавалось так много и так быстро?).

    Но ещё интереснее тот факт, что, скажем так, тенденции оркестровки вместе с Kubernetes простираются сильно дальше — за пределы «мейнстрима Docker» (и легко его оттуда выбросят) — благодаря упомянутому комментарием выше CRI-O (на русском об этом проекте я писал здесь — забавно получилось, что как раз буквально за неделю до анонса поддержки K8s в Docker). В рассуждениях о мейнстриме, Docker и Kubernetes нельзя обойти вниманием эту важнейшую деталь.


    1. renskiy Автор
      27.11.2017 18:13

      признание индустрией

      как правило за этим стоят обычные люди со своими интересами и эмоциями. Именно поэтому я использовал слово «хайп» в данном случае.

      А статьи ваши с удовольствием почитаю, спасибо.


  1. rudenkovk
    27.11.2017 15:38

    Ринат, renskiy, ровно когда начинаешь поднимать на swarm все что нужно более менее рядом cron/jobs/balancer/etcd/шаблонизатор конфигов/какую-то логику управления клстером — он превращается в k8s :)


    1. renskiy Автор
      27.11.2017 18:25

      ну так в новом Docker все это уже присутствует. И присутствует так, что от юзера это скрыто, потому что как оно на самом деле работает и устроено, простому юзеру знать необязательно. Хотя, я согласен, что в этом случае получается какой-то «кот в мешке».


      1. rudenkovk
        27.11.2017 18:59

        Кстати, а аналог namespaces есть?


        1. renskiy Автор
          27.11.2017 21:14

          Может stacks?


          1. rudenkovk
            28.11.2017 13:25

            Ща гляну. А сине-зеленый деплой делать ручками?


          1. rudenkovk
            28.11.2017 13:27

            И кстати, это бесплатно или платно? я уже запутался в лицензировании докера :)


            1. renskiy Автор
              28.11.2017 13:40

              бесплатно


              1. rudenkovk
                28.11.2017 13:41

                и гуя?


                1. renskiy Автор
                  28.11.2017 13:44

                  об этом я не в курсе :) Зато, я добавил недавно поддержку стеков в Fabricio


          1. Ipeacocks
            28.11.2017 17:12

            Это не оно. Неймспейсы — это больше как Org/Spaces в Cloud Foundry. Т.е. для административных ограничений: кому-то дать доступ на деплой приложений, кому-то дать только читать там информацию и т.п.


            1. Ipeacocks
              28.11.2017 19:55

              Или же можно деплоить программы с тем же именем и т.п.


  1. Negash
    27.11.2017 18:38

    Использую Rancher cattle, В версии 2.0 появился под капотом k8s, но поддержка cattle осталась