Slide 1

Slide 1 text

GitOps CD для Kubernetes Лев Аминов tinkoff.ru 1

Slide 2

Slide 2 text

Tinkoff.ru Лев Аминов Старший инженер отдела разработки рекламных проектов в tinkoff.ru ● https://levaminov.ru ● https://github.com/leominov ● [email protected]

Slide 3

Slide 3 text

Tinkoff.ru Agenda ● Интро ● Что дано ● Какие были требования ● Какие были варианты ● Что выбрали ● Чем допинали ● Вопросы

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Tinkoff.ru Дано ● 2 guys 40+ microservices 6

Slide 7

Slide 7 text

Tinkoff.ru Дано ● 2 guys 40+ microservices ● In-repo Helm chart 7

Slide 8

Slide 8 text

Tinkoff.ru Дано ● 2 guys 40+ microservices ● In-repo Helm chart ● In-repo Kustomize specs 8

Slide 9

Slide 9 text

Tinkoff.ru Плюсы ● Конфигурация рядом с кодом 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Tinkoff.ru 15

Slide 16

Slide 16 text

Tinkoff.ru Минусы 16

Slide 17

Slide 17 text

Tinkoff.ru Минусы ● Теряется история изменений ● Нет возможности эти изменения откатить ● Нет менеджера зависимостей ● Нет инструмента для работы с секретами ● У разработки свои процессы ● Много Shell-скриптов ● Никто не разбирается, как это работает ● Если что-то не работает, все равно идут к тебе ● 40+ репозиториев 17

Slide 18

Slide 18 text

Tinkoff.ru 18

Slide 19

Slide 19 text

Tinkoff.ru 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Tinkoff.ru Варианты

Slide 24

Slide 24 text

Tinkoff.ru Flux https://github.com/weaveworks/flux

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Tinkoff.ru ArgoCD https://github.com/argoproj/argo-cd

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Tinkoff.ru Минусы ● Автосинхронизация выключает rollback силами этого ArgoCD ● Новую версию тега придется пушить самим ● Не умеет отслеживать новые образы в Docker Registry ● Не самый удобный cli 31

Slide 32

Slide 32 text

Tinkoff.ru Spinnaker https://www.spinnaker.io

Slide 33

Slide 33 text

33

Slide 34

Slide 34 text

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’ах можно ставить триггер на тег образа

Slide 35

Slide 35 text

Tinkoff.ru Минусы 35 ● Исходя из логики описания, это не CD платформа, а платформа для управления приложениями Kubernetes ● Тяжеловесная инсталляция ● Ему нужна CI система ● Публикация происходит с помощью Helm’а

Slide 36

Slide 36 text

36 VS

Slide 37

Slide 37 text

37 VS

Slide 38

Slide 38 text

Tinkoff.ru Правила игры ● Один репозиторий под окружение ● Внутри репозитория спецификации приложений и их зависимости ● Все спецификации лежат в итоговом представлении 38

Slide 39

Slide 39 text

39

Slide 40

Slide 40 text

40 VS

Slide 41

Slide 41 text

Tinkoff.ru ArgoCD

Slide 42

Slide 42 text

42

Slide 43

Slide 43 text

Tinkoff.ru Declarative Setup 43

Slide 44

Slide 44 text

Tinkoff.ru Новая схема работы 44

Slide 45

Slide 45 text

Tinkoff.ru Kind: AppProject 45 Описывает ограничения для приложений – из какого репозитория, какого типа сущности, в какие namespace и кластера можно публиковать приложения.

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

Tinkoff.ru Kind: Application 47 Настройка самого приложения – откуда брать спецификации, куда их публиковать.

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

Строение проекта

Slide 50

Slide 50 text

Tinkoff.ru Проблема 1

Slide 51

Slide 51 text

51

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

59

Slide 60

Slide 60 text

Tinkoff.ru Мутируем POD 60

Slide 61

Slide 61 text

Tinkoff.ru Комируем vault-env 61

Slide 62

Slide 62 text

Tinkoff.ru Запрашиваем значения 62

Slide 63

Slide 63 text

Tinkoff.ru Формируем список переменных 63

Slide 64

Slide 64 text

Tinkoff.ru Запускаем приложение 64

Slide 65

Slide 65 text

Tinkoff.ru Особенности ● Поддерживает только KV v2, а нам только это и нужно ● Поддерживает версии секретов ● Не отзывает токен после своей работы ● Нет Debug-логов ● Не отдает метрик, вообще 65

Slide 66

Slide 66 text

66

Slide 67

Slide 67 text

Tinkoff.ru Transit encryption 67

Slide 68

Slide 68 text

Tinkoff.ru Проблема 2

Slide 69

Slide 69 text

69

Slide 70

Slide 70 text

Tinkoff.ru Resource Hooks ● PreSync – например, миграции ресурсов (то, что нам нужно) ● Sync – например, в случае какого-то сложного развертывания ● PostSync – например, провести какие-то тесты, подергать какие-то ручки ● SyncFail – когда все плохо 70

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

Tinkoff.ru Sync Waves ● Появилось в версии 1.1 ● Делит фазы синхронизации на волны ● Применимо к любым ресурсам 72

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

Tinkoff.ru Проблема 3

Slide 76

Slide 76 text

Tinkoff.ru Правила 76

Slide 77

Slide 77 text

Tinkoff.ru Правило У Application namespace, cluster и project должны быть заданы и соответствовать окружению репозитория 77

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

81

Slide 82

Slide 82 text

Tinkoff.ru И ещё (последние) 82 ● Liveness и Readiness пробы должны быть указаны ● Ресурсы должны быть указаны ● Контейнер должен запускаться с capabilities.Drop = All ● Контейнер не может запускаться с capabilities.Add = SYS_ADMIN

Slide 83

Slide 83 text

Tinkoff.ru Теперь точно последние ● Контейнер не может запускаться от root ● Контейнер не может запускаться с runAsUser > 10000 ● Контейнер может запускаться только с readOnlyFileSystem ● Контейнер не может запускаться с privileged = true ● В контейнер не должен быть проброшен Docker-сокет 83

Slide 84

Slide 84 text

84

Slide 85

Slide 85 text

Tinkoff.ru Альтернативное применение 85

Slide 86

Slide 86 text

86

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

Tinkoff.ru Круто? Круто! 89

Slide 90

Slide 90 text

Tinkoff.ru Выводы

Slide 91

Slide 91 text

Tinkoff.ru ● ArgoCD – можно попробовать ● bank-vaults – можно использовать ● OPA и conftest – нужно использовать 91

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

Вопросы • https://github.com/leominov • https://t.me/leominov • [email protected] 93