如何通过Terraform创建私有AKS集群及内部命名空间并实现集群自动连接
配置步骤
你只需要新增Kubernetes Provider配置关联已有的AKS资源,再新增命名空间资源即可实现集群重建后自动创建命名空间,具体配置如下:
1. 先声明Kubernetes Provider依赖
在你的terraform块的required_providers中新增kubernetes provider声明:
terraform { required_providers { azurerm = { source = "hashicorp/azurerm" version = ">= 3.0.0" } # 新增以下配置 kubernetes = { source = "hashicorp/kubernetes" version = ">= 2.20.0" } } }
2. 配置Kubernetes Provider连接AKS集群
直接从你已有的azurerm_kubernetes_cluster资源中提取连接凭证,Terraform会自动保证集群创建完成后再初始化该Provider:
单集群场景
provider "kubernetes" { host = azurerm_kubernetes_cluster.aks_cluster["你的集群key"].kube_config[0].host client_certificate = base64decode(azurerm_kubernetes_cluster.aks_cluster["你的集群key"].kube_config[0].client_certificate) client_key = base64decode(azurerm_kubernetes_cluster.aks_cluster["你的集群key"].kube_config[0].client_key) cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks_cluster["你的集群key"].kube_config[0].cluster_ca_certificate) }
多集群批量场景
如果需要同时管理多个AKS集群,为每个集群配置带别名的Provider:
# 集群1的Provider provider "kubernetes" { alias = "cluster1" host = azurerm_kubernetes_cluster.aks_cluster["cluster1"].kube_config[0].host client_certificate = base64decode(azurerm_kubernetes_cluster.aks_cluster["cluster1"].kube_config[0].client_certificate) client_key = base64decode(azurerm_kubernetes_cluster.aks_cluster["cluster1"].kube_config[0].client_key) cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks_cluster["cluster1"].kube_config[0].cluster_ca_certificate) } # 集群2的Provider provider "kubernetes" { alias = "cluster2" host = azurerm_kubernetes_cluster.aks_cluster["cluster2"].kube_config[0].host client_certificate = base64decode(azurerm_kubernetes_cluster.aks_cluster["cluster2"].kube_config[0].client_certificate) client_key = base64decode(azurerm_kubernetes_cluster.aks_cluster["cluster2"].kube_config[0].client_key) cluster_ca_certificate = base64decode(azurerm_kubernetes_cluster.aks_cluster["cluster2"].kube_config[0].cluster_ca_certificate) }
3. 新增命名空间资源
单集群场景
resource "kubernetes_namespace" "custom_ns" { metadata { name = "你要创建的命名空间名称" labels = { environment = var.env } } }
多集群批量场景
为每个集群创建对应命名空间,指定对应别名的Provider即可:
# 集群1的命名空间 resource "kubernetes_namespace" "cluster1_ns" { provider = kubernetes.cluster1 metadata { name = "app-namespace" labels = { environment = var.env cluster = "cluster1" } } } # 集群2的命名空间 resource "kubernetes_namespace" "cluster2_ns" { provider = kubernetes.cluster2 metadata { name = "app-namespace" labels = { environment = var.env cluster = "cluster2" } } }
注意事项
- 运行Terraform的执行环境必须和私有AKS集群的VNet网络连通:私有AKS的API服务器IP为私有地址,即使开启了公有FQDN,解析出来的也是私有IP,网络不通会导致连接集群失败。
- 如果你为AKS开启了Azure AD认证,需要调整Kubernetes Provider的配置,改用Azure AD相关的认证参数,无需使用证书认证。
- Terraform会自动处理资源依赖,保证AKS集群完全创建完成后再执行命名空间的创建操作,无需手动添加依赖。
内容的提问来源于stack exchange,提问作者shan
相关产品推荐
相关产品推荐

