Terraform创建GKE NEG类型Service遇NEG注解无效报错求助
GKE NEG注解无效问题排查修复方案
核心报错原因
你遇到的webhook拒绝请求问题,核心是cloud.google.com/neg注解的值格式不符合GKE NEG准入控制器的校验规则,同时配置中还存在端口映射写反、语法缺失两个隐性问题,会导致资源创建或运行异常。
具体修复点
1. 修正NEG注解格式
GKE要求cloud.google.com/neg的注解值必须是标准JSON序列化字符串,你当前写的"ingress: true"是类YAML格式,不属于合法JSON,会直接被准入webhook拦截。
- 供Ingress使用的NEG基础配置注解合法格式为:
{"ingress": true} - 如果需要为指定端口自定义NEG配置,可以按端口声明,例如:
{"ingress": true, "exposed_ports": {"80": {"name": "nginx-http"}}}
建议在Terraform中直接使用内置jsonencode()函数生成注解值,完全避免手写JSON的转义、格式错误问题。
2. 修正Service端口映射逻辑
你当前Service的端口参数写反了对应关系:
port字段:Service在集群内暴露的访问端口,对应你定义的ext_porttarget_port字段:后端Pod实际监听的容器端口,对应你定义的int_port
参数写反会导致NEG创建成功后,后端端口探测失败、流量无法正常转发。
3. 补全Terraform语法缺失
你提供的代码中locals.service配置块末尾缺少1个闭合大括号,执行terraform validate时会直接报语法错误,需要补上。
修正后可直接运行的配置参考
## 命名空间 ## resource "kubernetes_namespace" "test" { metadata { name = "nginx" } } ### Deployment ### resource "kubernetes_deployment" "test" { for_each = local.deployment metadata { name = each.key namespace = kubernetes_namespace.test.metadata.0.name } spec { replicas = each.value.replicas selector { match_labels = each.value.selector } template { metadata { labels = each.value.selector } spec { container { image = each.value.image name = each.key port { container_port = each.value.int_port } } } } } } ### Service ### resource "kubernetes_service" "test" { for_each = local.service metadata { name = each.key namespace = kubernetes_namespace.test.metadata.0.name annotations = { "cloud.google.com/neg" = jsonencode({ ingress = true }) } } spec { selector = each.value.selector type = each.value.type port { port = each.value.ext_port target_port = each.value.int_port } } } locals { deployment = { nginx = { selector = { app = "nginx" } image = "nginx" replicas = 2 int_port = 80 } } } locals { service = { nginx-svc = { selector = { app = "nginx" } type = "ClusterIP" int_port = 80 ext_port = 80 } } # 补全原配置缺失的闭合括号 }
验证步骤
- 配置修改后先执行
terraform validate确认无语法错误,再执行terraform plan核对参数变更符合预期 - 执行
terraform apply完成资源创建 - 资源创建完成后执行如下命令校验NEG状态:
如果返回结果的注解中存在kubectl get svc nginx-svc -n nginx -o yamlcloud.google.com/neg-status字段,且字段值中包含生成的NEG名称、端口映射信息,就代表NEG配置生效。
内容的提问来源于stack exchange,提问作者이병준Byungjun Lee
相关产品推荐
相关产品推荐

