Kubernetes Host и Service Ingress Mapping с использованием TCP
Работая с Kubernetes в течение нескольких месяцев, я нашел хороший способ использовать одно существующее доменное имя и выставить IP-адрес кластера через субдомен, а также большинство микросервисов через разные суб-субдомены с помощью контроллера входящего трафика.
Мой пример кода входа:
kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
name: cluster-ingress-basic
namespace: ingress-basic
selfLink: >-
/apis/networking.k8s.io/v1beta1/namespaces/ingress-basic/ingresses/cluster-ingress-basic
uid: 5d14e959-db5f-413f-8263-858bacc62fa6
resourceVersion: '42220492'
generation: 29
creationTimestamp: '2021-06-23T12:00:16Z'
annotations:
kubernetes.io/ingress.class: nginx
managedFields:
- manager: Mozilla
operation: Update
apiVersion: networking.k8s.io/v1beta1
time: '2021-06-23T12:00:16Z'
fieldsType: FieldsV1
fieldsV1:
'f:metadata':
'f:annotations':
.: {}
'f:kubernetes.io/ingress.class': {}
'f:spec':
'f:rules': {}
- manager: nginx-ingress-controller
operation: Update
apiVersion: networking.k8s.io/v1beta1
time: '2021-06-23T12:00:45Z'
fieldsType: FieldsV1
fieldsV1:
'f:status':
'f:loadBalancer':
'f:ingress': {}
spec:
rules:
- host: microname1.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: kylin-job-svc
servicePort: 7070
- host: microname2.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: superset
servicePort: 80
- {}
status:
loadBalancer:
ingress:
- ip: xx.xx.xx.xx
В этой конфигурации:
- microname1.subdomain.domain.com указывает на Apache Kylin
- microname2.subdomain.domain.com указывает на Apache Superset
Таким образом, все микросервисы могут быть представлены с использованием одного и того же Cluster-Load-Balancer(IP), но разных суб-субдоменов.
Я попытался сделать то же самое для SQL Server, но это не работает, не знаю почему, но у меня такое чувство, что причина в том, что SQL Server общается с использованием TCP, а не HTTP.
- host: microname3.subdomain.domain.com
http:
paths:
- pathType: ImplementationSpecific
backend:
serviceName: mssql-linux
servicePort: 1433
Есть идеи, как я могу сделать то же самое для служб TCP?
1 ответ
Вы хорошо понимаете, по умолчанию NGINX Ingress Controller поддерживает только конфигурацию трафика HTTP и HTTP (уровень 7), поэтому, вероятно, ваш SQL-сервер не работает из-за этого.
Ваша служба SQL работает с использованием TCP-соединений, поэтому она не принимает во внимание настраиваемые домены, которые вы пытаетесь настроить, поскольку они все равно используют один и тот же IP-адрес.
Решение вашей проблемы заключается не в использовании настраиваемых поддоменов для этой службы, а в настройке . Например, вы можете настроить эту службу SQL так, чтобы она была доступна на входящем IP-адресе через порт 1433:
Контроллер Ingress использует флаги
--tcp-services-configmap
а также--udp-services-configmap
чтобы указать на существующую карту конфигурации, где ключ - это внешний порт для использования, а значение указывает службу, которую нужно предоставить, в формате:<namespace/service name>:<service port>:[PROXY]:[PROXY]
Чтобы настроить его, вы можете выполнить шаги, указанные в раскрытия службы TCP в контроллере входящего трафика NGINXофициальной документации NGINX Ingress, но есть также более подробные инструкции по StackOverflow, например, этот.