如何在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
相关产品推荐
相关产品推荐

