在Kubernetes中,我们有许多微服务都通过单个api-gateway服务提供,并且有入口可以转发到如下所示的服务->
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
现在,我们有了新的要求,其中api的子集-/ api / secure必须受到IP限制。关于如何实现这一目标的任何想法?
我假设我可以在新的配置中使用nginx.ingress.kubernetes.io/whitelist-source-range
来转发到/ api / secure的流量,但是如何确保上述配置不支持/ api / secure?
答案 0 :(得分:0)
因此对于希望进行类似操作的人,我可以使用const sum = function(a, b) {
return a+b
}
const sumOfThreeAndFive = sum.bind(this, 3, 5)
console.log(sumOfThreeAndFive()) // 3 + 5 -> 8
添加代码段并阻止访问量来实现此目的
nginx.ingress.kubernetes.io/server-snippet
答案 1 :(得分:0)
据我所见,您正在尝试创建两个单独的路径,其中/api/secure
仅适用于特定的IP地址。
我已经复制了您的问题,进行了一些测试并找到了解决方案。
在创建两个像您这样的入口对象时,它们在path
字段中有所不同,例如
一个拥有path: /api/(.*)
,另一个拥有path: /api/secure
nginx将生成以下配置(输出缩短):
服务器{ server_name beta.xyz.com;
listen 80 ;
listen 443 ssl http2 ;
...
location ~* "^/api/secure" {
...
}
location ~* "^/api/(.*)" {
...
}
,在nginx documentation中,您可以阅读:
要查找与给定请求匹配的位置,nginx首先检查位置 使用前缀字符串(前缀位置)定义。其中
location with the longest matching prefix is selected and remembered
。然后是正则表达式 按照在配置文件中出现的顺序进行检查。搜索 正则表达式在第一个匹配项处终止,并使用相应的配置。
含义:NGINX始终使用最具体的匹配来满足请求
根据此信息,创建两个单独的入口,就像您提到的那样,
应该可以解决您的问题,因为/api/secure
总是比/api/(.*)
更具体的路径。
让我知道是否有帮助。
答案 2 :(得分:0)
就我而言,我有一个多子域主机平台,我正在尝试诸如
之类的配置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 并且只访问某个端点...