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

如何在Kubernetes Ingress资源中配置规则,仅允许特定来源请求路由到指定服务

Kubernetes Ingress 来源访问控制配置

我正在学习Ingress控制器与Ingress资源,用于将外部请求路由至Kubernetes集群内的特定服务。现有Ingress资源示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myservicea
spec:
  rules:
  - host: myservicea.foo.org
    http:
      paths:
      - path: /v1/myapp/health
        pathType: Prefix
        backend:
          service:
            name: myservice
            port:
              number: 80
  ingressClassName: nginx

我对该示例的理解是:所有发往https://myservicea.foo.org/v1/myapp/health的请求都会被Ingress控制器转发至名为myservice的服务的80端口,无论请求来自哪个客户端域名、主机、IP或本地主机。

我的问题是:如何在Ingress资源中添加规则,指定仅来自特定域名(应用、客户端、主机或IP)的请求,才会根据路径路由到指定服务“myservice”,其他来源的请求直接被丢弃?


解决方案(基于Nginx Ingress控制器)

由于你使用的是nginx类型的Ingress控制器,可通过添加专属注解(Annotations)实现来源限制,以下分场景说明:

1. 限制特定客户端IP/IP段

使用nginx.ingress.kubernetes.io/whitelist-source-range注解,指定允许访问的IP或IP段,非指定来源的请求会直接返回403:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myservicea
  annotations:
    # 允许单个IP或IP段,多个用逗号分隔
    nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.5"
spec:
  rules:
  - host: myservicea.foo.org
    http:
      paths:
      - path: /v1/myapp/health
        pathType: Prefix
        backend:
          service:
            name: myservice
            port:
              number: 80
  ingressClassName: nginx

2. 限制客户端请求的Referer域名(来源应用/网站)

如果需要限制请求来自特定域名(比如仅允许从client.example.com跳转过来的请求),可通过nginx.ingress.kubernetes.io/server-snippet注解添加Nginx原生规则,检查请求的Referer头:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myservicea
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      # 仅允许Referer头包含client.example.com的请求,否则返回403
      if ($http_referer !~* ^https?://client.example.com/) {
        return 403;
      }
spec:
  rules:
  - host: myservicea.foo.org
    http:
      paths:
      - path: /v1/myapp/health
        pathType: Prefix
        backend:
          service:
            name: myservice
            port:
              number: 80
  ingressClassName: nginx

3. 限制客户端请求的Host头(客户端主机域名)

如果需要限制请求的Host头为特定值(比如仅接受来自client.example.com的Host请求),可直接在Ingress的rules里指定对应host,或者配置默认规则拦截非指定请求:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-myservicea
spec:
  rules:
  # 仅处理Host为client.example.com且路径匹配的请求
  - host: client.example.com
    http:
      paths:
      - path: /v1/myapp/health
        pathType: Prefix
        backend:
          service:
            name: myservice
            port:
              number: 80
  # 非指定Host的请求返回403(需提前创建一个返回403的默认服务)
  - host: myservicea.foo.org
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: default-deny-service
            port:
              number: 80
  ingressClassName: nginx

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:20:51