Kubernetes -基于名称的tcp路由

olhwl3o2  于 2023-03-29  发布在  Kubernetes
关注(0)|答案(1)|浏览(116)

我想在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?

7xllpg7q

7xllpg7q1#

这是完全不可能的,HTTP(s)这样做的方式利用基于HOST报头和/或SNI的L7支持。TCP不能够理解您正在使用的名称,导致解析发生在客户端,并且TCP连接使用所得到的IP建立,而不跟踪用于解析到该IP的域名。
如果你必须这么做,解决这个问题的一种方法是使用DB代理服务来创建一个有点像DB“入口控制器”的东西,它可以基于用户名进行路由。即,user1@server1代理到server 1,而user1@server2代理到server 2。您可以看到这利用了用户名的L7特性,并提供了路由指示符。如果这是甚至可用于您的特定数据库是一个不同的问题。

相关问题