我有一个 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 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"
}
}
部署:
现在我在配置中进行了一些更改,以便通过更改
dns name
来重新创建集群。
dns_prefix =“dns-vinay-aks”
并运行 terraform 命令如下
terraform apply -target="azurerm_kubernetes_cluster.k8s_cluster"
参考:
https://developer.hashicorp.com/terraform/tutorials/state/resource-targeting