我们正在尝试通过 AKS 集群中的 terraform
创建命名空间
。然而,它总是因错误而失败。使用服务主体
进行az登录
配置-
resource "null_resource" "aks_login" {
triggers = {
always_run = "${timestamp()}"
}
provisioner "local-exec" {
command = "az aks get-credentials -g rg-my-cluster -n my-cluster --admin --overwrite-existing"
}
}
resource "kubernetes_namespace" "test0" {
metadata {
name = "ns-test0"
}
depends_on = [null_resource.aks_login]
}
resource "kubernetes_namespace" "test1" {
for_each = toset( var.testVal )
metadata {
labels = {
istio-injection = "enabled"
}
name = "ns-test1-${each.key}"
}
depends_on = [null_resource.aks_login]
}
错误如下:
module.namespaces.null_resource.aks_login (local-exec): Executing: ["/bin/sh" "-c" "az aks get-credentials -g rg-my-cluster -n my-cluster --admin --overwrite-existing"]
module.namespaces.null_resource.aks_login (local-exec): Merged "my-cluster-admin" as current context in /home/hpad/.kube/config
module.namespaces.null_resource.aks_login: Creation complete after 1s [id=1979085082878134694]
module.namespaces.kubernetes_namespace.test0: Creating...
module.namespaces.kubernetes_namespace.test1["t1"]: Creating...
Error: Post "http://localhost/api/v1/namespaces": dial tcp [::1]:80: connect: connection refused
Error: Post "http://localhost/api/v1/namespaces": dial tcp [::1]:80: connect: connection refused
即使正在登录 AKS,它仍在考虑创建本地 k8s 集群。我是否在这里遗漏了某些内容,或者可能是由于提供程序中的错误所致。
kubernetes
提供程序配置当前为空。但是,我们没有 kubeconfig 文件,因此无法使用它。此外,使用 host
、client_certificate
、client_key
和 cluster_ca_certificate
会引发 Unauthorized
错误(因为它应该,因此访问被阻止)
引用资料来自 -
最佳答案
在大多数情况下,实例化新服务并在同一 Terraform 配置中将其与单独的提供程序一起使用是不切实际的,因为这打破了 Terraform 在采取任何计划之前创建完整计划的模型行动。这种情况下的失败可能是因为 Terraform 试图在计划创建 Kubernetes 集群本身的同时计划创建 kubernetes_namespace.test0
,但这是不可能的,因为集群还没有尚未创建。
完成此任务的最可靠方法是将此 Terraform 配置拆分为两个单独的部分:首先是使用 azurerm
提供程序创建集群的配置,然后分别是配置具有正确配置的 provider "kubernetes"
block ,该 block 引用第一个配置创建的集群。
您的示例还显示了尝试使用 local-exec
配置程序来获取凭据。同样,这是不可能的,因为配置程序是在应用步骤而不是计划步骤期间发生的,因此在计划期间不会有可用的配置。
使用 Terraform 的典型方法是在运行 Terraform 之前单独执行任何必要的登录步骤,例如运行 az login
和 az aks get-事先在 shell 提示符处输入凭据
。然后,适当的 Terraform 提供程序应该自动检测凭据和可能的其他设置,就像目标平台的其他工具通常所做的那样,无论是通过环境变量还是凭据文件,具体取决于该服务的常用约定。
关于azure - Terraform 中的命名空间创建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66124907/