如何配置Kubernetes Ingress Nginx注释白名单仅适用于http

时间:2018-07-09 15:30:54

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

我已经配置了我的入口支持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访问。

3 个答案:

答案 0 :(得分:1)

我已经解决了问题,方法是使用dict[ID]批注将更多配置添加到nginx位置(同时监听http和https)。

nginx.ingress.kubernetes.io/configuration-snippet

答案 1 :(得分:0)

whitelist-source-range注释将始终影响整个Ingress资源。但是,您可能(未测试!)请尝试使用两个单独的Ingress资源:一个用于HTTP访问(具有源白名单且没有tls配置)和一个用于HTTPS(已禁用纯HTTP)使用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

答案 2 :(得分:0)

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

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

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