dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes-阿里云开发者社区
“没有最好的技术,只有最合适的技术。”我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造。在Dubbo的未来规划中,除了保持自身技术上的领先性,关注性能,大流量,大规模集群领域的挑战外,围绕Dubbo核心来发展生态,将Dubbo打造成一个服务化改造的整体方案也是重点之一。这是我们将推出“服务化改造”系列文章的第二篇,通过在一些外围系统和服务化基础组件上的开发实践,分享Dubbo生态下的服务化改造收获和总结。
大体目标
大体上:Dubbo的provider不在关心服务注册的事宜,只需要把其Dubbo服务端口打开,由kubernetes来进行服务的声明和发布;Dubbo的consumer在服务发现时直接发现kubernetes的对应服务endpoints,从而复用Dubbo已有的微服务通道能力。好处是无需依赖三方的软负载注册中心;同时无缝融入kubernetes的多租户安全体系。Demo的代码参照: http://gitlab.alibaba-inc.com/kongming.lrq/dubbo-kubernetes/tree/master
闲淡
Kubernates是建立在扩展性的具备二次开发的功能层次丰富的体系化系统
首先其最核心的功能是管理容器集群,能管理容器化的集群(包括存储,计算),当然这个是建立在对容器运行时(CRI),网络接口(CNI),存储服务接口(CSI/FV)的基础上;
其次是面向应用(包括无状态/有状态,批处理/服务型应用)的部署和路由能力,特别是基于微服务架构的应用管理,具备了其服务定义和服务发现,以及基于configmap的统一配置能力;
在基础资源(主要是抽象底层IaaS的资源)和应用层的抽象模型之上是治理层,包含弹性扩容,命名空间/租户,等。当然,基于其原子内核的基础能力,在Kubernetes的核心之上搭建统一的日志中心和全方位监控等服务是水到渠成的,CNCF更是有其认定推荐。
来张Kubernetes Architecture的一张图解释下上述描述。在2018年Kubernetes往事实的paas底座的标配迈出质的一步,有人说原因在于基于扩展的二次开发能力,有人说在于其声明式编程和背靠Google和Redhat的强大社区运作,我觉得回归本质是在于下图中的__Layered架构和其问题域的领域建模抽象__。
以微服务架构视角,Kubernetes在一定意义上是微服务框架(这时较叫微服务平台或toolkit集更合适),支持微服务的服务发现/注册的基本能力。借用如下图做一个简单描述。
话题再展开一下,微服务领域涉及众多问题,大概可以用下图说明。
kubernetes解决得只是少部分,而像动态路由,稳定性控制(断路器,隔水舱等),分布式服务追踪等是个空白,这也就是servicemesh要解决的,是在CNCF的Trail Map占有重要一席;当然Dubbo是基本具备完备的微服务,也就是使得其集成到k8s体系下具有相当的意义。Dubbo在serviemesh中基于sidecar的方案是解决跨语言诉求的通用servicemesh方案,需要新开一个话题来展开说;而引用serviemsh的原始定义:
A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application.
首先服务网格是一个云原生环境下基础设施层,功能在于处理服务间通信,职责是负责实现请求的可靠传递,被使得被监控跟踪,被治理,最终使得微服务架构被赋予高可控的稳定性和快速的问题定位排查能力。
可以得出现有Dubbo集成云原生基础设施kubernetes的基础能力而并解决微服务相关核心问题也算是一种狭义上的servicemesh方案,只是是Java领域的罢了;当玩笑理解也行,哈哈。
思路/方案
kubernetes是天然可作为微服务的地址注册中心,类似于zookeeper, 阿里巴巴内部用到的VIPserver,Configserver。 具体来说,kubernetes中的Pod是对于应用的运行实例,Pod的被调度部署/启停都会调用API-Server的服务来保持其状态到ETCD;kubernetes中的service是对应微服务的概念,定义如下
A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.
概括来说kubernetes service具有如下特点
每个Service都有一个唯一的名字,及对应IP。IP是kubernetes自动分配的,名字是开发者自己定义的。
Service的IP有几种表现形式,分别是ClusterIP,NodePort,LoadBalance,Ingress。 ClusterIP主要用于集群内通信;NodePort,Ingress,LoadBalance用于暴露服务给集群外的访问入口。
乍一看,kubernetes的service都是唯一的IP,在原有的Dubbo/HSF固定思维下:Dubbo/HSF的service是有整个服务集群的IP聚合而成,貌似是有本质区别的,细想下来差别不大,因为kubernetes下的唯一IP只是一个VIP,背后挂在了多个endpoint,那才是事实上的处理节点。
此处只讨论集群内的Dubbo服务在同一个kubernetes集群内访问;至于kubernetes外的consumer访问kubernetes内的provider,涉及到网络地址空间的问题,一般需要GateWay/loadbalance来做映射转换,不展开讨论。针对kubernetes内有两种方案可选:
DNS: 默认kubernetes的service是靠DNS插件(最新版推荐是coreDNS), Dubbo上有个proposal是关于这个的。我的理解是static resolution的机制是最简单最需要支持的一种service discovery机制,具体也可以参考Envoy在此的观点,由于HSF/Dubbo一直突出其软负载的地址发现能力,反而忽略Static的策略。同时蚂蚁的SOFA一直是支持此种策略,那一个SOFA工程的工程片段做一个解释。这样做有两个好处,1)当软负载中心crash不可用造成无法获取地址列表时,有一定的机制Failover到此策略来处理一定的请求。 2)在LDC/单元化下,蚂蚁的负载中心集群是机房/区域内收敛部署的,首先保证软负载中心的LDC化了进而稳定可控,当单元需要请求中心时,此VIP的地址发现就排上用场了。
API:DNS是依靠DNS插件进行的,相当于额外的运维开销,所以考虑直接通过kubernetes的client来获取endpoint。事实上,通过访问kubernetes的API server接口是可以直接获取某个servie背后的endpoint列表,同时可以监听其地址列表的变化。从而实现Dubbo/HSF所推荐的软负载发现策略。具体可以参考代码:
以上两种思路都需要考虑以下两点
kubernetes和Dubbo对于service的名字是映射一致的。Dubbo的服务是由serviename,group,version三个来确定其唯一性,而且servicename一般其服务接口的包名称,比较长。需要映射kubernetes的servie名与dubbo的服务名。要么是像SOFA那样增加一个属性来进行定义,这个是改造大点,但最合理;要么是通过固定规则来引用部署的环境变量,可用于快速验证。
端口问题。默认Pod与Pod的网络互通算是解决了。需要验证。
Demo验证
下面通过阿里云的容器镜像服务和EDAS中的kubernetes服务来做一次Demo部署。
访问阿里云-》容器镜像服务,创建镜像仓库并绑定github代码库。如下图
点击管理进行创建好的仓库,通过镜像服务下的构建功能,把demo构建成image,并发布到指定仓库。如下图。
切换到企业级分布式应用服务(EDAS)产品,在资源管理 - 》集群 下创建kubernetes集群并绑定ECS,如下图.
应用管理 -》创建应用,类型为kubernetes应用 并且指定在容器镜像服务中的镜像。如下图。
创建完成后,进行应用部署。如下图
补充
应用名不能有大写字母,是要小写,否则有部署失败的问题。
在创建应用时,选中镜像后,下一步的按钮无法点击,需要点击选择继续。
EDAS有两套独立的kubernetes服务,一套是基于阿里云的容器服务,一套是Lark自己搞的。本人体验的是后者。
Docker与IDE集成的开发联调,需要考虑集成IDEA的相关插件。
dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes-阿里云开发者社区相关推荐
- dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes
原标题:服务化改造实践(二)| Dubbo + Kubernetes 摘要: "没有最好的技术,只有最合适的技术."我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合 ...
- dubbo k8s 服务发现_工商银行基于 Dubbo 构建金融微服务架构的实践-服务发现篇
作者 | 张远征来源|阿里巴巴云原生公众号 导读:Dubbo 作为分布式微服务框架,众多公司在实践中基于 Dubbo 进行分布式系统架构.重启开源后,我们不仅看到 Dubbo 3.0 最新的 Road ...
- dubbo k8s 服务发现_将Dubbo微服务迁移到k8s集群环境中前的思考与落地
将Dubbo微服务迁移到k8s中的思考与落地 说到容器化,不得不提kubernetes这个集群编排系统,它是一个开源系统,用于容器化应用的自动部署.扩缩和管理. Kubernetes 将构成应用的容器 ...
- cdn与gnd接地_接地-和接地相关的内容-阿里云开发者社区
又要放大招了 监控中干扰如何消除你可知道? 安防监控现已成为咱们安防作业中最重要的组成有些之一.从高清的前端摄像机,到启用愈加便当的网络传输监控,再到后端愈加微弱的存储与高清的视频显现,单从这种投入的 ...
- oss 视频 转码_播放oss问题的搜索结果-阿里云开发者社区
OSS 咨询 作者:张医博 浅谈 本章介绍一些基本的 oss 的咨询内容,问题是一直在补充的,不定期的进行更新: 问:cdn 结合 oss,oss 地址被暴露后如何处理 答: 暴露后无法组织别人访问你 ...
- python数据科学实践指南_《Python数据科学实践指南》——导读-阿里云开发者社区...
前 言 为什么要写这本书 我接触大数据技术的时间算是比较早的,四五年前当大数据这个词火遍互联网的时候,我就已经在实验室里学习编程及算法的知识.那个时候我一心想要做学术,每天阅读大量的英文文献,主要兴趣 ...
- k8s灰度更新_k8s slb如何实现灰度发布-问答-阿里云开发者社区-阿里云
首先需要制作此次实验的基础镜像: 1. Dockerfile的编写: mkdir dockerfile && cd dockerfile vim Dockerfile #注意: Doc ...
- python如何实现共享报表系统_使用python来实现报表自动化-阿里云开发者社区
xlwt 常用功能 xlrd 常用功能 xlutils 常用功能 xlwt写Excel时公式的应用 xlwt写入特定目录(路径设置) xlwt Python语言中,写入Excel文件的扩展工具.可以实 ...
- python建立矩阵原理_怎么用python建立矩阵-问答-阿里云开发者社区-阿里云
通过观察Python的自有数据类型,我们可以发现Python原生并不提供多维数组的操作,那么为了处理矩阵,就需要使用第三方提供的相关的包. NumPy 是一个非常优秀的提供矩阵操作的包.NumPy的主 ...
最新文章
- 微型计算机的发展通常以为技术指标,计算机组成原理期末复习题.doc
- QCon演讲速递:异步处理在分布式系统中的优化作用
- java jigsaw_Java 9,Jigsaw,JPMS和模块:个人探索
- AI助特朗普当选?FB史上最大数据滥用曝光,牵出ACL终身奖得主
- 2016.01.18 Xcode中的正则表达式
- 【自由随想录(二)】
- 牛客 数据库SQL实战 将titles_test表名修改为titles_2017
- 查看onedrive教育版或企业版的容量(有福利)
- Linux下Oracle 11g安装(1)—— 系统安装篇
- php模拟登陆青果教务系统,模拟登录 - php CURL模拟登陆正方教务系统
- 运筹优化(六)--目标规划定义及解法
- 阿里云OCR图片识别
- 测试 zxdfasd阿斯顿水电费健康sdgfsdgsg的发oip挥加快了地方噶是的
- netty-Android-RN等博文收藏
- 物联网风口,四大科技巨头争相布局,创业公司还有哪些机会?
- XCTF-攻防世界CTF平台-Reverse逆向类——57、re5-packed-movement(linux32位ELF文件、movfuscator代码混淆)
- php的redis单例模式
- Bridge in Linux Kernel——STP
- 使用HTML5+CSS3+JavaScript制作网页游戏的流程
- 前端js修改对象的属性值、添加新的属性、删除对象属性
热门文章
- zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南
- 你还不了解基于session的授权认证吗?
- oracle对查询结果求和_某国企Oracle数据库误truncate table恢复案例
- 果园机器人的课文_小学三年级下《果园机器人》课文
- java运行按钮在哪里_[tkinter按钮命令已在程序启动时运行
- python多线程加速for循环_多线程-如何在Python的循环中对操作进行多线程
- 计算机类专计算机网络基础与应用,2016年秋季学期计算机专业《计算机网络基础(专)》第一次语音答疑.ppt...
- mysql压力测试教程_Mysqlslap MySQL压力测试工具 简单教程
- java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)
- wangEditor编辑器中解析html图文信息问题(三)