#terraform #terraform0.12 #terraform-provider-kubernetes
Вопрос:
Используя Terraform, я создаю кластер Kubernetes, устанавливаю nginx-ingress-controller
Helm chart, а затем добавляю размещенную зону Route53 для своего домена (включая запись с подстановочным знаком, указывающую на балансировщик нагрузки, созданный ingress Helm chart.
Для этого я использую два отдельных файла Terraform, и мой процесс должен быть следующим —
- Используйте файл Terraform 1 для
apply
VPC, кластера EKS и группы узлов. - Используйте Helm CLI для установки
nginx-ingress-controller
диаграммы (существует дополнительное требование, не связанное с этой проблемой, которое означает, что диаграмма Helm не может быть установлена Terraform). - Импортируйте пространство имен, в которое
nginx-ingress-controller
была развернута диаграмма, в состояние для файла Terraform 2 - Используйте файл 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.