Kuberenetes Ingress-将特定API列入白名单

时间:2019-10-23 08:42:15

标签: kubernetes-ingress whitelist

在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?

3 个答案:

答案 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 并且只访问某个端点...