首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在kubernetes中为MySQL提供基于主机名的路由?

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

Stack Overflow用户
提问于 2020-02-17 09:07:23
回答 1查看 938关注 0票数 1

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

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

在mysqlServerA命名空间中运行的ServerA应该可以通过以下方法从集群外部访问:

代码语言:javascript
复制
mysql -h mysqlServerA.mydomain.com -A

在mysqlServerB命名空间中运行的ServerB应该可以通过以下方法从集群外部访问:

代码语言:javascript
复制
mysql -h mysqlServerB.mydomain.com -A

诸若此类。

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

对于mysqlServerA:

代码语言:javascript
复制
mysql -h mysqlServer.mydomain.com -A -P 3301

对于mysqlServerB:

代码语言:javascript
复制
mysql -h mysqlServer.mydomain.com -A -P 3302

这工作得很好。但是我想知道基于主机名的路由是否可行,因为我不想为每个mysql服务单独使用负载均衡器。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-02-19 09:15:15

通用信息

I按不同的端口号路由通信量

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

与HTTP不同,TCP没有允许区分通信流路由到的主机的报头。但是,至少有两种方法可以实现您想要实现的功能:)我将在后面描述。

我想知道基于主机名的路由是否可行,我不希望为每个mysql服务分别设置负载均衡器。

K8s允许服务可以在集群之外访问(即hostNetworkhostPortNodePortLoadBalancerIngress )。

LoadBalancer是在LoadBalancerIP上服务流量的最简单方法:端口;但是,由于连接的TCP性质,您必须在每个LoadBalancer实例中使用一个LoadBalancer

代码语言:javascript
复制
kind: Service 
apiVersion: v1 
metadata: 
  name: mysql 
spec: 
  type: LoadBalancer 
  ports: 
    - port: 3306 
  selector: 
    name: my-mysql

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

提出的解决方案

如果存在路由到一个或多个集群节点的外部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上访问。

代码语言:javascript
复制
$ 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.41.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提供对集群服务的访问。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60259003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档