我们有大量的微服务,所有这些都通过Kubernetes中的单个api网关服务提供服务,并有一个入口转发到如下所示的服务->
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: beta-https
namespace: beta
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
tls:
- hosts:
- beta.xyz.com
secretName: beta-secret
rules:
- host: beta.xyz.com
http:
paths:
- path: /api/(.*)
backend:
serviceName: api-svc
servicePort: 8443
现在我们有了一个新的要求,其中apis-/api/secure的一个子集必须受到IP限制。关于如何实现这一点,有什么想法吗?
我假设我可以在一个新的配置中使用nginx.ingress.kubernetes.io/whitelist-source-range
来将流量转发到/api/secure,但我如何确保上面的配置不会服务器/api/security?
所以对于想做类似事情的人来说,我可以通过使用nginx.ingress.kubernetes.io/server-snippet
添加一个片段并阻止流量来实现这一点
location ~ "^/api/secure/(.*)" {
deny all;
return 403;
}
据我所见,您正试图创建两个单独的路径,其中/api/secure
只能用于特定的ip地址。
我已经复制了你的问题,做了一些测试并找到了解决方案。
当创建两个类似于您的入口对象时,它们在path
字段上不同,例如。一个具有path: /api/(.*)
,第二个具有path: /api/secure
nginx将生成以下配置(输出缩短(:
服务器{服务器名称beta.xyz.com;
listen 80 ;
listen 443 ssl http2 ;
...
location ~* "^/api/secure" {
...
}
location ~* "^/api/(.*)" {
...
}
在nginx文档中,您可以阅读:
为了找到与给定请求匹配的位置,nginx首先检查位置使用前缀字符串(前缀位置(定义。其中
location with the longest matching prefix is selected and remembered
。然后正则表达式按照它们在配置文件中的出现顺序进行检查。搜索正则表达式在第一次匹配时终止,并使用相应的配置。
意思是:NGINX总是使用最特定的匹配来满足请求
根据这些信息,创建两个独立的入口,就像你提到的,应该解决您的问题,因为/api/secure
总是比/api/(.*)
更具体的路径。
如果有帮助,请告诉我。
在我的情况下,我有一个多子域主机平台,我正在尝试等配置
nginx.ingress.kubernetes.io/server-snippet: |
location ~* "^/api/architect/(.*)" {
allow all;
}
location ~* "^/(.*)" {
deny all;
allow 149.74.110.92;
allow 85.138.230.206;
}
但到目前为止似乎不起作用。我想屏蔽主url,只访问某个端点。。。