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

GitOps CD для Kubernetes

Sysadminka
October 25, 2019

GitOps CD для Kubernetes

Лев Аминов, Tinkoff.ru, старший инженер по инфраструктуре

Sysadminka

October 25, 2019
Tweet

More Decks by Sysadminka

Other Decks in Technology

Transcript

  1. Tinkoff.ru Agenda • Интро • Что дано • Какие были

    требования • Какие были варианты • Что выбрали • Чем допинали • Вопросы
  2. 4

  3. Tinkoff.ru Плюсы • Конфигурация рядом с кодом • Автоматическое добавление

    лейблов • Разработчик может править спецификации и видеть результат 11
  4. Tinkoff.ru Плюсы • Конфигурация рядом с кодом • Автоматическое добавление

    лейблов • Разработчик может править спецификации и видеть результат • Кастомизация per-environment 12
  5. 13

  6. Tinkoff.ru Плюсы • Конфигурация рядом с кодом • Автоматическое добавление

    лейблов • Разработчик может править спецификации и видеть результат • Кастомизация per-environment • При генерации итоговых спецификаций можем выполнять внешние команды 14
  7. Tinkoff.ru Минусы • Теряется история изменений • Нет возможности эти

    изменения откатить • Нет менеджера зависимостей • Нет инструмента для работы с секретами • У разработки свои процессы • Много Shell-скриптов • Никто не разбирается, как это работает • Если что-то не работает, все равно идут к тебе • 40+ репозиториев 17
  8. Tinkoff.ru Дано • 2 guys 40+ microservices • In-repo Helm

    chart • In-repo Kustomize specs • Никто не правит спецификации 20
  9. Tinkoff.ru Дано • 2 guys 40+ microservices • In-repo Helm

    chart • In-repo Kustomize specs • Никто не правит спецификации 21
  10. Tinkoff.ru Требования • Иметь возможность поднять Production окружение в любой

    момент • Иметь прозрачную историю изменений • Иметь возможность править спецификации множества приложений • Избавиться от необходимости подстраиваться под workflow разработки • Работа с версиями секретов • Простой способ работы с зависимостями • Отдать разработке пайплайн сборки артефактов • Минимизировать проблемы при публикации приложений 22
  11. 25

  12. Tinkoff.ru Плюсы • Может следить за тегами в Docker Registry

    и деплоить если появился новый тег • Релиз на несуществующий образ невозможен • Можно лочить релиз на определенной версии тега деплой и соответственно снимать лос • Не нужно выделять отдельного доступа до CI, flux генерирует ssh ключ через который работает с git’ом • Имеет функционал патча спек приложения • Через .flux.yml можно использовать хоть Kustomize, хоть ksonnet • Поддерживает приватные репозитории • Есть хуки 26
  13. Tinkoff.ru Минусы • Нужен рутовый RBAC аккаунт • Интерфейс есть

    только в Weave Cloud • Изменение спецификаций идет по прямой • Релиз и роллбэк релиза в этой идеологии – публикация того или иного образа • Пока fluxctl или fluxapi не отработают flux ничего не запишет в Git • Используется memcached, но только как кеш для реквестов до Docker Registry • Удаление отслеживаемой сущности (workload) из репозитория со спецификациями переводит запущенные сервисы в статус read-only, их нельзя обновлять через flux и они не будут удалены автоматически • На каждый репозиторий (а так же комбинацию бранчей в репозитории) запускается 1 копия flux-демона 27
  14. 29

  15. Tinkoff.ru Плюсы 30 • Поддерживает все виды пакетирования в k8s

    (kustomize, ksonnet, helm) • Можно писать плагины • Есть пользовательский интерфейс • В составе идет dex, поэтому можно использовать ldap • Доступ к кластеру не нужен, только к API • Одна инсталляция может обслуживать несколько кластеров • Свои CRDs для описания инсталляции • Приватные репозитории • Есть хуки
  16. Tinkoff.ru Минусы • Автосинхронизация выключает rollback силами этого ArgoCD •

    Новую версию тега придется пушить самим • Не умеет отслеживать новые образы в Docker Registry • Не самый удобный cli 31
  17. 33

  18. Tinkoff.ru Плюсы 34 • Концепция кластера "cluster, here, does not

    map to a Kubernetes cluster. It’s merely a collection of Server Groups, irrespective of any Kubernetes clusters that might be included in your underlying architecture" • Поддержка федерации Kubernetes • Есть пользовательский интерфейс • Работает из коробки с Istio • Авто rollback • Есть поддержка LDAP и ему подобных • В pipelin’ах можно ставить триггер на тег образа
  19. Tinkoff.ru Минусы 35 • Исходя из логики описания, это не

    CD платформа, а платформа для управления приложениями Kubernetes • Тяжеловесная инсталляция • Ему нужна CI система • Публикация происходит с помощью Helm’а
  20. Tinkoff.ru Правила игры • Один репозиторий под окружение • Внутри

    репозитория спецификации приложений и их зависимости • Все спецификации лежат в итоговом представлении 38
  21. 39

  22. 42

  23. Tinkoff.ru Kind: AppProject 45 Описывает ограничения для приложений – из

    какого репозитория, какого типа сущности, в какие namespace и кластера можно публиковать приложения.
  24. 51

  25. Tinkoff.ru Рассуждения 52 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде
  26. Tinkoff.ru Рассуждения 53 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде 2. Секреты уже описаны в HashiCorp Vault, раньше мы их забирали при вызове kustomize
  27. Tinkoff.ru Рассуждения 54 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде 2. Секреты уже описаны в HashiCorp Vault, раньше мы их забирали при вызове kustomize 3. Структура данных не представляет возможным передать сразу все секреты приложению, которые ему нужны
  28. Tinkoff.ru Рассуждения 55 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде 2. Секреты уже описаны в HashiCorp Vault, раньше мы их забирали при вызове kustomize 3. Структура данных не представляет возможным передать сразу все секреты приложению, которые ему нужны 4. Есть доклад “Управление секретами с помощью HashiCorp Vault” от Сергея Носкова (Avito)
  29. Tinkoff.ru Рассуждения 56 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде 2. Секреты уже описаны в HashiCorp Vault, раньше мы их забирали при вызове kustomize 3. Структура данных не представляет возможным передать сразу все секреты приложению, которые ему нужны 4. Есть доклад “Управление секретами с помощью HashiCorp Vault” от Сергея Носкова (Avito) 5. Есть рекомендации от HashiCorp (нужно учить приложения ходить в Vault)
  30. Tinkoff.ru Рассуждения 57 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде 2. Секреты уже описаны в HashiCorp Vault, раньше мы их забирали при вызове kustomize 3. Структура данных не представляет возможным передать сразу все секреты приложению, которые ему нужны 4. Есть доклад “Управление секретами с помощью HashiCorp Vault” от Сергея Носкова (Avito) 5. Есть рекомендации от HashiCorp (нужно учить приложения ходить в Vault) 6. Есть множество реализации admission webhook’ов
  31. Tinkoff.ru Рассуждения 58 1. Кажется, что декларативное описание идет вразрез

    с тем, что мы не хотим хранить секреты в открытом виде 2. Секреты уже описаны в HashiCorp Vault, раньше мы их забирали при вызове kustomize 3. Структура данных не представляет возможным передать сразу все секреты приложению, которые ему нужны 4. Есть доклад “Управление секретами с помощью HashiCorp Vault” от Сергея Носкова (Avito) 5. Есть рекомендации от HashiCorp (нужно учить приложения ходить в Vault) 6. Есть множество реализации admission webhook’ов Оказалось, что не очень много :(
  32. 59

  33. Tinkoff.ru Особенности • Поддерживает только KV v2, а нам только

    это и нужно • Поддерживает версии секретов • Не отзывает токен после своей работы • Нет Debug-логов • Не отдает метрик, вообще 65
  34. 66

  35. 69

  36. Tinkoff.ru Resource Hooks • PreSync – например, миграции ресурсов (то,

    что нам нужно) • Sync – например, в случае какого-то сложного развертывания • PostSync – например, провести какие-то тесты, подергать какие-то ручки • SyncFail – когда все плохо 70
  37. Tinkoff.ru Sync Waves • Появилось в версии 1.1 • Делит

    фазы синхронизации на волны • Применимо к любым ресурсам 72
  38. Tinkoff.ru Правило У Application namespace, cluster и project должны быть

    заданы и соответствовать окружению репозитория 77
  39. Tinkoff.ru Ещё правило Все CRDs ArgoCD хранятся в одном namespace,

    имя Application должно быть уникальным 78
  40. Tinkoff.ru Ещё немного правил • RepoURL в Application должен содержать

    ссылку на текущий репозиторий • У Job должна быть аннотация PreSync, а SyncWave, если задан, то быть больше или равен 0 • У ConfigMap и Secret должна быть аннотация PreSync и SyncWave, у SyncWave должно быть значение -1 79
  41. Tinkoff.ru И ещё немного • У Job и Deployment репозитория

    окружения должны быть свои vault-path и vault-role аннотации • Нельзя использовать тег latest • Использовать можно только внутренний Docker Registry • У Deployment должны быть определенные лейблы 80
  42. 81

  43. Tinkoff.ru И ещё (последние) 82 • Liveness и Readiness пробы

    должны быть указаны • Ресурсы должны быть указаны • Контейнер должен запускаться с capabilities.Drop = All • Контейнер не может запускаться с capabilities.Add = SYS_ADMIN
  44. Tinkoff.ru Теперь точно последние • Контейнер не может запускаться от

    root • Контейнер не может запускаться с runAsUser > 10000 • Контейнер может запускаться только с readOnlyFileSystem • Контейнер не может запускаться с privileged = true • В контейнер не должен быть проброшен Docker-сокет 83
  45. 84

  46. 86

  47. Tinkoff.ru • ArgoCD – можно попробовать • bank-vaults – можно

    использовать • OPA и conftest – нужно использовать 91
  48. Tinkoff.ru Ссылки • https://github.com/banzaicloud/bank-vaults • https://banzaicloud.com/blog/inject-secrets-into-pods-vault-revisited/ • https://habr.com/ru/company/oleg-bunin/blog/438740/ • https://github.com/instrumenta/conftest

    • https://github.com/argoproj/argo-cd • https://github.com/leominov/conftest-wrapper • https://www.openpolicyagent.org/docs/latest/kubernetes-introduction/ • https://github.com/fluxcd/flux • https://learn.hashicorp.com/vault/identity-access-management/vault-agent-k8s • https://www.vaultproject.io/docs/auth/kubernetes.html • https://github.com/tsandall/vscode-opa • https://github.com/controlplaneio/kubesec • https://github.com/flant/werf 92