
Alexander
16.10.2016
08:45:47
уже 1.4.1 зарелизили

Alexander
16.10.2016
09:18:58
Да я так и понял )
Но кстати второй вариант через weave нормально заработал

Igor
16.10.2016
09:31:42
Успешно устанавливаем kubernetes ансиблом, но только на CentOS 7 пока. Роли ансибла свои, с фэйрволом.

Google

Artem
16.10.2016
09:45:39
а карго пробовали?

Dmitry
16.10.2016
09:53:40

Igor
16.10.2016
09:55:35
За основу брались не скрипты, а руководство по установке на RHEL. С contrib впоследствии был взят только README :)
Также еще с других руководств по нитке :)
Почти нигде не используется фэйрвол, пришлось по крупицам собирать инфу также

Dmitry
16.10.2016
09:59:02

Igor
16.10.2016
09:59:29
лучше по частям и самому - тогда приходит понимание

Dmitry
16.10.2016
10:01:16
а разработчики что использую локально для того, чтобы писать микросервисы?) миникуб?

Alexander
16.10.2016
10:01:21

Igor
16.10.2016
10:01:52
Сначала ETCD кластер или просто на мастер, потом flannel, 3 компонента: APIserver, Cotro;ler Manager иScheduler, потом kubelet и kubeproxy
ансиблом просто все делается потом то же самое что и руками, только в нужной последовательности
Рабочая демка: https://github.com/takama/k8sdemo

Dmitry
16.10.2016
10:04:45
спасибо! сейчас попробую

Google

Igor
16.10.2016
10:06:15
Dashboard и SkyDNS там ставятся отдельно, одной коммандой - не по умолчанию.
Если понадобятся то в доке есть комманда как поставить
У нас в компании есть звено между разработчиками и девопсами, которые умеют и то и другое :)

Dmitry
16.10.2016
10:13:11

Igor
16.10.2016
10:14:49
Да оно, касательно конфигов - 100% идеальное решение: всю динамику только через переменные окружения ENV, всю статику залинковывать в контейнеры
Kubernetes может легко работать без SkyDNS если есть соглащение по именованию ENV, в демке про это упоминается
Кстати оно уже с переводом вроде в оригинале: https://12factor.net/ru/


Dmitry
16.10.2016
10:19:15
а сервис дискавери?
мне напрямую нужно взаимодейтсвовать с etcd (он, как я понял, используется по умолчанию в кубернете) или там переменные среды будут обновляться и я должен их отслеживать их в самом приложении?
например:
имеем 2 сервиса:
1) принимающий запросы от клиента (браузера)
2) сервис аутентификации пользователя (к этому сервису ходят другие сервисы, до которых может достучаться пользователь; до сервиса аутентификации пользователь не может достучаться напрямую)
так вот, если сервис аутентификации отвалится или поднимается его реплика и уже будет 2 сервиса аутентификации, то как сервис, принимающий запросы от клиента, сможет узнать новый айпишник новой реплики?)
я собственно изза этого вопроса и начал кластер разворвачивать, чтобы смоделировать данную ситуацию и понять, как я должен писать код


Igor
16.10.2016
10:21:42
У Kubernetes используется кластерный IP - именно он и заполнен в переменных окружения ENV. Обращение к сервису происходить по кластерному IP. Если одна из реплик отваливается, то поднимается другая реплика. С этим проблем нет


Fike
16.10.2016
10:22:16
а сервис дискавери?
мне напрямую нужно взаимодейтсвовать с etcd (он, как я понял, используется по умолчанию в кубернете) или там переменные среды будут обновляться и я должен их отслеживать их в самом приложении?
например:
имеем 2 сервиса:
1) принимающий запросы от клиента (браузера)
2) сервис аутентификации пользователя (к этому сервису ходят другие сервисы, до которых может достучаться пользователь; до сервиса аутентификации пользователь не может достучаться напрямую)
так вот, если сервис аутентификации отвалится или поднимается его реплика и уже будет 2 сервиса аутентификации, то как сервис, принимающий запросы от клиента, сможет узнать новый айпишник новой реплики?)
я собственно изза этого вопроса и начал кластер разворвачивать, чтобы смоделировать данную ситуацию и понять, как я должен писать код
Тупо резолвишь днс с headless-сервисом раз в секунду-две-десять, подтягиваешь новые айпишники. Запросы делашеь настолько идемпотентными, насколько возможно, в случае провала либо делаешь ретрай на следующем сервере, либо сразу возвращаешь ошибку в случае неидемпотентности


Igor
16.10.2016
10:22:39
Кластерный IP - это адрес сервиса, а не конкретной реплики. Обращение происходит к одной из живых реплик

Dmitry
16.10.2016
10:23:28

Igor
16.10.2016
10:23:57
не, там именно IP
ipv4

Dmitry
16.10.2016
10:24:40
не, там именно IP
понял
получается IP, который не меняется в жизни контейнера с сервисом, верно?)

Igor
16.10.2016
10:25:14
не меняется с регистрацией сервиса, даже если реплик нет

Dmitry
16.10.2016
10:25:38

Fike
16.10.2016
10:26:03

Google

Fike
16.10.2016
10:26:20
Там еще какие-то edge cases были, но я уже не вспомню сейчас

Igor
16.10.2016
10:26:52
по хорошему еще нужно в продакшин поставить Ingres для балансировки правильной

Dmitry
16.10.2016
10:26:56

Igor
16.10.2016
10:27:18
по сути там HAProxy

Fike
16.10.2016
10:27:31

Dmitry
16.10.2016
10:28:32
если подключение к БД создалось, то уже никак)

Igor
16.10.2016
10:28:32
Чтобы все было четко с TCP и балансировкой - используйте Ingres - HaProxy

Dmitry
16.10.2016
10:29:05
но ведь если у меня 2 реплики бд, то один сервис подрубится к одной реплике, а другой - к другой

Igor
16.10.2016
10:29:25
К БД тоже HAProxy и лучше отдельно, вне кластера Kubernetes

Fike
16.10.2016
10:29:26

Igor
16.10.2016
10:30:32
Балансировка к БД - отдельная тема

Dmitry
16.10.2016
10:30:46
никто не дает таких гарантий
верно
но в случае, когда приложение само ходит и где-то спрашивает, не обновились ли айпишники, то приложение самостоятельно должно будет пересоздать подключение

Igor
16.10.2016
10:31:06
У нас стоит Galera 7 нод мастер-мастер через HAProxy

Dmitry
16.10.2016
10:31:15
Балансировка к БД - отдельная тема
да, скорее всего это так)
меня больше волновал запрос к внутренним самописным сервисам, с которыми нет необходимости держать TCP соединение
а как быть с secret токенами? например от AWS S3?
их тоже хранить в переменных среды?

Igor
16.10.2016
10:32:15
Хранить можно где угодно, но в переменные среды они попадают хоть как

Dmitry
16.10.2016
10:32:19
или есть файл с общими креденшиалами, которые линкуются во все контейнеры и все от них питаются?

Fike
16.10.2016
10:32:20

Google

Igor
16.10.2016
10:32:52
Можно для этого запускать контейнер с секретами :)

Dmitry
16.10.2016
10:32:53

Fike
16.10.2016
10:33:33
не-не, это прям его фичаа

Dmitry
16.10.2016
10:33:39

Fike
16.10.2016
10:33:45
http://kubernetes.io/docs/user-guide/secrets/

Igor
16.10.2016
10:33:48
secrets в Кубернетисе вроде

Fike
16.10.2016
10:34:29
я до нее так и не дошел, но там все нормально с распределением секретов только для тех, кто должен их знать

Admin
ERROR: S client not available

Dmitry
16.10.2016
10:34:30

Fike
16.10.2016
10:34:44
там тоже все выливается в ENV-переменные

Dmitry
16.10.2016
10:34:54
тогда шикарно - буду пихать в переменные среды

Fike
16.10.2016
10:35:18
либо в файлы - тут уже как удобнее

Dmitry
16.10.2016
10:38:24
супер, @takama , @etkee спасибо за инфу!
буду кодить тогда с использованием docker-compose
последний вопрос: для связки API ендпоинтов используете nginx?
например, есть 2 сервиса, которые доступны из внешнего мира по адресам:
1) /api/users
2) /api/tasks
и чтобы сделать единую точку входа для клиентов (example.com/api/...), то тут нужен nginx по идее, верно?
кстати, конфиг nginx в этом случае тоже будет выглядеть необычно - т.к. он не знает четких IP, на какие сервисы перенаправлять запросы
или nginx тоже будет перенаправлять запросы на кластерные IP?


Fike
16.10.2016
10:39:45
супер, @takama , @etkee спасибо за инфу!
буду кодить тогда с использованием docker-compose
последний вопрос: для связки API ендпоинтов используете nginx?
например, есть 2 сервиса, которые доступны из внешнего мира по адресам:
1) /api/users
2) /api/tasks
и чтобы сделать единую точку входа для клиентов (example.com/api/...), то тут нужен nginx по идее, верно?
кстати, конфиг nginx в этом случае тоже будет выглядеть необычно - т.к. он не знает четких IP, на какие сервисы перенаправлять запросы
или nginx тоже будет перенаправлять запросы на кластерные IP?
Конкретно у нас в проектах есть апи-прослойка, которая смотрит наружу и занимается только дерганьем остальных сервисов. Т.е. пришел запрос - прослойка отправляет токен на верификацию в менеджер пользователей, в случае успеха начинает оббивать другие сервисы, и, если нужно, мерджить сущности.
У прослойки свой собственный API, который и является API всего приложения. Сама прослойка в кубе в таком случае была бы обычным сервисом, который смотрел бы наружу прямо или за nginx'ом/аналогом.


Igor
16.10.2016
10:39:53
Мы для всего внешнего используем HAProxy
HAProxy нам дает и балансировку и High Availability и Failover

Dmitry
16.10.2016
10:42:47
понял
вариант с кастомным сервисом, который принимает запросы из внешнего мира и перенаправляет все во внутренние сервисы звучит очень разумно - плский с бубном вокруг конфигов nginx'а отваливаются

Google

Dmitry
16.10.2016
10:43:19
там ведь тоже конфиг, как у nginx'а, с фиксированными айпишниками

Fike
16.10.2016
10:43:43
и хапрокси, и nginx умеют резолвить днс-записи, и, таким образом, попадать на айпишники сервиса
В самом крайнем случае можно попробовать подцепить в pod confd или аналог и заставить его пересобирать конфигурацию конечного сервиса. Там те еще костыли получатся, но работать должно.

Igor
16.10.2016
10:45:10
Каждый сервис может также легко реплициоваться, главное чтобы удовлетворял всем факторам. HAProxy настраивается по ACL - в которых куча всяких условий может быть отражена. Но в вашем случае скорее всего нужно будет либо применять еще nginx - либо как-то также заводить провайдера со своим API

Dmitry
16.10.2016
10:47:23
а кто будет обновлять днс записи?)
например: по внутреннему адресу 192.168.22.22 был доступен сервис и nginx туда корректно перенапрвлял по DNS записи: "service_users: 192.168.22.22"
но сервис отвалился и рестартанул уже по адресу 192.168.22.23, а DNS запись осталась прежней
получается тут должен быть кластерный IP с "умным балансировщиком", который сам обновляет DNS записи

Igor
16.10.2016
10:48:40
За такими вещами HAProxy и следит с помощью health check, если сервис отвалился, он исключается из балансировки, пока не будет снова доступен
в случае с HAProxy Kubernetes и DNS не обязательны :)

Dmitry
16.10.2016
10:49:54

Fike
16.10.2016
10:50:56

Dmitry
16.10.2016
10:51:22
HAProxy то все равно должен ходить к etcd узнавать, какие сервисы не умерли
а каждый сервис должен сообщать о себе в etcd, что он живой, верно?)

Fike
16.10.2016
10:52:21

Igor
16.10.2016
10:52:27
Да, health check могут буть любого типа, в Haproxy настраивается как опрашивать каждый сервис
там можно просто проверят жив ли сервис по TCP, можно по HTTP опрос делать, да еще сравнивать результат - вариантов масса

Dmitry
16.10.2016
10:54:10
да, но когда поднялась новая реплика какого-то сервиса, то окружающая среда и HAProxy как-то должны узнать, что есть новая реплика и можно на нее слать запросы
я думал ввод нового сервиса в среду делается через etcd

Igor
16.10.2016
10:55:06
Конечно, с помощью health check от HAProxy он определяет, что сервис жив и снова его включает в балансировку

Fike
16.10.2016
10:55:40

Igor
16.10.2016
10:55:43
Похоже тут начали говорить уже о разных вещах :)

Dmitry
16.10.2016
10:56:48
зарезолвит днс еще через 10 секунд. если сервис не headless, то kube-dns обновит записи, соответствующие виртуальному айпи, там все на уровне iptables, и haproxy даже не заметит, что произошло
да, в кубернете я видел на видео, что там все это уже реализовано)
я думаю, как это сделать так, чтобы было отвязано от кубертнета, но в то же самое время можно было легко встроить контейнеры в среду, где есть кубернет)

Igor
16.10.2016
10:57:46
Если хотите получить High Alailability и Failover не в контейнерах - то HAProxy достаточно одного. Если речь о контейнерах, то там полный набор включая Kubernetes, ETCD и HAProxy (Ingres)

Fike
16.10.2016
10:58:03
кубернетес у тебя на продакшен и стейджинге, на рабочей машине у тебя просто не будут падать сервисы, делаешь им статический днс любыми способами и все