我想在kubernetes内部创建几个数据库,并通过入口将它们暴露出来,类似于标准http应用程序中基于名称的虚拟主机解决方案(https://kubernetes.io/docs/concepts/services-networking/ingress/#name-based-virtual-hosting)。
问题是,数据库使用TCP协议。
如果我尝试在入口控制器(https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/exposing-tcp-udp-services.md)中设置TCP负载平衡,它可以工作,但一个端口只能用于一个数据库。
kubectl get cm -n ingress-nginx ingress-nginx-tcp -oyaml
apiVersion: v1
data:
"1521": oracle/oracle-19c-ee-svc:1521
kind: ConfigMap
metadata:
annotations:
meta.helm.sh/release-name: ingress-nginx
meta.helm.sh/release-namespace: ingress-nginx
creationTimestamp: "2023-03-27T11:52:08Z"
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.7.0
helm.sh/chart: ingress-nginx-4.6.0
name: ingress-nginx-tcp
namespace: ingress-nginx
resourceVersion: "3997675"
uid: 7c477751-1ee1-462a-a4d6-ad78b003abf7
我想实现基于名称的TCP路由,类似于我发布的第一个链接。
例如:
db1.example.com:1521 -> goes to service db1
db2.example.com:1521 -> goes to service db2
(其中example.com解析为负载均衡器IP,服务db 1和db2是kubernetes中连接到两个不同数据库的服务)
你有什么建议吗?即使它只能用不同类型的入口控制器解决?或者网关API?
1条答案
按热度按时间7xllpg7q1#
这是完全不可能的,HTTP(s)这样做的方式利用基于HOST报头和/或SNI的L7支持。TCP不能够理解您正在使用的名称,导致解析发生在客户端,并且TCP连接使用所得到的IP建立,而不跟踪用于解析到该IP的域名。
如果你必须这么做,解决这个问题的一种方法是使用DB代理服务来创建一个有点像DB“入口控制器”的东西,它可以基于用户名进行路由。即,
user1@server1
代理到server 1,而user1@server2
代理到server 2。您可以看到这利用了用户名的L7特性,并提供了路由指示符。如果这是甚至可用于您的特定数据库是一个不同的问题。