terraform kubernetes 提供程序取决于 azurerm_kubernetes_cluster 资源

问题描述 投票:0回答:1

我有一个 terraform 配置,其中提供者依赖于资源。

更准确地说,创建一个 Azure Kubernetes 实例(使用 azurerm 提供程序),然后连接到以进行进一步配置(使用 kubernetes 提供程序):

...

// 1. use azure provider to create a kubernetes cluster
resource "azurerm_kubernetes_cluster" "k8s_cluster" { ... }

// 2. configure kubernetes provider to work with the cluster
provider "kubernetes" {
  host                   = azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.host
  client_certificate     = base64decode(azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.client_certificate)
  client_key             = base64decode(azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.client_key)
  cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.cluster_ca_certificate)
}

过去,在创建或修改 kubernetes 集群时,这工作得很好;显然,kubernetes 提供程序是在创建资源后配置的。当某些更改需要重新创建集群时,它会失败;显然当时必要的资源细节还没有准备好。

但是,随着 azurerm v3.106.0 的发布,它停止工作了。

为可能在同一 terraform 运行中刚刚创建或重新创建的集群配置 kubernetes 提供程序的正确方法是什么?或者是否有另一种方法来推断

kube_config
,而不是阅读
azurerm_kubernetes_cluster.k8s_cluster.kube_config

(GitHub 的副驾驶有个好主意,在提供程序配置中添加

depends_on
,不幸的是 terraform 不支持此操作;SO 69996346 解释了为什么会这样,并建议使用
-target
将 terraform 推出限制为可用信息;但是,当集群存在并且数据应该可用时,我观察到了问题。)

terraform terraform-provider-azure terraform-provider-kubernetes
1个回答
0
投票

Terraform Kubernetes 提供程序取决于 azurerm_kubernetes_cluster 资源

使用提供程序重新创建和修改集群的要求在最新版本的 terraform 提供程序中不可用。

感谢 Matthew Schuchard 提供了使用

-target
来实现要求的宝贵见解。

最初,当我尝试重新创建集群时,我遇到了阻止程序,因为它没有访问 Kubernetes 提供程序所需的权限。

为了克服这个问题,我在创建集群配置后尝试使用数据模块,并使用依赖于模块,以便确保在连接到 kubernates 提供程序之前配置中更新的必要更改与门户中的资源同步。

配置:

resource "azurerm_kubernetes_cluster" "k8s_cluster" {
  name                = "vinay-aks"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  dns_prefix          = "dns-vinay-aks"

  default_node_pool {
    name       = "default"
    node_count = 1
    vm_size    = "Standard_DS2_v2"
  }

  identity {
    type = "SystemAssigned"
  }

  network_profile {
    network_plugin    = "azure"
    dns_service_ip    = "10.0.0.10"
    service_cidr      = "10.0.0.0/16"
  }

  tags = {
    Environment = "Production"
  }
}

data "azurerm_kubernetes_cluster" "k8s_cluster" {
  name                = azurerm_kubernetes_cluster.k8s_cluster.name
  resource_group_name = azurerm_kubernetes_cluster.k8s_cluster.resource_group_name
  depends_on          = [azurerm_kubernetes_cluster.k8s_cluster]
}

provider "kubernetes" {
  host                   = azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.host
  client_certificate     = base64decode(azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.client_certificate)
  client_key             = base64decode(azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.client_key)
  cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.k8s_cluster.kube_config.0.cluster_ca_certificate)
}

resource "kubernetes_namespace" "example" {
  metadata {
    name = "vinay-namespace"
  }
}

部署:

enter image description here

enter image description here

现在我在配置中进行了一些更改,以便通过更改

dns name
来重新创建集群。

dns_prefix =“dns-vinay-aks”

并运行 terraform 命令如下

terraform apply -target="azurerm_kubernetes_cluster.k8s_cluster"

enter image description here

enter image description here

参考:

https://developer.hashicorp.com/terraform/tutorials/state/resource-targeting

© www.soinside.com 2019 - 2024. All rights reserved.