Pull to refresh

Comments 58

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

да


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

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

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

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

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


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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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


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

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

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


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

это слишком 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

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


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

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

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

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

$ 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

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


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


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


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

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

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

$ 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.


Что за причина все равно непонятно. Зато увидел, что у меня с Flannel что-то неладное:

$ kubectl get pods --all-namespaces
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-kub-1 1/1 Running 0 18m
kube-system kube-apiserver-kub-1 1/1 Running 0 17m
kube-system kube-controller-manager-kub-1 1/1 Running 0 18m
kube-system kube-dns-545bc4bfd4-cnl7h 0/3 ContainerCreating 0 18m
kube-system kube-flannel-ds-9f55b 0/1 CrashLoopBackOff 8 17m
kube-system kube-flannel-ds-brfst 0/1 CrashLoopBackOff 7 16m
kube-system kube-flannel-ds-s6vr4 0/1 CrashLoopBackOff 7 16m
kube-system kube-proxy-76fr5 1/1 Running 0 18m
kube-system kube-proxy-7cxs7 1/1 Running 0 16m
kube-system kube-proxy-z44fz 1/1 Running 0 16m
kube-system kube-scheduler-kub-1 1/1 Running 0 18m


Куда дальше копать? :)

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


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


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

это какой-то стыд. Перепробовал несколько network-плагинов, из которых не заработали ни Flannel, ни Weave, ни Romana. И только Canal нормально смог поднять Kubernetes до рабочего состояния.

Мое мнение, с таким подходом товарищи из Kubernetes смогут зарабатывать только на гиках. Ну может еще AWS им деньжат будет подкидавать.
правильно определились, не стартовала flannel. Из за этого не поднялся dns и все что завязано через CNI.
на какую ОС пробовали поставить? Предположительно есть нюансы при установке k8s на firewalld
Ставил на Ubuntu 16.04. И да, в логах есть инфа о том, что «CNI failed to retrieve network namespace». Видимо, если я хочу получить что-то вменяемое, нужно воспользоваться чем-то вроде minikube. А production решение получить нереально без мощной поддержки со стороны крупного облачного хостинга

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

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

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


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

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

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

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

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

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

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

про swarm тоже в курсе, на тот момент он был еще сырой. я думаю поковыряюсь еще со swarm, так как он все таки встроенный в docker. Однако с nomad удобно то, что он поддерживает достаточно много функций связанных с оркестрацией, кроме того он позволяет управлять не только контейнерами но и вообще любыми исполняемыми типами, включая запуск обычных бинарников или виртуальных машин (kvm/qemu).
По-моему странное сравнение — полный опенсорс (k8s) и почти интепрайз Docker. Логичнее сравнивать Docker swarm с IBM Cloud Private и RedHat Openshift и их бесплатные версии соответсвенно.
Swarm пробовали, сырой (нестабильный) был. Надеюсь, Docker Inc. угомонятся с фичами через какое-то время и стабилизируют решение. Можно будет повторно посмотреть, хотя уже вряд ли будет иметь смысл переезжать.

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

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

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

Осталось непонятным (подозрительным) настроение автора:
Ситуация с хайпом вокруг Kubernetes (а это именно хайп по моему мнению

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

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

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

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

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

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

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

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

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

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

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

Sign up to leave a comment.

Articles