使用 TCP 的 Kubernetes 主机和服务入口映射

Kubernetes Host and Service Ingress Mapping using 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 服务器执行相同的操作,但这不起作用,不知道为什么,但我觉得原因是 SQL 服务器使用 TCP 进行通信,而不是HTTP.

- host: microname3.subdomain.domain.com
  http:
    paths:
      - pathType: ImplementationSpecific
        backend:
          serviceName: mssql-linux
          servicePort: 1433

关于如何为 TCP 服务做同样的事情有什么想法吗?

您的理解很好,默认情况下 NGINX Ingress Controller 仅支持 HTTP 和 HTTPs 流量配置(第 7 层),因此您的 SQL 服务器可能因此无法正常工作。

您的 SQL 服务正在使用 TCP 连接运行,因此它是

您的问题的解决方案不是为此服务使用自定义子域,而是设置 exposing TCP service in NGINX Ingress Controller。例如,您可以将此 SQL 服务设置为在端口 1433 上的入口 IP 上可用:

Ingress controller uses the flags --tcp-services-configmap and --udp-services-configmap to point to an existing config map where the key is the external port to use and the value indicates the service to expose using the format: <namespace/service name>:<service port>:[PROXY]:[PROXY]

要设置它,您可以按照 official NGINX Ingress documentation but there are also some more detailed instructions on Whosebug, for example 中提供的步骤进行操作。