【问题标题】:Kubernetes Ingress Whitelist IP for path路径的 Kubernetes 入口白名单 IP
【发布时间】:2020-03-14 11:44:18
【问题描述】:

我知道我可以将整个入口对象的 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

【问题讨论】:

    标签: nginx kubernetes kubernetes-ingress


    【解决方案1】:

    如果您想将其拆分为两个 Ingre,则如下面的示例所示。第一个Ingress 带有/admin 路径和注释,第二个Ingress 带有其他paths,任何IP 都允许。

    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 docs中提到的:

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


    另一种选择是使用ConfigMapwhitelist-source-range。就像this example中提到的,你可以使用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】:

      您可以尝试将入口分成几部分。我创建了两个都有差异的入口。路径,您可以更改白名单 IP

      1:

      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
      

      【讨论】:

        【解决方案3】:

        您解决了问题吗?从上一个答案中我无法弄清楚如何使用此选项

        另一个选项是使用 ConfigMap whitelist-source-range。喜欢 在这个例子中提到,你可以使用 ngx_http_access_module

        你能举个例子吗?

        分成几个入口——在某些情况下非常不适合=(


        我刚刚找到了另一个解决方案(但我认为先前答案的解决方案更漂亮): 您可以使用注解 nginx.ingress.kubernetes.io/server-sn-p 并直接在 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/

        【讨论】:

        • 我发现最好的选择就是拥有 2 个不同的入口清单,尽管我在使用 2 个入口后没有时间做太多研究。
        猜你喜欢
        • 2020-06-23
        • 2021-05-23
        • 2023-03-23
        • 2019-10-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多