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

同一域名下,K8s Ingress能否将HTTP与HTTPS流量分别导向不同端口?

实现同一域名下HTTP/HTTPS流量导向不同后端端口

这个需求其实是可以实现的,虽然Ingress核心规范本身没有直接提供这种“按协议分端口”的配置选项,但借助nginx-ingress-controller的特性,我们有两种常用的方案来达成目标:

方案一:创建两个独立的Ingress资源

这是最直观、易维护的方式——分别为HTTP和HTTPS流量创建两个Ingress对象,它们指向同一个域名,但关联到后端Service的不同端口。

HTTP流量的Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-http-ingress
spec:
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-backend-service
            port:
              number: 8080  # HTTP流量将转发到这个端口

HTTPS流量的Ingress配置

这个Ingress需要配置TLS证书,同时指向后端的另一个端口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-https-ingress
spec:
  tls:
  - hosts:
    - your-domain.com
    secretName: your-tls-secret  # 提前创建好的TLS证书Secret
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-backend-service
            port:
              number: 8443  # HTTPS流量将转发到这个端口

nginx-ingress-controller会自动识别这两个Ingress:监听80端口处理HTTP请求,监听443端口处理HTTPS请求,各自转发到对应的后端端口。

方案二:使用nginx-ingress注解嵌入自定义配置

如果你希望把所有配置集中在一个Ingress对象里,可以通过nginx.ingress.kubernetes.io/server-snippet注解添加Nginx原生配置,根据请求协议动态切换目标端口。

组合式Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-combined-ingress
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      # 根据请求协议设置目标端口
      set $target_port 8080;
      if ($scheme = https) {
        set $target_port 8443;
      }
      # 覆盖默认的proxy_pass规则
      proxy_pass http://your-backend-service:$target_port;
spec:
  tls:
  - hosts:
    - your-domain.com
    secretName: your-tls-secret
  rules:
  - host: your-domain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-backend-service
            port:
              number: 8080  # 这里的端口会被snippet中的配置覆盖,仅作为占位

注意:Nginx的if指令有一些行为限制,但在这个简单的场景下(仅根据$scheme判断)是安全可靠的。如果你的需求更复杂,可能需要结合map指令来优化。

方案选择建议

  • 优先选择方案一:配置清晰,易于排查问题,符合Kubernetes声明式API的设计理念。
  • 方案二适合需要精简Ingress资源数量的场景,但要求你对Nginx配置有一定了解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:01:20