Как правильно управлять изменениями в манифестах kubernetes?

#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 or kubectl 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 .