一般信息
我通过不同的端口号路由流量
你是对的,原因是与 Mysql 的连接是通过 TCP 完成的。这就是为什么绝对不可能有两个同时连接到同一个IP:port 上的两台服务器的原因。
与 HTTP 不同,TCP 没有允许区分流量应路由到的主机的标头。但是,仍然至少有两种方法可以实现您想要实现的功能:) 我稍后会描述。
我想知道基于主机名的路由是否可行
我不希望每个 mysql 服务都有单独的负载均衡器。
K8s 允许a few methods 在集群外访问服务(即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 路由到一个或多个集群节点,Kubernetes 服务可以暴露在那些 externalIPs 上。在服务端口上使用外部 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 分配给您的节点(并将mysqlServerA / mysqlserverB mydomain.com 解析为这些IP)。我已经在我的 GKE 集群上测试了该解决方案并且它可以工作:)。
使用该配置,所有解析为1.2.3.4 的mysqlServerA.mydomain.com:3306 请求都将通过app: mysql-prod 选择器路由到Endpoints 服务mysql-1234-inst-1,mysqlServerA.mydomain.com:3306 将由@ 提供服务987654355@.
当然可以将该配置拆分为 2 个命名空间(一个命名空间 - 一个 mysql - 每个命名空间一个服务)。
考虑到您的 mysql pod 具有 ClusterIP,可以在集群中生成额外的 VPN pod 并通过它连接到 mysqls。
因此,您可以建立 VPN 连接并访问所有集群资源。这是一个非常有限的解决方案,需要为需要访问 mysql 的任何人建立 VPN 连接。
良好的做法是在该解决方案之上添加堡垒服务器。该服务器将负责通过 VPN 提供对集群服务的访问。
希望对您有所帮助。