我有一个场景,在单个kubernetes集群中,多个mysql服务器在不同的名称空间中运行。所有mysql服务器都属于不同的部门。
我的要求是我应该能够使用主机名连接到不同的mysql服务器,即,
在mysqlServerA命名空间中运行的ServerA应该可以通过以下方法从集群外部访问:
mysql -h mysqlServerA.mydomain.com -A在mysqlServerB命名空间中运行的ServerB应该可以通过以下方法从集群外部访问:
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服务单独使用负载均衡器。
谢谢
发布于 2020-02-19 09:15:15
通用信息
I按不同的端口号路由通信量
您是对的,原因是到Mysql的连接是通过TCP完成的。这就是为什么不可能在同一个IP:port上同时连接到两个服务器。
与HTTP不同,TCP没有允许区分通信流路由到的主机的报头。但是,至少有两种方法可以实现您想要实现的功能:)我将在后面描述。
我想知道基于主机名的路由是否可行,我不希望为每个mysql服务分别设置负载均衡器。
K8s允许服务可以在集群之外访问(即hostNetwork、hostPort、NodePort、LoadBalancer、Ingress )。
LoadBalancer是在LoadBalancerIP上服务流量的最简单方法:端口;但是,由于连接的TCP性质,您必须在每个LoadBalancer实例中使用一个LoadBalancer。
kind: Service
apiVersion: v1
metadata:
name: mysql
spec:
type: LoadBalancer
ports:
- port: 3306
selector:
name: my-mysqlNodePort看起来不错,但它只允许在您知道端口(这对于客户端来说可能是繁琐的工作)时才允许您进行连接。
提出的解决方案
如果存在路由到一个或多个集群节点的外部If,可以在这些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的1.2.3.4请求都将被路由到带有app: mysql-prod选择器的Endpoints for service mysql-1234-inst-1,而mysqlServerA.mydomain.com:3306将由app: mysql-repl提供。
当然,可以将该配置拆分为2个名称空间(一个名称空间--一个mysql --每个名称空间一个服务)。
考虑到mysql吊舱具有集群it,可以在集群中生成额外的VPN结荚并通过集群连接到mysql。
因此,您可以建立VPN连接并访问所有群集资源。这是非常有限的解决方案,需要为任何需要访问mysql的人建立VPN连接。
好的做法是在解决方案的基础上添加一个堡垒服务器。该服务器将负责通过VPN提供对集群服务的访问。
希望这能有所帮助。
https://stackoverflow.com/questions/60259003
复制相似问题