Как настроить вход для прямого трафика на бэкэнд https с помощью https

У меня есть бэкэнд с использованием https. Я хочу разделить нагрузку на этот сервер на основе URL/ пути.

Я решил использовать ingress, чтобы сделать эту логику на основе URL/ пути, чтобы переместить трафик на разные бэкэнды (одни и те же бэкэнды, просто дублированные на разные NodePorts)

мой вопрос, как я могу настроить вход для получения запросов https и пересылать эти запросы https на серверную часть https?

Спасибо

редактировать: я добавил файл yaml:

spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

по какой-то причине я не могу изменить форму правила http на https

2 ответа

Если вы хотите использовать механизмы балансировки нагрузки в k8s, вы должны вместо этого использовать сервисы и запускать несколько экземпляров этого сервиса таким образом, чтобы k8s выполнял балансировку нагрузки. Если вы хотите использовать разные версии вашего бэкэнда (например, prod и test), ваш способ их разделения хорош

если ваш сервис доступен только через https, вам нужно добавить следующую аннотацию к своему входному yaml: ( документация)

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

Чтобы обезопасить себя, взгляните на это: https://kubernetes.io/docs/concepts/services-networking/ingress/

Но если вы хотите, чтобы вспомогательные службы расшифровали связь TLS, используйте вместо этого следующую аннотацию: ( документация)

nginx.ingress.kubernetes.io/ssl-passthrough: "true"

Редактировать:

Ingress YAML должен выглядеть следующим образом, если вы хотите получить доступ к бэкэнду через TLS:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

Входной YAML должен выглядеть следующим образом, если вы хотите достичь бэкэнда через TLS с расшифровкой TLS на входном контроллере:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  tls:
  - hosts:
    - app.myorg.com
    secretName: tls-secret 
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

Важно отметить, что tls-secret - это имя SecretConfig с действительным сертификатом, выданным для хоста (app.myorg.com).


Входной YAML должен выглядеть следующим образом, если вы хотите достичь бэкэнда через TLS с расшифровкой TLS в бэкенде:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: namespace-name 
  annotations:
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: service
          servicePort: 9443
        path: /carbon
      - backend:
          serviceName: service2
          servicePort: 9443
        path: /oauth

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

Если вы используете контроллер NGINX Ingress (https://docs.nginx.com/nginx-ingress-controller/), the nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"не работает. Тем не менее nginx.org/ssl-servicesпозволит вам выбрать сервисы, требующие TLS на бэкэнде. Название сбивает с толку, поэтому мне потребовалось время, чтобы понять его истинное предназначение.

Это не работает со стандартным контроллером Kubernetes Ingress, который использует NGINX под капотом; он работает только с контроллером от NGINX.

Документы с расширенными аннотациями: https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/

В этом примере NGINX подключится к ssl-svcс использованием TLS; он игнорирует любые самозаверяющие сертификаты. Пример (https://github.com/nginxinc/kubernetes-ingress/tree/v1.12.0/examples/ssl-services):

      apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    nginx.org/ssl-services: "ssl-svc"
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80
      - path: /ssl
        backend:
          serviceName: ssl-svc
          servicePort: 443
Другие вопросы по тегам