我有一个场景,我在单个 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 允许在集群外部访问服务的一些方法(即hostNetwork
、hostPort
、NodePort
、LoadBalancer
、Ingress
(
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.4
和4.3.2.1
分配给您的节点(并在mydomain.com
时解析mysqlServerA
/mysqlserverB
到这些 IP(。我已经在我的 GKE 集群上测试了该解决方案,它可以:)工作。
使用该配置,所有解析为1.2.3.4
的mysqlServerA.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提供对群集服务的访问。
希望有帮助。