Kubernetes Ingress路径的IP白名单

12

我知道可以为整个入口对象设置IP白名单,但是否有一种方法可以为单个路径设置IP白名单呢?例如,如果我只想允许从10.0.0.0/16访问/admin,该怎么做?

ingress.yml

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  namespace: default
  labels:
    app: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    #nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"
spec:
  tls:
    - hosts:
        - frontend.example.com
      secretName: frontend-tls
  rules:
    - host: frontend.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: frontend
              servicePort: 80
          - path: /api
            backend:
              serviceName: api
              servicePort: 8000
          - path: /admin
            backend:
              serviceName: api
              servicePort: 8000
          - path: /staticfiles
            backend:
              serviceName: api
              servicePort: 80
3个回答

8
如果您想将其分为两个Ingress,则应像下面的示例一样进行设置。首先使用带有/admin路径和注释的Ingress,然后是允许任何IP的其他paths的第二个Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend-admin
  namespace: default
  labels:
    app: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"
spec:
  tls:
    - hosts:
        - frontend.example.com
      secretName: frontend-tls
  rules:
    - host: frontend.example.com
      http:
        paths:
          - path: /admin
            backend:
              serviceName: api
              servicePort: 8000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend-all
  namespace: default
  labels:
    app: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
    - hosts:
        - frontend.example.com
      secretName: frontend-tls
  rules:
    - host: frontend.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: frontend
              servicePort: 80
          - path: /api
            backend:
              serviceName: api
              servicePort: 8000
          - path: /staticfiles
            backend:
              serviceName: api
              servicePort: 80

请记住,注释 nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16" 将覆盖部分配置。如在Nginx文档中所述:

添加Ingress规则的注释会覆盖任何全局限制。

另一个选项是使用ConfigMap whitelist-source-range。如此示例中所述,您可以使用ngx_http_access_module
与Nginx配置一样,每个path都被保存为
location / {
  ...
}

location /api {
  ...
}

您可以在此处添加这些限制。以下是示例:

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

2
你可以尝试将ingress拆分成多个部分。我创建了两个ingress,每个都有不同的路径,你可以更改白名单IP。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  namespace: default
  labels:
    app: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    #nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"
spec:
  tls:
    - hosts:
        - frontend.example.com
      secretName: frontend-tls
  rules:
    - host: frontend.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: frontend
              servicePort: 80

2 :

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  namespace: default
  labels:
    app: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    #nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"
spec:
  tls:
    - hosts:
        - frontend.example.com
      secretName: frontend-tls
  rules:
    - host: frontend.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: frontend-two
              servicePort: 80

0

你解决了这个问题吗?我无法理解如何使用上一个答案中提到的选项。

另一个选项是使用ConfigMap whitelist-source-range。就像在这个例子中提到的那样,你可以使用ngx_http_access_module。

你能提供一个例子吗?

将其分成几个入口对于某些情况非常不方便 =(


我刚刚找到了另一个解决方案(但我认为之前的答案更好看): 您可以使用注释nginx.ingress.kubernetes.io/server-snippet,并像直接在nginx.conf中编写一样。

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#server-snippet

https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/


我发现最好的选择就是有两个不同的入口清单,虽然在我用两个入口清单成功后,我没时间去做更多的研究。 - cclloyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接