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

如何通过单个Ingress自动访问Kubernetes StatefulSet的所有Pod?

当然可以用单个Ingress资源搞定这个需求!结合Kubernetes的Ingress路由规则和StatefulSet的Pod DNS特性,不管是你提到的子域名(https://pod-0.my-ingress.domain)还是路径前缀(https://my-ingress.domain/pod-0)的访问方式,都能轻松实现。下面给你两种具体的配置方案,都是基于NGINX Ingress Controller(最常用的Ingress控制器)来写的:

方案一:子域名方式访问

这种方式需要先在你的域名服务商那边配置*.my-ingress.domain的泛域名解析,指向Ingress Controller的外部IP。

第一步:创建Headless Service

StatefulSet的Pod自带有序的DNS名称,但需要通过Headless Service来暴露这个DNS能力——它不会分配ClusterIP,而是直接为每个Pod生成可访问的DNS记录:

apiVersion: v1
kind: Service
metadata:
  name: spark-workers-headless
spec:
  clusterIP: None # 标记为Headless Service
  selector:
    app: spark-worker # 替换成你的StatefulSet Pod的标签
  ports:
    - name: http-log
      port: 8080 # 替换成Worker日志的HTTP端口
      targetPort: 8080

第二步:配置单个Ingress资源

利用NGINX的正则匹配子域名,提取Pod名称后直接转发到对应的Pod:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spark-worker-logs-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    # 用正则匹配子域名,提取Pod名称并转发到对应的DNS记录
    nginx.ingress.kubernetes.io/server-snippet: |
      server_name ~^(?<pod_name>.+)\.my-ingress\.domain$;
      location / {
        proxy_pass http://$pod_name.spark-workers-headless.your-namespace.svc.cluster.local:8080;
        proxy_set_header Host $host;
      }
spec:
  tls:
    - hosts:
        - "*.my-ingress.domain"
      secretName: your-tls-secret # 替换成你的TLS证书Secret
  rules:
    - host: "*.my-ingress.domain"
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: spark-workers-headless # 这里只要填一个存在的Service即可,实际路由靠上面的server-snippet
                port:
                  number: 8080

方案二:路径前缀方式访问

如果不想配置泛域名,用路径区分Pod也是个好选择:

第一步:同样需要先创建上面的Headless Service

和方案一的Headless Service配置完全一样,就不重复贴了。

第二步:配置单个Ingress资源

通过正则路径匹配提取Pod名称,并重写路径后转发:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spark-worker-logs-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    # 重写路径,把/pod-0/xxx转换成/xxx转发给Pod
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  tls:
    - hosts:
        - "my-ingress.domain"
      secretName: your-tls-secret
  rules:
    - host: "my-ingress.domain"
      http:
        paths:
          - path: /(?<pod_name>[a-z0-9-]+)(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: spark-workers-headless
                port:
                  number: 8080

一些注意事项

  • 如果你用的是其他Ingress控制器(比如Traefik),注解和正则配置会略有不同,需要对应调整。
  • 确保Headless Service的selector和StatefulSet Pod的标签完全匹配,否则DNS解析会失败。
  • TLS证书要对应:子域名方案需要包含泛域名证书,路径方案用主域名证书即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:07:29