Terraform创建GKE集群时dns_config.cluster_dns_scope状态为空导致持续变更计划问题排查
解决Terraform GKE集群
cluster_dns_scope状态为空导致重复变更的问题 这种情况我之前也碰到过,结合你使用的Google Provider v4.12.0版本来看,大概率是Provider存在dns_config字段的状态同步bug,给你几个实用的解决方案:
1. 升级Google Provider到较新版本
Google Provider的早期v4.x版本确实存在过cluster_dns_scope字段无法正确写入Terraform状态文件的问题,后续版本已经修复了这个bug。建议你把Provider版本升级到v4.30.0及以上。
修改你的required_providers配置:
terraform { required_providers { google = { source = "hashicorp/google" version = ">= 4.30.0" } } }
执行terraform init -upgrade完成版本升级,再重新执行terraform apply,之后状态文件就能正确保存cluster_dns_scope的值,不会再出现重复变更提示。
2. 使用lifecycle.ignore_changes临时屏蔽变更(适合无法升级Provider的场景)
如果因为项目限制暂时无法升级Provider,可以通过Terraform的生命周期配置忽略这个字段的变更检测,让terraform plan不再提示这个无效的变更。
修改你的google_container_cluster资源:
resource "google_container_cluster" "primary" { name = local.cluster_name location = local.region remove_default_node_pool = true initial_node_count = 1 network = module.gke_vpc.network_name subnetwork = module.gke_vpc.subnetwork_name project = local.project dns_config { cluster_dns = "CLOUD_DNS" cluster_dns_scope = "VPC_SCOPE" } # 添加生命周期块,忽略cluster_dns_scope的变更检测 lifecycle { ignore_changes = [ dns_config[0].cluster_dns_scope, ] } }
这里注意dns_config[0]的索引,因为Terraform把嵌套的dns_config块视为列表类型,需要用索引0定位。
3. 验证GKE集群的实际DNS配置
先用gcloud命令确认集群的实际DNS配置是否正确,排除API层面的问题:
gcloud container clusters describe ${local.cluster_name} --location ${local.region} --format="value(dnsConfig.clusterDnsScope)"
如果返回的是VPC_SCOPE,说明集群本身配置没问题,完全是Terraform Provider的状态同步bug,直接升级Provider就能解决。
内容的提问来源于stack exchange,提问作者jerome
相关产品推荐
相关产品推荐

