терраформирование с зависимыми провайдерами - PullRequest
0 голосов
/ 13 января 2019

В моей инфраструктуре terraform я раскручиваю несколько кластеров Kubernetes на основе параметров, а затем устанавливаю некоторое стандартное содержимое в эти кластеры Kubernetes с помощью провайдера kubernetes.

Когда я изменяю параметры, и один из кластеров больше не нужен, terraform не может разорвать его, потому что поставщик и ресурсы находятся в модуле. Однако я не вижу альтернативы, потому что я создаю кластер kubernetes в этом же модуле, и все объекты kubernetes относятся к кластеру kubernetes.

Все решения, которые я могу придумать, включают добавление набора шаблонов к моей конфигурации terraform. Стоит ли подумать о создании моей конфигурации terraform из скрипта?


Я сделал git-репо, который точно показывает мои проблемы:

https://github.com/bukzor/terraform-gke-k8s-demo

1 Ответ

0 голосов
/ 13 января 2019

TL; DR

Два решения:

  1. Создание двух отдельных модулей с помощью Terraform
  2. Используйте интерполяции и зависимость_ между кодом, который создает ваш кластер Kubernetes, и ресурсами kubernetes:

    resource "kubernetes_service" "example" {
      metadata {
        name = "my-service"
      }
    
      depends_on = ["aws_vpc.kubernetes"]
    }
    
    resource "aws_vpc" "kubernetes" {
      ...
    }
    

При уничтожении ресурсов

Вы столкнулись с проблемой жизненного цикла зависимости

PS: я не знаю код, который вы использовали для создания / подготовки вашего кластера Kubernetes, но я думаю, что это выглядит так

  1. Написать код для кластера Kubernetes (создает VPC)
  2. Применить
  3. Написать код для обеспечения Kubernetes (создайте Сервис, который создает ELB)
  4. Применить это
  5. Попробуйте все уничтожить => Ошибка

То, что происходит, заключается в том, что, создав службу LoadBalancer , Kubernetes предоставит ELB на AWS. Но Terraform этого не знает, и нет никакой связи между созданным ELB и любыми другими ресурсами, управляемыми Terraform. Поэтому, когда terraform пытается уничтожить ресурсы в коде, он попытается уничтожить VPC. Но этого не может быть, потому что внутри этого VPC есть ELB, о котором терраформ не знает. Первым делом нужно убедиться, что Terraform «депровизирует» кластер Kubernetes, а затем уничтожить сам кластер.

Два решения здесь:

  1. Используйте разные модули, чтобы не было жизненного цикла зависимостей. Например, первый модуль может быть k8s-infra, а другой - k8s-resources. Первый управляет всем скелетом Кубернетеса и применяется первым / уничтожает последним. Второй управляет тем, что находится внутри кластера и применяется последним / первым уничтожается.

  2. Используйте параметр depends_on для явной записи жизненного цикла зависимости

При создании ресурсов

Вы также можете столкнуться с проблемой зависимости, когда terraform apply не может создать ресурсы, даже если ничего еще не применено. Я приведу другой пример с postgres

  1. Написать код для создания сервера RDS PostgreSQL
  2. Примените его с помощью Terraform
  3. Введите код, в том же модуле , чтобы предоставить этот экземпляр RDS провайдеру postgres terraform
  4. Примените его с помощью Terraform
  5. Уничтожить все
  6. Попробуйте применить все => ОШИБКА

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

Решением здесь является использование целевого параметра команды plan / apply. Terraform будет инициализировать только тех поставщиков, которые связаны с применяемыми ресурсами.

  1. Примените код RDS у провайдера AWS: terraform apply -target=aws_db_instance
  2. Применить все terraform apply. Поскольку экземпляр RDS уже доступен, поставщик PostgreSQL также может инициировать себя
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...