Можете ли вы определить службы/модули Kubernetes с помощью YAML в Terraform?

Я использую поставщика Kubernetes для описания сервисов/модулей в Terraform.

Использование языка конфигурации Hashicorp для определения kubernetes_pod может привести к путанице. или ресурсы kubernetes_service, поскольку документация Kubernetes описывает в YAML все, что это означает, что вам нужно перевести его в HCL.

Можно ли определить модули как YAML и использовать их с ресурсами kubernetes_pod и kubernetes_service в качестве шаблонов?


person LondonAppDev    schedule 11.11.2017    source источник


Ответы (3)


Хотя Terraform обычно использует HCL, это надмножество JSON (как и сам YAML), поэтому также может читать JSON.

Одним из возможных вариантов было бы взять уже имеющиеся у вас примеры YAML и преобразовать их в JSON, а затем использовать для них Terraform.

К сожалению, это вряд ли сработает, потому что ключевые слова, вероятно, будут отличаться для того, как Terraform ожидает вещи, поэтому вам нужно будет что-то написать, чтобы сделать базовый перевод входного YAML в JSON ресурса Terraform. На этом этапе, вероятно, стоит просто добавить выходные данные HCL к преобразованию, чтобы ваша выходная конфигурация Terraform была более читабельной, если вы когда-либо намереваетесь сохранить конфигурацию Terraform, а не просто конвертировать и применять конфигурацию одним выстрелом.

Преимущество такого подхода заключается в том, что у вас есть повторно используемая конфигурация Kubernetes, которую можно запускать с помощью kubectl или других инструментов, но которая дает вам возможности управления жизненным циклом Terraform, возможность планировать изменения и интеграцию с частями вашей инфраструктуры, не относящимися к Kubernetes ( например, настроить экземпляры для запуска кластера Kubernetes).

Я мало использовал его, но считаю, что Kops позволит вам сохранить конфигурацию pod/service в обычном Kubernetes YAML, но затем может использовать Terraform для управления конфигурацией и даже позволяет вам выводить конфигурацию Terraform, чтобы вы могли запускать ее вне самого Kops.

person ydaetskcoR    schedule 11.11.2017
comment
Оцените ответ. Я полагаю, нет возможности сделать что-то вроде config = template(...) тогда...? - person LondonAppDev; 11.11.2017
comment
К сожалению нет. Есть несколько ресурсов, поддерживающих нечто подобное, в том числе один из ресурсов AWS API Gateway, в котором недавно была добавлена ​​поддержка использования файла спецификаций swagger. Так что, возможно, стоит поднять вопрос о запросе функции, если вы считаете, что это может быть полезно. - person ydaetskcoR; 14.11.2017

Вас также может заинтересовать следующий проект, который позволяет конвертировать файлы YAML в HCL Terraform.

https://github.com/sl1pm4t/k2tf

Описание:

Инструмент для преобразования объектов API Kubernetes (в формате YAML) в язык конфигурации Terraform от HashiCorp.

Преобразованные файлы .tf подходят для использования с поставщиком Terraform Kubernetes.

person orendain    schedule 13.11.2019

Поставщик hashicorp/kubernetes не поддерживает необработанный YAML/JSON и не собирается его реализовывать.

Возможные решения:

  • K2tf, инструмент для преобразования манифестов Kubernetes RAW YAML в Terraform HCL для поставщик Kubernetes.
  • Используйте альтернативного провайдера Kubernetes сообщества, например gavinbunny/kubectl, который поддерживает raw YAML и может отслеживать каждый ресурс и атрибуты в состоянии Terraform, в отличие от провайдера kubernetes-alpha.
  • Другим решением является использование поставщика hashicorp/kubernetes-alpha, вы можете передать в объекте Terraform или преобразовать необработанный манифест YAML в объект TF для использования в ресурсе поставщика. Недостатком является то, что атрибуты не отслеживаются как отдельные объекты, и поэтому изменение приведет к тому, что весь ресурс будет испорчен.

Используя поставщика kubectl.

Ядром этого провайдера является ресурс kubectl_manifest, позволяющий обрабатывать и применять yaml в свободной форме к Kubernetes. Затем этот объект yaml отслеживается и беспрепятственно обрабатывает создание, обновление и удаление, включая обнаружение дрейфа. Этот провайдер идеален, если вы хотите отслеживать манифест в Terraform:

resource "kubectl_manifest" "test" {
    yaml_body = file("path/to/manifest.yaml")
}

Использование поставщика kubernetes-alpha

kubernetes_manifest представляет один ресурс Kubernetes, как описано в атрибуте manifest. Значение манифеста — это транскрипция HCL обычного манифеста Kubernetes YAML. Чтобы преобразовать существующий манифест из YAML в HCL, используйте встроенную функцию Terrafrom yamldecode() или используйте tfk8s инструмент для преобразования YAML в атрибуты манифеста для ресурса манифеста поставщика kubernetes-alpha.

Пример использования yamldecode:

resource "kubernetes_manifest" "service" {
  provider = kubernetes-alpha

  manifest = yamldecode(file("path/to/manifest.yaml"))
}

Почему провайдер kubernetes не поддерживает RAW YAML?

Поддержка YAML/JSON в hashicorp/kubernetes рассматривалась раньше (самое первое предложение провайдера K8S было именно так) и при первоначальном внедрении этого провайдера мы решили его не делать.

Причина в том, что вы не можете точно отслеживать ресурсы, созданные из RAW YAML, как объекты Terraform.

С точки зрения разработчика Terraform очень сложно обойти то, как работает K8S API, когда вы отправляете массив [a, b, c] в Create API, а затем возвращаете [a, b, c, d]. Это происходит, например, с модулями, к которым автоматически подключаются некоторые секретные тома, но происходит и с большинством других ресурсов, с которыми мне довелось поиграться. Белый/черный список — сложная часть.

person Highway of Life    schedule 21.04.2021
comment
Кажется, можно использовать манифесты Kubernetes в формате YAML с провайдером kubernetes-alpha. См. этот ответ: github.com/hashicorp/terraform- провайдер-kubernetes-alpha/issues/ - person Oleg; 24.05.2021
comment
Спасибо, @Oleg, я обновил ответ, включая несколько примеров. - person Highway of Life; 25.05.2021