【问题标题】:How to config Kubernetes Ingress Nginx anontations whitelist only apply to http如何配置 Kubernetes Ingress Nginx 注释白名单仅适用于 http
【发布时间】:2018-12-17 08:22:36
【问题描述】:

我已经配置了我的入口支持 SSL:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "service"
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "x.x.x.x/xx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  tls:
  - hosts:
    - "example.com"
    secretName: example.name
  rules:
  - host: "example.com"
    http:
      paths:
      - path: /
        backend:
          serviceName: service
          servicePort: 80

在我上面的配置中,只有白名单中的 IP 可以访问 HTTP 和 HTTPS 的域。但是我想配置所有IP地址都可以访问https://example.com(HTTPS),白名单中的一些IP地址可以在没有SSL的情况下访问-http://example.com

【问题讨论】:

    标签: ssl nginx kubernetes kubernetes-ingress kubernetes-security


    【解决方案1】:

    我已通过使用nginx.ingress.kubernetes.io/configuration-snippet 注释向 nginx 位置添加更多配置(同时监听 http 和 https)解决了我的问题。

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: "service"
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        # The configs to allow all IPs access via https and allow some IPs in
        # security whitelist access via http
        nginx.ingress.kubernetes.io/configuration-snippet: |
    
          if ($https) {
            set $allow_ip true;
          }
    
          if ($remote_addr ~ (x.x.x.x|y.y.y.y) {
            set $allow_ip true;
          }
    
          if ($allow_ip != true) {
            return 403;
          }
    spec:
      tls:
      - hosts:
        - "example.com"
        secretName: example.name
      rules:
      - host: "example.com"
        http:
          paths:
          - path: /
            backend:
              serviceName: service
              servicePort: 80
    

    【讨论】:

      【解决方案2】:

      whitelist-source-range 注解将始终影响整个 Ingress 资源。但是,您可能(未经测试!)尝试使用两种单独的 Ingress 资源:一种用于 HTTP 访问(带有源白名单且没有 tls 配置),另一种用于 HTTPS(使用kubernetes.io/ingress.allow-http注解):

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: service-https
        annotations:
          nginx.ingress.kubernetes.io/ssl-redirect: "false"
          kubernetes.io/ingress.allow-http: "false"
      spec:
        tls:
        - hosts:
          - "example.com"
          secretName: example.name
        rules:
        - host: "example.com"
          http:
            paths:
            - path: /
              backend:
                serviceName: service
                servicePort: 80
      ---
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: service-http
        annotations:
          nginx.ingress.kubernetes.io/whitelist-source-range: "x.x.x.x/xx"
      spec:
        rules:
        - host: "example.com"
          http:
            paths:
            - path: /
              backend:
                serviceName: service
                servicePort: 80
      

      【讨论】:

      • 它只是 Nginx 的一个包装器,对吧?不熟悉语法,但这种设置可以在 Nginx 中使用,所以我不明白为什么它在这里不起作用。
      • 表示2个入口合并为一个
      【解决方案3】:

      我认为目前仅使用 nginx-ingress 是不可能的。
      当您为 Ingress 设置 HTTPS 方案时,它开始侦听端口 443 和 continues to listen on port 80

      但是,您可以通过使用本地 Nginx 实例作为外部负载均衡器来做到这一点。
      点击此链接获取详细说明:"Kubernetes TCP load balancer service on premise (non-cloud)"

      作为另一种选择,您可能想尝试Istio Ingress

      【讨论】:

        猜你喜欢
        • 2019-08-01
        • 2021-06-15
        • 2020-04-16
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 2012-06-03
        • 2019-11-13
        • 2019-08-08
        相关资源
        最近更新 更多