【Kubernetes】pod连接集群外部服务(以MySQL为例)
k8s里,如何映射外部服务,本文以 MySQL为例,手把手解决,get~
前言
各位小伙伴们,好久不见,卑微小涛今天又来了
澳同学问:小涛,我写了一个Java代码(已经运行在pod里了),需要连接MySQL,但不想把MySQL跑在pod里,所以需要连接物理机跑着的MySQL服务,这该怎么办?
小涛:可以用service连接鸭
澳同学:啊,这怎么连接
小涛:可以这样……
PS:
第一、二节
是讲解Service
和Endpoint
相关原理,对应的解决方案及步骤请看第三节
一、Service
访问流程:Service --> Endpoint --> Pod
service类型
在Kubernetes中,Service(简写:svc)是一个抽象层,用于将一组Pod暴露为一个网络服务。Service提供了一个虚拟IP地址和一个DNS名称,以便于其他应用程序访问这些Pod。
在Kubernetes中,Service可以分为以下种类型:【官网链接】
● ClusterIp:分配仅集群内部访问的ip,不暴露给外部使用。
● NodePort:将Pod暴露为集群外部服务,通过每个节点上的固定端口将流量路由到Service中的Pod;此类型的Service可以通过NodeIP和NodePort访问,也可以通过ClusterIP和Service的名称访问。
● ExternalName:跨名称空间访问。
● LoadBalancer:将Pod暴露为云提供商中的负载均衡器服务,可自动分配外部IP地址,并将流量路由到Service中的Pod;此类型的Service需要云提供商支持。
Headless Service
澳同学:我记得有个啥 无头服务,那个是啥东西?😜
哦哦,无头服务,是headless
的翻译,一种特殊的Service类型,不会自动分配ClusterIP和虚拟DNS名称。相反,它会为每个Pod分配一个独立的DNS名称,以便于直接访问每个Pod。
- 这种Service通常用于StatefulSet等有状态的应用程序,例如数据库集群、ZooKeeper集群等,可以直接访问每个Pod来进行读写操作。
- 当需要在Pod级别控制网络流量时,也可以使用Headless Service。
- 总之,Headless Service适用于需要访问Pod的个别IP和端口时,或需要使用自定义负载均衡逻辑时。
- 例如,StatefulSet中的数据库集群就可以使用Headless Service,以便于在读写时直接访问每个Pod。
二、Endpoint
澳同学:那 Service
和 Endpoint
之间有啥关系呢?
Service:在k8s 中,pod 之间是通信是一般通过service 名称完成的
Endpoint:pod 和 service 之间的关联关系,是通过endpoint 实现的。 Endpoints (简写:ep)表示了一个Service 对应的所有Pod 副本的访问地址,而Endpoints Controller 负责生成和维护所有Endpoints对象的控制器,它负责监听Service 和对应的Pod 副本的变化。
三、解决方案
资料包(yaml文件+MySQL_5.7镜像包)
链接:https://pan.baidu.com/s/1CiacLU91EiCT9zk8fibmEA
提取码:svce
那么我们现在知道,Service(svc)是根据 Endpoint(ep),去连接对应的服务,这就好办了
Service --> Endpoint --> Pod
场景:k8s集群连接外部的MySQL数据库
#定义一个server资源
# cat mysql_service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql #svc的name
namespace: default #定义的namespace空间下
spec:
type: ClusterIP
ports:
- port: 3306
---
# 定义一个ep资源
# cat mysql_endpoints.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql
namespace: default
subsets:
- addresses:
- ip: 10.40.xx.xx #定义的外部数据库【根据外部连接MySQL的IP更改】
ports:
- port: 3306
$ kubectl apply -f mysql_service.yaml #创建一个svc资源
$ kubectl describe svc -n default mysql
# 更新ep资源
$ kubectl apply -f mysql_endpoints.yaml
$ kubectl describe svc -n default mysql #再次查询,发现ep已经记录MySQL的连接地址了
接下来我们测试验证一下
# 建立一个mysql-pod【目的: 测试是否能正常连接外部的MySQL服务】
$ kubectl ru mysql-client --image=mysql.5.7
$ mysql -h mysql.default.svc.cluster.local -pxxx #在pod中连接MySQL
#==========================================================
#解释:mysql.default.svc.cluster.local 域名
# svc资源记录格式是:
svc_name.ns_name.svc.cluster.local
服务名.命名空间.域名后缀 (集群默认的域名后缀是svc.cluster.local)
小涛:ok,目的达成,在pod里,需要连接MySQL的话,使用这个域名即可mysql.default.svc.cluster.local
澳同学:哟,不错,下次再出点别的难题考你,哼哼
四、总结
k8s访问流程如下: Service --> Endpoint --> Pod
思路如下:
- 先定义一个service,再定义一个endpoint
- endpoint绑定server
- 在pod里面,代码访问外部服务的方式借助service完成
- 完美闭合😉
我是卑微涛,评论区欢迎交流,我们下篇文章再见了~ (。・∀・)ノ゙嗨
更多推荐
所有评论(0)