Max
через шаблонизацию? а ткните в доку(
Anton
Ребят, помогите, что то забуксовал совсем я. есть кластер кубера, написал первую таску. Есть несколько вопросов 1) Как вставить таймаут между стартами контейнеров, и строго ли по списку кубер контейнеры стартует, если не строго то как сделать строго, ни как не могу даже упоминания об этом в доке найти. 2) Не понятность: мне нужно крутануть контейнер который инициализирует предыдущий запущенный контейнер(аля батч). Можно ли такое вообще сделать ? 3) DNS и CONFIGMAP- не понятно как реализован поиск контейнеров, везда указал name контейнеров (старт подов описан в деплойменте), но получаю в ответ host not found. Вообще кейс поиска сервисов как реализован, очень не понятно, одни описывают через сервис и поиск как публичных служб, другие описывают прямо IP адреса служб (как я могу узнать их если они в динамике). Короче вообще не понятки.
1) приложения не должны расчитывать на какой то порядок. если тебе нужен порядок старта - пилишь entrypoint который дожидается каких то события и потом стартует апп 2) обычно initcontainer преднастраивает. но вообще есть такая вещь как postStart hook, можно через него выполнить что то после старта https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
Anton
Ребят, помогите, что то забуксовал совсем я. есть кластер кубера, написал первую таску. Есть несколько вопросов 1) Как вставить таймаут между стартами контейнеров, и строго ли по списку кубер контейнеры стартует, если не строго то как сделать строго, ни как не могу даже упоминания об этом в доке найти. 2) Не понятность: мне нужно крутануть контейнер который инициализирует предыдущий запущенный контейнер(аля батч). Можно ли такое вообще сделать ? 3) DNS и CONFIGMAP- не понятно как реализован поиск контейнеров, везда указал name контейнеров (старт подов описан в деплойменте), но получаю в ответ host not found. Вообще кейс поиска сервисов как реализован, очень не понятно, одни описывают через сервис и поиск как публичных служб, другие описывают прямо IP адреса служб (как я могу узнать их если они в динамике). Короче вообще не понятки.
3) самый простой способ дискаверить сервисы в к8с - через днс. ищешь по именам сервисов. service может быть headless - тоесть будет резолвится во все адреса подов. вариантов много на самом деле.
Anton
как я запилю entrypoint, если стартуют разные контейнеры
в каждом entrypoint, тебе ведь не просто sleep нужно между стартами, тебе нужно чтобы был доступен какой то ресурс на момент запуска. база, апи, я хз. эту логику можно упаковать
Alexey
в каждом entrypoint, тебе ведь не просто sleep нужно между стартами, тебе нужно чтобы был доступен какой то ресурс на момент запуска. база, апи, я хз. эту логику можно упаковать
да, я пока стартую их все как stateless, просто хочу разобратся какие есть трюки, и как их крутить если что то понадобиться не обычное.
Anton
через шаблонизацию? а ткните в доку(
пока не шаблонизируешь ничего?
Alexey
пока не шаблонизируешь ничего?
Да даже не могу найти ссылки на какие переменные есть для шаблонизатора, и если они есть (особенно ссылки на секреты и порты и хосты) Я буду очень рад )
Max
я просто термин такой не знаю) если про то что написать yaml - то конечно я все так делаю просто у меня же реплика сет и там foo-1.bar foo-2.bar и тд - не хочется все это писать руками
Anton
блин опять хуки. А политик старта ни каких нет ? Они же пильнули для statefull вроде как, я думал и для stateless есть.
такой нет функциональности. если ты в докере пробовал запускать свои аппы, то наверняка уже видел всякие wait-for-it.sh для того чтобы запускать апп после того, как база будет доступна
Alexey
такой нет функциональности. если ты в докере пробовал запускать свои аппы, то наверняка уже видел всякие wait-for-it.sh для того чтобы запускать апп после того, как база будет доступна
Это понятно, там немного для другого логика батчей - там лдап и версии. Потому при обновлении приложеньки хочется батчем докатывать версию
Alexey
А батчу скармливать конфигом чего докатывать.
Alexey
Получится отвязатся от версий конфигов для разных версий в гите, жестко это вымораживает
Alexey
Ладно с инициализацией пока на потом. Мне бы помочь с шаблонизатором для Config MAP. И DNS, указал для приложеньки в качестве хоста то что указал в name - получил отбой что хост не найден. Я описал старт через Deployment. В доке кубера указано что бы пользоваться hostname нужно испльзовать POD. Тогда как деплой то описывать ) https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/ . Однако если я это пробую использовать в spec Deployment - получаю ошибку синтаксиса
Alexey
Может проще - как вы сами в своих конфигах контейнеры находите ? Генерируете через шаблонизатор (списки IP адресов), DNS (как там с TTL тогда дела обстоят), если DNS то получается порты уже в динамике нельзя использовать, то есть 1 контейнер на 1 ноду, не очень это хорошо
Alexander
Как правильно публиковать свое приложение? Баре метал. Ингресс nginx от k8s. Необходимо опубликовать на 80 порт. В сервисе приложения выбирать ноде порт, а этот нод порт закреплять за бекендом ингреса?
Stanislav
Если ингресс уже есть - через него
Stanislav
Ну то есть, определить сервис без всяких NodePort, на который и натравлять ингресс
Stanislav
А в чём, собственно, проблема?
Alexander
Ну то есть, определить сервис без всяких NodePort, на который и натравлять ингресс
А у самого сервиса ингреса должен быть тип кластер айпи?
Alexander
А в чём, собственно, проблема?
Проьоема в том что указано кластер айпи, а порт в итоге не публикуется
Stanislav
bare metal - только NodePort, либо как я вчера - через hostNetwork: true
Alexey
ну сервис раздает днс имена - не понял вопроса
Вопрос следующий, есть контейнер, для него есть в конфиг, в конфиге мне нужно указать ему для общения другие контейнеры, публиковать мне эти контейнеры не надо, пускай работают через внутреннюю сеть. Вопрос как это сделать ? Забыл написать - конфиг отдаю через Config Map
Alexander
bare metal - только NodePort, либо как я вчера - через hostNetwork: true
Тоесть на 80 порт не могу опубликовать?
Stanislav
В случае NodePort понадобится секция externalIPs: в описании сервиса ingress-nginx
Stanislav
В ней - список ip-адресов узлов, где надо слушать 80,443
Stanislav
Тоесть на 80 порт не могу опубликовать?
apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx spec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP - name: https port: 443 targetPort: 443 protocol: TCP selector: app: ingress-nginx externalIPs: - x.x.x.88 - x.x.x.30
Stanislav
С дефолтным mandatory.yaml вполне работает
Alexey
pzoo-0.pzoo - это имя как получилось. Что нужно указать для deployment что бы получилось имя. Ну и это костыльно, очень костыльно. Нет возможности как более элегантно искать другие сервисы, что бы не было привзяки к нодам и портам. Или если кубер создает отдельный IP на каждый контейнер - то в принципер норм, если порт всегда будет одинаковым
Stanislav
Но есть грабля - в логах отражается ип узла из externalIPs, куда пришел запрос
Stanislav
Гм... Где это имя получилось (где увидел)?
Alexey
server.1=pzoo-0.pzoo:2888:3888:participant Из гита ссылка же
Alexey
pzoo-0.pzoo - вот этот кусок из чего складывается. Ну например pzoo-0 - это metadata:name, а pzoo - это container:name. Я пример привел, не знаю как оно в реалн
Max
я как то теряю диалог))) вот это генерит pzoo-0.pzoo:2888:3888:participant https://github.com/Yolean/kubernetes-kafka/blob/master/zookeeper/20pzoo-service.yml
Alexey
я как то теряю диалог))) вот это генерит pzoo-0.pzoo:2888:3888:participant https://github.com/Yolean/kubernetes-kafka/blob/master/zookeeper/20pzoo-service.yml
Блин, у него в конфигах нету pzoo-0, нету 0, откуда взялся 0 вот о чем я спрашиваю, это кубер прибавляет ? В service он описал pzoo, без тире и нулей. На выхлопе получилось pzoo-0.pzoo. Вот из чего состоит имя, как оно генерируется (какие переменные)
Max
а)) ну это стейтфул сет с репликацией https://github.com/Yolean/kubernetes-kafka/blob/master/zookeeper/50pzoo.yml#L12 кубер сам прибавляет номера для каждой реплики вот тут это написано https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
Alexey
а)) ну это стейтфул сет с репликацией https://github.com/Yolean/kubernetes-kafka/blob/master/zookeeper/50pzoo.yml#L12 кубер сам прибавляет номера для каждой реплики вот тут это написано https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
спасибо, ситуация начинает прояснятся. Блин хочу деплоймент с динамической нагрузкой (вырубать контейнеры если нагрузки нет), потому нужно что бы конфиг лежащий в config map генерировался по определенным параметрам. Есть ли такая возможность ?
Alexey
Может я ошибочно пытаюсь логику работы nomad натянуть на кубера? У номад есть шаблонизаторы и поиск служб, просто поиск. Видимо у кубера свои подходы, просто не понятно какие, в документации создаются службы в вакууме, общающиеся только с внешним миром, а как организовать взаимосвязанную работу примеров особо нет.
Alexey
Нормальные там примеры. Если без разницы, к какому поду ходить - просто сделать сервис, который указывает на нужный деплоймент и ходить в него. Остальное (реплики и т.п.) разруливать через деплоймент.
Примеры для тех кто в теме. Пока в голове пусто и первый-второй раз проходишься по доке все нюансы вообще не понятны и не запоминаются, потому что нет акцентов в примерах. Но не суть, дока хороша, просто пока в голове не уложились все нюансы
Alexey
вот пример из доки. pod-ip-address.my-namespace.pod.cluster.local - сущность pod, я описал deployment, внутри deploument будут поды, но будут ли они видны так же. Дело в том что metadata поле у меня одно на два пода.
Stanislav
Сделай сервис и ходи через днс на него. Это проще всего будет.
Stanislav
Публиковать сервис наружу необязательно
Alexey
Сервис менее выгоден с точки зрения маршрутизации. Там стык будет через выход за пределы vxlan сети. что не есть хорошо, зачем это делать если они напрямую могут друг с другом взаимодействовать. Другое дело что если за сервисом несколько подов, то через балансер я найду 1. Вот блин и ответ
Alexey
спасибо ))
Alexey
Теперь дошло, пока писал дошло
Stanislav
Там тех потерь - за пределами точности измерения в нормальных условиях.
Stanislav
Ну так если нужен доступ снаружи (у меня на работе - это единственная возможность получить заметную нагрузку на conntrack) - в любом случае надо ставить внешний лоадбалансер, в котором заодно использовать всякие mod-security, limit-rate и т.п.
Alexey
Ну так если нужен доступ снаружи (у меня на работе - это единственная возможность получить заметную нагрузку на conntrack) - в любом случае надо ставить внешний лоадбалансер, в котором заодно использовать всякие mod-security, limit-rate и т.п.
это да, тут тачки разнородные очень, от очень слабых, до нормальных. А куда улетит контейнер не известно и это правильно, но в целом внутренняя кухня должна быть за внешим балансером. А то и в каскаде (haproxy -> nginx -> nginx (per service)) типа того
Alexey
Ещё вопрос, а можно секрет засунуть перменной в конфигмап ?
Stanislav
Кто на ком стоял?
Stanislav
По-моему, configMap создаётся не из секретов.
Stanislav
Если надо в одном месте хранить и конфги и секреты - делайте projected volume
Alexey
По-моему, configMap создаётся не из секретов.
да, потому и спрашиваю, можно ли? Идея какая, один конфиг мап на все случаи жизни, в разных namespace лежат версии, а в прод мапится свои секреты, при этом сам конфиг мап одинаковый и забирает секрет из своего namespace.
Stanislav
Проще таки для прода другой секрет подцепить.
Alexey
Проще таки для прода другой секрет подцепить.
я просто хочу секрет внурь конфига вкладывать. Не везде можно раздельно поставлять ((
Bsod
юзай темплейт, куда при старте из энва клади
Vitaliy
отцы, подскажите. вот есть свежий 1.11 кластер. сертификаты конечно на 1 год сгенерировались kubeadm-ом. вроде бы kubelet настроен на авторотейт при "скором протухании, <180d" сертификата. Но вот как дела обстоят с control-plane сертами? они тоже умеют автообновляться или надо что-то делать руками для этого? туплю
Alexey
юзай темплейт, куда при старте из энва клади
Блин, ну такое… Доп логика на старт… костыльненько
Bsod
щито поделать десу
Alexander
apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx spec: type: NodePort ports: - name: http port: 80 targetPort: 80 protocol: TCP - name: https port: 443 targetPort: 443 protocol: TCP selector: app: ingress-nginx externalIPs: - x.x.x.88 - x.x.x.30
Спасибо, понял, помогло. Единственное, как по правильному работаь с экстернал айпи. Повесить вирт айпи чтоб между мастерами гулял и вписать его в экстернал айпи?
Stanislav
externalIps тут - адреса, привязанные к внешним интерфейсам узлов, где будет открыт 80-й порт
Stanislav
Мне проще было сделать запись в днс вида *.kubernetes.domain.tld и потом прописывать нужное имя в ingress для соответсвующего сервиса
Stanislav
Это для доступа снаружи. Изнутри всё работает по короткому имени
Alexander
Это для доступа снаружи. Изнутри всё работает по короткому имени
Понял, спасибо. Это вообще тру путь для публикации во вне на баре метал??)
Stanislav
А хз, мне просто было так проще перетаскивать сервисы из docker swarm
Anton
добрый день, прошу помощи и прояснения (просветления даже) с prometheus operator, не получается до конца осознать концепцию, а если точнее, то не ясно как влиять на параметры конфигурации прометея, которые задаются не динамически.
Vadim
добрый день, прошу помощи и прояснения (просветления даже) с prometheus operator, не получается до конца осознать концепцию, а если точнее, то не ясно как влиять на параметры конфигурации прометея, которые задаются не динамически.
https://github.com/coreos/prometheus-operator/blob/master/Documentation/custom-configuration.md https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusrule динамически создаешь PrometheusRule, который подхватывается оператором и рестартует прометеус
Anton
не совсем ясно как создавать побоное правило
Denis
Подскажите пожалуйста создал через cert-manager LE серт, пытаюсь его прикрутить через ingress. Но мне отдается 503 ошибка apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: ingress.kubernetes.io/ssl-passthrough: "true" nginx.ingress.kubernetes.io/secure-backends: "true" kubernetes.io/tls-acme: "true" certmanager.k8s.io/issuer: letsencrypt-production name: devsite selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/devsite spec: rules: - host: my.domain.com http: paths: - backend: serviceName: my-frontend servicePort: 8181 path: / - host: my.domain.com http: paths: - backend: serviceName: my-backend servicePort: 3000 path: /api tls: - hosts: - my.domain.com secretName: my-domain-com-tls status: loadBalancer: {}