使用 Terraform,我正在创建一个 Kubernetes 集群,安装nginx-ingress-controller
Helm 图表,然后为我的域添加一个 Route53 托管区域(包括指向由入口 Helm 图表创建的负载均衡器的通配符记录。
为此,我使用两个单独的 Terraform 文件,我的过程应该如下 -
- 将 Terraform 文件 1 用于
apply
VPC、EKS 集群和节点组。 - 使用 Helm CLI 安装
nginx-ingress-controller
图表(有一个与此问题无关的附加要求,这意味着 Terraform 无法安装 Helm 图表)。 - 将图表部署到的命名空间导入
nginx-ingress-controller
Terraform 文件 2 的状态 - 使用 Terraform 文件 2 到
apply
Route53 托管区域并记录入口所需。
我认为这会起作用,但是 Terraformimport
命令有一个严重的限制 -
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?
- 我需要输出由
apply
Terraform 文件 2 创建的 Route53 托管区域的 NS 记录的值。因此,我不能在 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 直接失败。在这种情况下,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
╵