Как настроить вход для прямого трафика на бэкэнд 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