是否可以在 kubernetes 中为 MySQL 提供基于主机名的路由?



我有一个场景,我在单个 kubernetes 集群中的不同命名空间中运行多个 mysql 服务器。所有mysql服务器都属于不同的部门。

我的要求是我应该能够使用主机名连接到不同的 mysql 服务器,即

在 ServerA 命名空间中运行的 mysqlServerA 应该可以使用以下内容从群集外部访问:

mysql -h mysqlServerA.mydomain.com -A

在ServerB命名空间中运行的mysqlServerB应该可以使用以下内容从集群外部访问:

mysql -h mysqlServerB.mydomain.com -A

等等。

我已经尝试使用Nginx Ingress控制器的配置映射进行基于TCP的路由,其中我通过分配不同的端口号将流量从客户端路由到不同的mysql服务器:

对于 mysqlServerA:

mysql -h mysqlServer.mydomain.com -A -P 3301

对于 mysqlServerB:

mysql -h mysqlServer.mydomain.com -A -P 3302

这非常有效。但是我想知道基于主机名的路由是否可行,因为我不希望每个mysql服务都有单独的负载均衡器。

谢谢

一般信息

I 通过不同的端口号路由流量

你是对的,原因是与Mysql的连接是通过TCP完成的。这就是为什么绝对不可能同时连接到同一台IP:port上的两台服务器的原因。

与HTTP不同,TCP没有允许区分流量应路由到的主机的标头。但是,仍然至少有两种方法可以实现您想要实现的功能:)我稍后会描述这一点。

我想知道基于主机名的路由是否可行 我不希望每个 mysql 服务都有单独的负载均衡器。

K8s 允许在集群外部访问服务的一些方法(即hostNetworkhostPortNodePortLoadBalancerIngress(

LoadBalancer是在LoadBalancerIP:port上提供流量的最简单方法;但是,由于TCP的连接性质,您必须为每个mysql实例使用一个LoadBalancer

kind: Service 
apiVersion: v1 
metadata: 
name: mysql 
spec: 
type: LoadBalancer 
ports: 
- port: 3306 
selector: 
name: my-mysql

NodePort看起来不错,但它只允许您在知道端口时进行连接(这对客户端来说可能是繁琐的工作(

建议的解决方案

  • 外部 IP

如果有路由到一个或多个群集节点的外部 IP,则可以在这些externalIPs上公开 Kubernetes 服务。在服务端口上使用外部 IP(作为目标 IP(进入群集的流量将路由到其中一个服务终结点。externalIPs不由 Kubernetes 管理,由集群管理员负责。

在服务规范中,可以指定externalIPs与任何ServiceTypes一起指定。在下面的示例中,mysql-1可以由客户端在1.2.3.4:3306(externalIP:port(上访问,mysql-2可以被客户端在4.3.2.1:3306上访问

$ cat stereo-mysql-3306.yaml 
apiVersion: v1
kind: Service
metadata:
name: mysql-1234-inst-1
spec:
selector:
app: mysql-prod
ports:
- name: mysql
protocol: TCP
port: 3306
targetPort: 3306
externalIPs:
- 1.2.3.4 
---
apiVersion: v1
kind: Service
metadata:
name: mysql-4321-inst-1
spec:
selector:
app: mysql-repl
ports:
- name: mysql
protocol: TCP
port: 3306
targetPort: 3306
externalIPs:
- 4.3.2.1

注意:您需要将1.2.3.44.3.2.1分配给您的节点(并在mydomain.com时解析mysqlServerA/mysqlserverB到这些 IP(。我已经在我的 GKE 集群上测试了该解决方案,它可以:)工作。

使用该配置,所有解析为1.2.3.4mysqlServerA.mydomain.com:3306请求都将路由到Endpoints,以便使用app: mysql-prod选择器进行服务mysql-1234-inst-1,并且mysqlServerA.mydomain.com:3306将由app: mysql-repl提供服务。

当然,可以将该配置拆分为 2 个命名空间(一个命名空间 - 一个 mysql - 每个命名空间一个服务(。

  • ClusterIP + OpenVPN

考虑到您的 mysql pod 具有集群 IP,可以在集群中生成额外的 VPN pod 并通过它连接到 mysqls。

因此,您可以建立 VPN 连接并有权访问所有群集资源。这是非常有限的解决方案,需要为需要访问mysql的任何人建立VPN连接。

好的做法是在该解决方案之上添加堡垒服务器。该服务器将负责通过VPN提供对群集服务的访问。

希望有帮助。

最新更新