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

В этой конфигурации:

  1. microname1.subdomain.domain.com указывает на Apache Kylin
  2. 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, например, этот.

Другие вопросы по тегам