#kubernetes #terraform #devops #amazon-eks #terraform-provider-kubernetes
#kubernetes #terraform #devops #amazon-eks #terraform-provider-kubernetes
Вопрос:
Я уже некоторое время пользуюсь terraform, и мне это действительно нравится. Я также настроил Atlantis, чтобы у моей команды был поток «GitOps». Это мой текущий процесс:
- Добавление или удаление ресурсов из файлов Terraform
- Отправьте изменения на GitHub и создайте запрос на извлечение
- Atlantis принимает изменения и создает план terraform
- Когда PR одобрен, Atlantis применяет изменения
Недавно мне понадобилось настроить несколько управляемых кластеров Kubernetes с помощью Amazon EKS. Хотя Terraform способен создавать большую часть базовой инфраструктуры, он не справляется с настройкой некоторых ресурсов k8s (нет поддержки шлюзов или ingress, нет поддержки функций alpha / beta и т.д.). Поэтому вместо этого я полагался на ручной подход с использованием kubectl:
- Добавьте ресурс в существующий файл или создайте новый файл
- Добавьте строку в makefile, которая запускает соответствующую команду (kubectl apply или create) для нового файла
- Если я использую диаграмму helm, добавьте строку с помощью
helm template
а затемkubectl apply
(мне не очень понравилось использовать tiller, и helm3 все равно избавляется от нее) - Если я хочу удалить ресурс, я делаю это вручную с помощью
kubectl delete
Этот процесс кажется далеко не таким чистым, как то, что мы делаем в Terraform. Существует несколько ключевых проблем:
- Там нет настоящего сухого хода. Использование
kubectl --dry-run
orkubectl diff
на самом деле не работает, это всего лишь разница на стороне клиента. Функции diff на стороне сервера в настоящее время находятся в альфа-версии - Нет файла состояния. Если я удаляю данные из манифестов, я должен не забыть также удалить их из кластера вручную.
- Нет четкого способа достичь gitops. Я просмотрел Weaveworks Flux, но, похоже, он больше ориентирован на развертывание приложений.
- Makefile становится все более и более сложным. Не похоже, что это масштабируемо.
Я должен признать, что я довольно новичок в Kubernetes, поэтому, возможно, упускаю из виду что-то очевидное.
Есть ли у меня способ добиться процесса, аналогичного тому, что у меня есть в Terraform, во вселенной Kubernetes?
Комментарии:
1. Я лично согласен с вашим описанием проблемы здесь, поскольку оно отражает опыт, который у меня был за последний год. Если вам нужно что-то, что четко привязывает создание кластера Terraform к развертываниям Helm, но обеспечивает более надежное решение, чем raw
kubectl
, могу ли я порекомендоватьk8s
модуль в Ansible? Это может довольно хорошо преодолеть разрыв между настройкой инфраструктуры Terraform и развертыванием Helm. Убедитесь, чтоkubeconfig
выходные данные Terraform обрабатываются Ansible. Я сам связываю все это вместе в конвейере Jenkins, но ваш выбор тоже должен работать хорошо.
Ответ №1:
Это скорее вопрос мнения, поэтому я отвечу с мнением. Если вы хотите управлять конфигурацией, вы можете попробовать некоторые из этих инструментов:
- Если вы хотите использовать существующие файлы YAML (конфигурации) и использовать что-то на более высоком уровне, вы можете попробовать kustomize.
- Если вы хотите управлять конфигурациями Kubernetes с помощью Jsonnet, вам следует взглянуть на Ksonnet. Имейте в виду, что Ksonnet не будет поддерживаться в будущем.
Если вы хотите просто автоматически выполнять helm update
в автоматическом режиме, там еще нет инструмента. На этом этапе вам нужно будет что-то создать, чтобы все организовать. Например, в итоге мы создали собственный инструмент, который делает это.
Комментарии:
1. Ksonnet больше не поддерживается. «Команда, стоящая за ksonnet, отказывается от участия в проекте. В результате работа над ksonnet завершится, а репозитории GitHub будут заархивированы». ksonnet.io
2. Моя проблема не связана с шаблонизацией (у меня Helm отлично работал). Вопрос относится к фактическому применению изменений автоматизированным способом.
3. Понятно, на самом деле такого инструмента нет, в итоге мы создали наш собственный инструмент, который запускает автоматические команды типа
helm upgrade
.