azure - Terraform 中的命名空间创建失败

标签 azure terraform azure-aks

我们正在尝试通过 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 文件,因此无法使用它。此外,使用 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

最佳答案

在大多数情况下,实例化新服务并在同一 Terraform 配置中将其与单独的提供程序一起使用是不切实际的,因为这打破了 Terraform 在采取任何计划之前创建完整计划的模型行动。这种情况下的失败可能是因为 Terraform 试图在计划创建 Kubernetes 集群本身的同时计划创建 kubernetes_namespace.test0,但这是不可能的,因为集群还没有尚未创建。

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

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

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

关于azure - Terraform 中的命名空间创建失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66124907/

相关文章:

java - 如何使用Spring Boot Java应用程序不断从服务总线队列中拉取消息

function - Azure 函数 "Host keys"不是使用 Terraform 创建的

azure - 错误: LinkedAuthorizationFailed on configurating AppGW

c# - 当根文件系统为只读时,如何将证书添加到 POD/Container 的证书存储中

Azure 应用程序网关 + Web 应用程序 = SSLLABS A+?

Azure AD 身份颁发者 MicrosoftAccount

azure - 在本地计算机上编译 Azure Functions(.csx 文件)

azure - Terraform azurerm azurerm_data_factory_dataset_binary 参数定义

lambda - 使用 Terraform/CloudFormation/其他东西有效部署 lambda(仅部署已更改的)

azure-devops 管道 :unable to recognize "/abc.yml": Get http://localhost:8080/api? 超时=32s : dial tcp 127. 0.0.1:8080:连接:连接被拒绝