You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform配置Kubernetes Ingress v1空后端规则问题及方案咨询

解决Kubernetes 1.22+中Ingress v1无法配置空后端以生成通配符TLS证书的问题

方案一:直接用cert-manager的Certificate资源生成证书(推荐)

你的核心需求是获取通配符TLS证书,完全不需要依赖Ingress资源。cert-manager支持直接通过Certificate资源向ClusterIssuer申请证书,绕开Ingress对后端的强制要求,后续微服务的Ingress可直接引用生成的证书Secret。

Terraform配置示例:

resource "kubernetes_certificate_v1" "wildcard_cert" {
  metadata {
    name      = "wildcard-example-com"
    namespace = "default" # 证书Secret会生成在此命名空间
  }

  spec {
    secret_name = "wildcard-example-com-tls" # 存储证书的Secret名称
    issuer_ref {
      kind = "ClusterIssuer"
      name = "<你的cert-manager ClusterIssuer名称>"
    }

    dns_names = [
      "*.example.com",
      "*.api.example.com"
    ]

    # 可选配置:证书有效期与自动续期
    duration = "2160h"    # 90天
    renew_before = "360h" # 提前15天触发续期
  }
}

方案二:为Ingress配置占位符后端(适用于必须保留Ingress的场景)

Kubernetes Ingress v1强制要求每个路径必须指定有效后端,无法留空。可以配置一个临时占位符服务作为后端,后续微服务的Ingress规则会覆盖该路径的路由逻辑。

步骤1:创建占位符服务与Deployment

先部署一个返回404的极简服务,作为临时后端:

# 占位符Deployment
resource "kubernetes_deployment_v1" "placeholder_backend" {
  metadata {
    name      = "placeholder-backend"
    namespace = "default"
  }

  spec {
    replicas = 1
    selector {
      match_labels = {
        app = "placeholder-backend"
      }
    }

    template {
      metadata {
        labels = {
          app = "placeholder-backend"
        }
      }

      spec {
        container {
          image = "nginx:alpine"
          name  = "nginx"
          port {
            container_port = 80
          }
          # 自定义nginx配置,访问时返回404
          command = ["/bin/sh", "-c"]
          args = [
            "echo 'server { listen 80; return 404; }' > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
          ]
        }
      }
    }
  }
}

# 占位符Service
resource "kubernetes_service_v1" "placeholder_backend" {
  metadata {
    name      = "placeholder-backend"
    namespace = "default"
  }

  spec {
    selector = {
      app = "placeholder-backend"
    }
    port {
      port        = 80
      target_port = 80
    }
    type = "ClusterIP"
  }
}

步骤2:修改Ingress配置引用占位符后端

将原空后端替换为上述占位符服务,同时补充Ingress v1要求的path_type字段:

resource "kubernetes_ingress_v1" "my-ingress-resource" {
  annotations = {
    "kubernetes.io/ingress.class" = "nginx"
    "cert-manager.io/cluster-issuer" = "<你的cert-manager ClusterIssuer名称>"
    # 注意:Kubernetes 1.22+中,kubernetes.io/tls-acme注解已被cert-manager弃用,无需配置
  }
  spec {
    tls {
      hosts = ["*.example.com", "*.api.example.com"]
      secret_name = "<证书存储的Secret名称>"
    }
    rule {
      host = "*.example.com"
      http {
        path {
          path      = "/"
          path_type = "Prefix" # Ingress v1强制要求指定路径类型

          backend {
            service {
              name = kubernetes_service_v1.placeholder_backend.metadata[0].name
              port {
                number = 80
              }
            }
          }
        }
      }
    }

    rule {
      host = "*.api.example.com"
      http {
        path {
          path      = "/"
          path_type = "Prefix"

          backend {
            service {
              name = kubernetes_service_v1.placeholder_backend.metadata[0].name
              port {
                number = 80
              }
            }
          }
        }
      }
    }
  }
}

后续微服务模块创建的Ingress规则,只要路径更具体(如/api/)或优先级更高,就会自动覆盖占位符的路由。

内容的提问来源于stack exchange,提问作者Shawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:21:06