Как добавить в белый список только один путь в контроллере входящего трафика kubernetes nginx

Используя Nginx Ingress Controller, мы хотели бы предоставить разные пути к сервису Kubernetes с разными требованиями безопасности.

  1. / открыт для публики

  2. /white-list разрешает соединения только с определенного IP-адреса

  3. /need-key требуется ключ API

Я работаю в AWS EKS. Версия Kubernetes выглядит следующим образом: v1.12.6-eks-d69f1b.

Если мы используем аннотации, они применяются ко всему сервису. В идеале я хотел бы применить аннотацию только к пути.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myServiceA
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myServiceA.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myServiceA
          servicePort: 80
      - path: /white-list
        backend:
          serviceName: myServiceA
          servicePort: 80
          **NEED SOMETHING HERE TO WHITELIST**
      - path: /need-key
        backend:
          serviceName: myServiceA
          servicePort: 80
          **NEED SOMETHING HERE TO USE API-KEY**

Результаты, которые я получил, в конечном итоге применимы ко всем путям. Я могу жить без API-ключа, так как могу это закодировать, но в идеале я бы предпочел, чтобы он управлялся вне контейнера.

Кто-нибудь делал это с контроллером NGINX Ingress?


person Rolando Cintron    schedule 04.06.2019    source источник


Ответы (1)


Чтобы применить аннотацию для каждого пути, вы можете написать одно ingress правило для каждого пути, который хотите применить. Nginx Ingress Controller сам соберет эти ingress правила и применит их соответствующим образом.

Например:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myServiceA-root
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myServiceA.foo.org
    http:
      paths:
      - path: /
        backend:
          serviceName: myServiceA
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myServiceA-white-list
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/whitelist-source-range: X.X.X.X/32
spec:
  rules:
  - host: myServiceA.foo.org
    http:
      paths:
      - path: /white-list
        backend:
          serviceName: myServiceA
          servicePort: 80
...
person Fei    schedule 05.06.2019