1

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

4

3 回答 3

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
于 2018-07-11T04:04:57.270 回答
0

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

但是,您可以通过使用本地 Nginx 实例作为外部负载均衡器来做到这一点。
请点击此链接获取详细说明:“本地 Kubernetes TCP 负载均衡器服务(非云)”

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

于 2018-07-10T13:45:38.287 回答
0

注释将whitelist-source-range始终影响整个 Ingress 资源。但是,您可能(未经测试!)尝试使用两种单独的 Ingress 资源:一种用于 HTTP 访问(具有源白名单且没有tls配置),另一种用于 HTTPS(使用kubernetes.io/ingress.allow-http注释禁用纯 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
于 2018-07-09T17:21:54.267 回答