Сбой импорта Terraform, поскольку поставщик Kubernetes полагается на источники данных

#terraform #terraform0.12 #terraform-provider-kubernetes

Вопрос:

Используя Terraform, я создаю кластер Kubernetes, устанавливаю nginx-ingress-controller Helm chart, а затем добавляю размещенную зону Route53 для своего домена (включая запись с подстановочным знаком, указывающую на балансировщик нагрузки, созданный ingress Helm chart.

Для этого я использую два отдельных файла Terraform, и мой процесс должен быть следующим —

  1. Используйте файл Terraform 1 для apply VPC, кластера EKS и группы узлов.
  2. Используйте Helm CLI для установки nginx-ingress-controller диаграммы (существует дополнительное требование, не связанное с этой проблемой, которое означает, что диаграмма Helm не может быть установлена Terraform).
  3. Импортируйте пространство имен, в которое nginx-ingress-controller была развернута диаграмма, в состояние для файла Terraform 2
  4. Используйте файл Terraform 2 для apply размещенной зоны Route53 и запись, необходимая для входа.

Я думал, что это сработает, но команда Terraform import имеет серьезные ограничения —

Единственное ограничение, которое Terraform имеет при чтении файлов конфигурации, заключается в том, что конфигурации поставщика импорта не должны зависеть от непеременных входных данных. Например, конфигурация поставщика не может зависеть от источника данных.

Поскольку я использую поставщика Kubernetes, который полагается на источники данных, я нарушаю это ограничение.

 data "aws_eks_cluster" "cluster" {
  name = var.cluster.name
}

data "aws_eks_cluster_auth" "cluster" {
  name = var.cluster.name
}

provider "kubernetes" {
  host                   = data.aws_eks_cluster.cluster.endpoint
  cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
  token                  = data.aws_eks_cluster_auth.cluster.token
}
 

Принимая во внимание следующее, есть ли способ использования Terraform, который будет работать?

  • Мне нужно вывести значение записи NS для размещенной зоны Route53, созданной файлом apply Terraform 2. Из-за этого я не могу включить эти ресурсы в файл Terraform 1, поскольку apply произойдет сбой, если существует вывод для модуля / ресурса, который еще не существует.
  • Пространство имен должно быть импортировано, чтобы оно было уничтожено при destroy запуске для файла Terraform 2. Если это не так, при destroy запуске для файла Terraform 1 произойдет сбой, поскольку VPC не сможет удалить из-за сетевого интерфейса и группы безопасности, созданной nginx-ingress-controller диаграммой Helm.
  • Токен, предоставленный aws_eks_cluster_auth источником данных, длится всего 15 минут (aws-iam-authenticator не может предоставить более длительный токен), поэтому нецелесообразно выводить токен из файла Terraform 1, поскольку он, вероятно, истек к моменту его использования файлом Terraform 2.

Обновить

Я пытался использовать плагин учетных данных на основе exec, поскольку это означает, что источник данных не потребуется, но это приводит к сбою Terraform прямо из gate. Похоже, что в этом случае Terraform пытается создать конфигурационный файл до module.kubernetes-cluster того, как он был создан, поэтому кластер не существует.

Эта конфигурация поставщика —

 provider "kubernetes" {
  host     = module.kubernetes-cluster.endpoint
  insecure = true
  exec {
    api_version = "client.authentication.k8s.io/v1alpha1"
    args        = ["eks", "get-token", "--region", var.cluster.region, "--cluster-name", var.cluster.name]
    command     = "aws"
  }
}
 

Выдает эту ошибку —

 ╷
│ Error: Provider configuration: cannot load Kubernetes client config
│ 
│   with provider["registry.terraform.io/hashicorp/kubernetes"],
│   on main.tf line 73, in provider "kubernetes":
│   73: provider "kubernetes" {
│ 
│ invalid configuration: default cluster has no server defined
╵
 

Комментарии:

1. Ваш поставщик не может быть переменным. Однако вы можете посмотреть на terragrunt. Это может быть полезно в вашем случае.

2. Спасибо, я посмотрю на Terragrunt.