【问题标题】:Namespace creation failing in TerraformTerraform 中的命名空间创建失败
【发布时间】:2021-05-13 10:23:54
【问题描述】:

我们正在尝试在 AKS 群集中创建 namespacesterraform。但是,它一直因错误而失败。将Service Principal 用于az login

配置-

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 文件,所以不能使用它。此外,使用hostclient_certificateclient_keycluster_ca_certificate 会抛出Unauthorized 错误(因为它应该会阻止访问)

参考了一些来自 -

How to always run local-exec with Terraform

How to automatically authenticate against the kubernetes cluster after creating it with terraform in Azure?

Create Resource Dependencies

【问题讨论】:

    标签: azure terraform azure-aks


    【解决方案1】:

    在大多数情况下,实例化新服务在相同的 Terraform 配置中通过单独的提供程序使用它是不切实际的,因为这个中断的 Terraform 模型在采取任何措施之前创建一个完整的计划行动。这种情况下的失败很可能是因为 Terraform 试图在计划创建 Kubernetes 集群本身的同时计划创建 kubernetes_namespace.test0,这是不可能的,因为尚未创建集群。

    因此,完成此任务的最可靠方法是将这个 Terraform 配置拆分为两个单独的部分:首先,使用azurerm 提供程序创建集群的配置,然后单独配置具有正确-configured provider "kubernetes" 块,指的是第一个配置创建的集群。

    您的示例还显示了使用local-exec 配置程序获取凭据的尝试。同样,这是不可能的,因为配置程序发生在应用步骤而不是计划步骤中,因此在计划期间将没有可用的配置。

    使用 Terraform 的典型方法是在运行 Terraform 之前分别执行任何必要的登录步骤,例如预先在 shell 提示符下运行 az loginaz aks get-credentials。然后适当的 Terraform 提供者应该自动检测凭据和可能的其他设置,就像目标平台的其他工具通常做的那样,无论是通过环境变量还是凭据文件,这取决于该服务的通常约定。

    【讨论】:

    • 感谢您的建议@Martin!我忘了包含信息 - 在它仍然失败之前已经创建了 aks 集群。但是,作为一种临时解决方法,我创建了一个 shell 脚本和一个参数化的 yaml,我在 Terraform 执行完成后使用它们来创建命名空间。
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多