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



在使用Kubernetes几个月的时间里,我发现了一个很好的方法,可以使用一个现有的域名,通过子域名公开cluster-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

这样,所有的微服务都可以使用相同的集群负载均衡器(IP),但是不同的子-子域。

我试图做同样的SQL Server,但这是不工作,不知道为什么,但我有一种感觉,原因是SQL Server通信使用TCP而不是HTTP。

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

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

你的理解是好的,默认情况下NGINX入口控制器只支持HTTP和HTTPs流量配置(第7层),所以可能你的SQL服务器不工作,因为这个

您的SQL服务正在使用TCP连接运行,因此它不考虑您正在尝试设置的自定义域,因为它们无论如何都使用相同的IP地址。

你的问题的解决方案不是使用自定义子域(s)这个服务,而是在NGINX入口控制器中设置暴露TCP服务。例如,您可以将此SQL服务设置为在端口1433的入口IP上可用:

入口控制器使用标志--tcp-services-configmap--udp-services-configmap指向一个现有的配置映射,其中密钥是要使用的外部端口,值表示使用格式公开的服务:<namespace/service name>:<service port>:[PROXY]:[PROXY]

要设置它,你可以按照官方NGINX入口文档中提供的步骤,但是在StackOverflow上也有一些更详细的说明,例如这个。

最新更新