K8s 与Dubbo
Dubbo 和Kubernetes
在
服务治理
以路由规则为例,需要支持一种新的路由规则:
-
Pod 定义环境变量,应用获取,Dubbo 提供对环境变量读取的支持,Pod 中需要按照Dubbo 定义的环境变量设置具体的Pod 信息。 -
通过
Downward Api 传递Pod 信息,Dubbo 需要提供对Downward 的目录读取,Pod 中需要定制downward 的对应配置。 -
通过
API Server 获取数据,最强大的方式,但是应用需要强依赖于API Server 。
应用获取其他
-
通过调用其他
Pod 的服务获取,依赖于应用能获取自身的Pod 信息,同时将自身的Pod 信息暴露成服务(Rest 或Dubbo 协议) ,client 端通过调用对用的Pod 获取到对应Pod 的完整信息。 -
通过
API server 获取数据,很强大,但增加了对API Server 的依赖。
服务注册和发现
-
注册机制:将
IP 写入注册中心,用心跳保持连接;当心跳停止,从注册中心删除。 -
利用
Service + DNS :新建一个Service ,可以通过标签选择到一组pod 列表,这个Service 对应一个不变的集群IP ;Client 端通过DNS 方式或者直接访问集群IP 。这个集群IP ,约等于实现了负载均衡(iptable 方式) 。 -
利用
Headless Service (DNS) :Headless Service 和上面的Service 的区别是,它不提供集群IP ,通过主机名的形式获取一组IP 列表,Client 端自己决定访问哪个Pod 。 -
API Server:
Client 端直接请求API Server ,获取到Pod 的列表,Client 自己决定访问Pod 的逻辑。同时获取的时候增加watch ,API Server 会将Pod 的变化信息同步Client 。
通过拿到
Dubbo + ZooKeeper Pod Cluster(HSF+CS cluster)
这是最简单的方式,
上面方案是将
在传统的
-
Dubbo 需要将服务注册发现的粒度改造成应用维度。 -
在运维层面,将
app=xxx (应用名)写入到Pod 的label 中。
Dubbo + Kubernetes DNS
如果
通过请求<service>.<ns>.svc.<zone>
Dubbo + API Server

Dubbo + Istio + Envoy
所以
Dubbo + Istio

服务查询
Dubbo 原有方式
只支持应用查询
和
接口+ 应用查询均衡
在原来只支持应用查询的基础上,增加一步:支持查询某个接口对应的应用列表,而大部分接口只属于一个应用。再点击应用列表下具体的应用之后,会跳到应用详情。