如何通过Terraform为GKE的Kubernetes Ingress绑定静态IP地址?
问题原因
- 注解与静态IP类型不匹配
GKE Ingress的两个静态IP绑定注解有严格的适用场景:kubernetes.io/ingress.global-static-ip-name仅适用于全局级外部静态IP,你现有IP为asia-northeast2区域级静态IP,使用全局注解查询时GKE控制器会判定IP不存在。 - Terraform Ingress资源API版本不兼容
你使用的kubernetes_ingress资源属于已废弃的旧版本资源,适配较新GKE集群的networking.k8s.io/v1版本Ingress API时,会缺少ingress.class声明等必填配置,导致注解无法被GKE Ingress控制器正确识别。 - 权限不足(概率较低)
如果你的GKE集群和静态IP属于不同GCP项目,GKE控制器服务账号没有对应IP的读取权限,也会触发该报错。
修复方案
- 匹配IP类型与注解
如果继续使用现有区域级静态IP,将注解替换为kubernetes.io/ingress.regional-static-ip-name;如果需要使用全局IP,先在GCP VPC控制台创建全局级静态IP再绑定。 - 修正Terraform Ingress配置
使用新版kubernetes_ingress_v1资源,补充Ingress类声明,适配v1 API结构,参考配置如下:
resource "kubernetes_ingress_v1" "test_ingress" { metadata { name = "test-ingress" annotations = { # 区域静态IP用该注解 "kubernetes.io/ingress.regional-static-ip-name" = "test-address" # 全局静态IP替换为下面的注解 # "kubernetes.io/ingress.global-static-ip-name" = "test-address" "kubernetes.io/ingress.class" = "gce" } } spec { default_backend { service { name = "test-service" port { number = 80 } } } } }
- (跨项目场景)权限配置
给GKE集群的默认服务账号授予静态IP所属项目的roles/compute.globalAddresses.get(全局IP)或roles/compute.addresses.get(区域IP)权限。
内容的提问来源于stack exchange,提问作者Eric Lee
相关产品推荐
相关产品推荐

