Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как мы меняли прописку сервисов с Mesos на Kube...

Как мы меняли прописку сервисов с Mesos на Kubernetes

Смена технических решений — это всегда больно. Ещё больнее, когда это решение является краеугольным камнем вашей архитектуры, на который завязано если и не всё, то многое. В какой-то момент мы столкнулись с тем, что испытываем неудобства, нам не хватает фич при использовании связки Mesos-Marathon-Chronos и у нас возникло желание перейти на другое решение, которым был выбран Kubernetes.

В докладе расскажем про опыт миграции тестовых и продакшн-сред с одной платформы на другую, а именно:
- как мы мигрировали 40+ сервисов с одной платформы на другую;
- какие технические и организационные решения были применены;
- какие проблемы мы видели сразу, а о каких узнали только в процессе перехода;
- как мы решили проблему влияния на процессы разработки и доставки ПО на период миграции;
- почему организационных проблем при переезде оказалось не меньше, чем технических.

Aleksandr Tarasov

May 28, 2019
Tweet

More Decks by Aleksandr Tarasov

Other Decks in Programming

Transcript

  1. Минздрав предупреждает Мнение докладчика может не совпадать с официальной позицией

    его работодателя, начальника, коллег или других специалистов. Все представленные в докладе сведения, примеры, выводы и другую информацию вы можете использовать на свой страх и риск. За все ваши действия ответственность несёте только вы сами. 4
  2. Минздрав предупреждает II Этот доклад не про Mesos Этот доклад

    не про Kubernetes Модных и хайповых инструментов не будет 5
  3. Немного фактов • 40+ сервисов • 10+ интеграций с партнерами

    • 6 независимых команд • 10+ тестовых сред 9
  4. Деплоймент как процесс • Миграции на БД • Пост-контроль •

    Откат (и если надо то и миграцию откатить) • Оповещения • Тестирование 25
  5. Типовые шаги деплоймента • Проверить/создать пользователя/схему в БД • Накатить

    миграцию данных • Накатить новую версию сервиса • Накатить сопутствующие крон-джобы • Запускать тесты на разных этапах • По пути кидать сообщения и алерты 27
  6. Деплоймент в терминах Mesos’a • Миграция = одноразовый таск в

    Chronos • Сервис = long-running task в Marathon • Cron-Job = периодический таск в Chronos 29
  7. Не только Mesos • Миграция = одноразовый таск в Chronos

    • Сервис = long-running task в Marathon • Cron-Job = периодический таск в Chronos • Тесты != Mesos • Сообщения и алерты != Mesos 34
  8. Пишем свой манифест деплоя application: app_name: hcn test: cpu: 0.5

    mem: 512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 rmq: True mongo: True 37
  9. Пишем свой манифест деплоя application: app_name: hcn test: cpu: 0.5

    mem: 512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 rmq: True mongo: True 38
  10. Пишем свой манифест деплоя application: app_name: hcn test: cpu: 0.5

    mem: 512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 rmq: True mongo: True 39
  11. Фичи в одну строку application: app_name: hcn test: cpu: 0.5

    mem: 512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 rmq: True //RMQ feature mongo: True //Mongo feature 40
  12. Фичи в одну строку application: app_name: hcn test: cpu: 0.5

    mem: 512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 rmq: True ---> подключение к очереди mongo: True ---> подключение к MongoDB и миграции 41
  13. Добавим связанные батч-таски application: app_name: account ... chronos: True chronos_tasks:

    - name: "ACCOUNT_SYNC_CUSTOMERS_TO_XXX" schedule: R//PT30M command: python /app/account/sync.py - name: "ONE_ANOTHER_BATCH_TASK" schedule: R//PT10M command: python /app/account/oabt.py 42
  14. Добавим связанные батч-таски application: app_name: account ... chronos: True chronos_tasks:

    - name: "ACCOUNT_SYNC_CUSTOMERS_TO_XXX" schedule: R//PT30M command: python /app/account/sync.py - name: "ONE_ANOTHER_BATCH_TASK" schedule: R//PT10M command: python /app/account/oabt.py 43
  15. Convention Over Configuration application: app_name: hcn test: cpu: 0.5 mem:

    512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 ... "id": "/hcn", "cmd": "python /app/hcn/main.py", "cpus": 0.5, "mem": 512, "instances": 4, "env": { "LOGSTASH_TAG": "hcn-prod", }, "container": { "docker": { "image": "anna-repo/hcn:1.0.0" } 44
  16. Имплементация для K8S metadata: name: "hcn-deployment" spec: replicas: 4 template:

    spec: containers: - name: "hcn" image: "anna-repo/hcn:1.0.0" resources: ... env: - name: LOGSTASH_TAG value: "hcn-prod" command: ["/bin/sh"] args: ["-c", "python /app/hcn/main.py"] 54 application: app_name: hcn test: cpu: 0.5 mem: 512.0 instances: 2 prod: cpu: 0.5 mem: 512.0 instances: 4 ...
  17. Выводы • Добавили уровень абстракции • Скрыли за ней реализацию

    на мезосе • Добавили альтернативную реализацию на K8S 57
  18. Влияние на процесс разработки • Существующие сервисы дорабатывались • Добавилось

    более 10 новых сервисов • Скорость разработки не уменьшилась 66
  19. Изменения в процессе • Принципы и подходы остались неизменными •

    Скрипты практически не изменились • Поменялись ссылки на инфраструктурные сервисы 76
  20. Дополнительные бонусы • Namespaces • Ingress (nginx) показался проще чем

    Marathon-LB • Закрыли часть технического долга 78
  21. Выводы • Смогли переехать незаметно для клиентов • Влияние на

    скорость разработки минимальна • Процесс деплоймента принципиально не поменялся 79
  22. Дублирование в кронах application: ... chronos: True chronos_tasks: - name:

    "{{ 'sync-customers' if k8s else 'ACCOUNT_SYNC_CUSTOMERS_TO_XXX' }}" cron: "30 0/1 * * *" schedule: R//PT30M command: python /app/account/sync.py 82
  23. То что общее application: ... chronos: True chronos_tasks: - name:

    "{{ 'sync-customers' if k8s else 'ACCOUNT_SYNC_CUSTOMERS_TO_XXX' }}" cron: "30 0/1 * * *" schedule: R//PT30M command: python /app/account/sync.py 83
  24. Ограничения K8S application: ... chronos: True chronos_tasks: - name: "{{

    'sync-customers' if k8s else 'ACCOUNT_SYNC_CUSTOMERS_TO_XXX' }}" cron: "30 0/1 * * *" schedule: R//PT30M command: python /app/account/sync.py 84
  25. Разный формат шедулинга application: ... chronos: True chronos_tasks: - name:

    "{{ 'sync-customers' if k8s else 'ACCOUNT_SYNC_CUSTOMERS_TO_XXX' }}" cron: "30 0/1 * * *" schedule: R//PT30M command: python /app/account/sync.py 85
  26. Marathon-LB vs Ingress application: ... haproxy_group: external haproxy_0_path: "-i /api"

    ... ingress: True ingress_path: "/api" whitelist_enabled: False 86
  27. Разный формат для path application: ... haproxy_group: external haproxy_0_path: "-i

    /api" ... ingress: True ingress_path: "/api" whitelist_enabled: False 88
  28. Временные трудности • Более громоздкая конфигурация • Необходимость тестировать и

    на мезосе и на кубе • Дополнительная боль для девелоперов 90
  29. Суть проблемы kind: Ingress metadata: name: "document-ingress" annotations: kubernetes.io/tls-acme: "true"

    spec: tls: - hosts: - "document.env.anna.money" secretName: "document-ingress-tls" 93
  30. Суть проблемы kind: Ingress metadata: name: "document-ingress" annotations: kubernetes.io/tls-acme: "true"

    spec: tls: - hosts: - "document.env.anna.money" secretName: "document-ingress-tls" 15 сервисов 10 тестовых сред = 150 сертификатов RATE LIMIT EXCEEDED 94
  31. Коварность лимитов application: app_name: hcn test: cpu: 0.5 mem: 512.0

    Marathon "cpus": 0.5, "mem": 512 K8S resources: requests: memory: "512.0Mi" cpu: "0.5" limits: memory: "512.0Mi" cpu: "0.5" 97
  32. Коварность кронов application: ... chronos: True chronos_tasks: - name: name

    cron: "30 0/1 * * *" schedule: R//PT30M Chronos "concurrent": false K8S concurrencyPolicy: Allow 100
  33. Суть проблемы • Пробелы в знаниях как работают сервисы •

    Отдельная команда системных администраторов 105
  34. Суть проблемы • Не все сервисы и кейсы покрыты тестами

    • Нет тестов на продакшен • Отсутствие нагрузочных тестов 109
  35. Наш фреймворк для миграций 1. Ввели новый уровень абстракции 2.

    Перешли на работу с абстракцией, а не реализацией 117
  36. Наш фреймворк для миграций 1. Ввели новый уровень абстракции 2.

    Перешли на работу с абстракцией, а не реализацией 3. Добавили новую реализацию 118
  37. Наш фреймворк для миграций 1. Ввели новый уровень абстракции 2.

    Перешли на работу с абстракцией, а не реализацией 3. Добавили новую реализацию 4. Протестировали новую реализацию против старой 119
  38. Наш фреймворк для миграций 1. Ввели новый уровень абстракции 2.

    Перешли на работу с абстракцией, а не реализацией 3. Добавили новую реализацию 4. Протестировали новую реализацию против старой 5. Выпилили старую реализацию 120