Как настроить белый список анонтаций Kubernetes Ingress Nginx только для http

Я настроил мой входной 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 ответа

Решение

Я решил мою проблему, добавив больше настроек в расположение nginx (прослушив http и https), используя nginx.ingress.kubernetes.io/configuration-snippet аннотаций.

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

Я считаю, что на данный момент это невозможно, используя только nginx-ingress.
При настройке схемы HTTPS для Ingress он начинает прослушивать порт 443 и продолжает прослушивать порт 80.

Однако вы можете сделать это, используя локальный экземпляр Nginx в качестве внешнего балансировщика нагрузки.
Перейдите по этой ссылке для получения подробных инструкций: "Служба балансировки нагрузки Kubernetes TCP в помещении (не в облаке)"

Как еще один вариант, вы можете попробовать Istio Ingress

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
Другие вопросы по тегам