GCP Kubernetes v1.22配置HTTP到HTTPS重定向报错解决
问题根因
你混淆了两类完全独立的API废弃规则:
kubent扫描出的v1.22版本废弃API,是Kubernetes原生Ingress资源使用的networking.k8s.io/v1beta1,该版本确实需要替换为networking.k8s.io/v1- 你修改的
FrontendConfig是GKE独有的自定义资源(CRD),属于networking.gke.ioAPI组,这个资源的v1beta1版本在GKE 1.22版本中并没有被移除,你之前修改apiVersion触发的两个报错均为改法错误导致:- 把apiVersion写成
networking.gke.io/v1报错,是因为GKE的FrontendConfig从未发布过v1稳定版,REST mapper找不到对应资源定义 - 把apiVersion写成
networking.k8s.io/v1报错,是因为原生Kubernetes networking API组根本不存在FrontendConfig这个资源类型
- 把apiVersion写成
正确操作步骤
- 第一步:将Terraform中
nginx_frontend_config资源的apiVersion恢复为原有值networking.gke.io/v1beta1,该配置在GKE 1.22及后续多个稳定版本中均合法可用,无需修改。 - 第二步:处理
kubent实际扫描出的废弃资源:elastic命名空间下名为kibana-kibana的Ingress资源,将它的apiVersion从networking.k8s.io/v1beta1替换为networking.k8s.io/v1,同时调整适配v1版本Ingress的字段结构:- v1版本Ingress不再支持直接在backend下写
serviceName、servicePort字段,需要嵌套为service.name和service.port.number/name结构 - 关联FrontendConfig的注解写法不需要调整,仍使用
networking.gke.io/v1beta1.FrontendConfig指定对应配置名称即可 - 旧版本中通过
kubernetes.io/ingress.class注解指定Ingress类的写法,需要替换为spec.ingressClassName字段
- v1版本Ingress不再支持直接在backend下写
- 第三步:配置校验
先执行kubectl apply --dry-run=server测试Ingress、FrontendConfig配置合法性,再执行terraform plan确认无异常资源漂移后再应用变更。
可直接参考的Terraform配置示例
# FrontendConfig保持原有v1beta1配置即可,无需修改apiVersion resource "kubernetes_manifest" "nginx_frontend_config" { manifest = { "apiVersion" = "networking.gke.io/v1beta1" "kind" = "FrontendConfig" "metadata" = { "name" = "nginx-frontend-config" "namespace" = kubernetes_namespace.nginx.metadata[0].name } "spec" = { "redirectToHttps" = { "enabled" = true "responseCodeName" = "FOUND" } "sslPolicy" = google_compute_ssl_policy.default.name } } } # 需要修改apiVersion的是关联的Ingress资源 resource "kubernetes_manifest" "kibana_ingress" { manifest = { "apiVersion" = "networking.k8s.io/v1" "kind" = "Ingress" "metadata" = { "name" = "kibana-kibana" "namespace" = "elastic" "annotations" = { # 关联FrontendConfig的注解不需要调整 "networking.gke.io/v1beta1.FrontendConfig" = "nginx-frontend-config" } } "spec" = { "ingressClassName" = "gce" "tls" = [ { "hosts" = ["kibana.your-domain.com"] "secretName" = "kibana-tls-secret" } ] "rules" = [ { "host" = "kibana.your-domain.com" "http" = { "paths" = [ { "path" = "/*" "pathType" = "ImplementationSpecific" "backend" = { "service" = { "name" = "kibana-kibana" "port" = { "number" = 5601 } } } } ] } } ] } } }
补充说明:GKE的FrontendConfig目前长期处于v1beta1版本是正常状态,该CRD的版本迭代节奏和Kubernetes原生Ingress API的废弃计划完全独立,不需要强行将其apiVersion修改为不存在的v1版本。
内容的提问来源于stack exchange,提问作者Artet_dev
相关产品推荐
相关产品推荐

