Kuberetes Ingress-白名单特定API



我们有大量的微服务,所有这些都通过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,只访问某个端点。。。

相关内容

  • 没有找到相关文章

最新更新