云原生时代——撬动地心引力的技术变革
Posted 你说了想了你做了吗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生时代——撬动地心引力的技术变革相关的知识,希望对你有一定的参考价值。
不愧是足够官方的定义,如果不是我的标题写的足够大,估计你都不想往下看了,那我们就字面意思来理解一下,将云(Cloud)和原生(Native)拆分:
那什么是云(Cloud)呢?云也就是云计算,“云”实质上就是一个网络,狭义上讲,云计算就是一种提供资源的网络,使用者可以随时获取“云”上的资源,按需求量使用,并且可以看成是无限扩展的,只要按使用量付费就可以。从广义上说,云计算是与信息技术、软件、互联网相关的一种服务,这种计算资源共享池叫做“云”。
而云计算的由来,是根据虚拟化技术的发展和成熟度密切相关的。基于虚拟机技术,陆续出现了IaaS/PaaS/FaaS等形态,机器由物理机到虚拟机再到容器,部署方式又分为了公有云、私有云、混合云部署。
随着docker容器化技术愈发成熟后,完美解决了在分布式集群中,随着业务爆发或减少,对集群进行稳定运行的弹性扩缩容。而为了实现更好的容器编排,业内还掀起了一场技术战争,最终Kubernetes(K8S)拔得头筹,成为了云原生的标准,后续会持续推出这方面的文章,现在只需要知道K8S是承载了云原生的航空母舰,像虚拟机中的Linux操作系统一样重要就行了。
原生(Native)就很好理解了,“与生俱来,生而知之”,就是事物产生时原来是怎样的,就应该干什么事情。
那云(Cloud)和原生(Native)结合在一起,是怎样理解的?抛出一个定义:云原生代表着原生为云设计。详细的解释是:应用原生被设计为在云上,以最佳方式运行,充分发挥云的优势。
这里既然提出了应用概念,那应用在云上应该是个什么样子呢?或者说应该以什么样的最佳方式去运行?
这里非业务需求相关的功能都被移到云,也就是云的基础设施中去了,包括为业务需求赋能的中间件,也被下沉到基础设施中。还是以服务间的通讯为例,中间件需要做的事情,有以下这些:
看起来有这么多,与应用贴合非常紧密,实现以上的这些功能,有没有更优的衔接方式呢,如用SDK的方式引入,看起来可能会更简洁:
SDK的思路,其实是想用一个健壮的客户端,做掉所有服务间通信所需的中间件功能,但说到底,对应用还是有侵入性的。
而在云原生中,采用服务网格Service Mesh模式的思路,将SDK的客户端剥离出来,放入SideCar中,让应用更轻量化。
这样看来,让应用只专注于业务需求,云中的基础设施(包含中间件)向上提供所需的资源和能力,确实比较贴合云原生这样的设计思路,而云原生应用应该往这个方向去努力。
1.为了解决单体应用的复杂度问题,出现了微服务架构;
2.为了解决微服务架构下,大量应用部署的问题,出现了容器技术;
3.为了解决容器的管理和调度问题,诞生了Kubernetes(K8S);
4.为了解决微服务框架对应用的侵入性问题,引入了Service Mesh服务网格技术;
5.为了让 Service Mesh 有更好的底层支撑,将Service Mesh运用在K8S上运行
说到这里,没接触过的人,也许有点懵...
先回到刚才说在云原生之前,以服务间通信举例,用SDK包装中间件进行服务之间通信调用,模式如下:
而采用Service Mesh模式之后,将服务注册发现、负载均衡、路由、熔断限流等等这些复杂的操作,全部交给SideCar来实现,并和基础设施或其他中间件产品对接,而应用里留下的只是一个轻量级的SideCar-SDK(为表明含义这样举例)。
(SideCar翻译成中文,就是摩托车的边车,就是战争片里日本小三轮儿,左边骑摩托的士兵,右边独座挥刀指挥的大佐,是不是很形象)。
了解了是个啥东西之后,来仔细拆分一下Service Mesh的工作原理:
以云原生模式开发业务应用:应用只需具备最基本的能力,如生产一个服务,调用一个服务
部署时动态插入Sidecar:当我们将开发的云原生应用部署到云上,具体说是部署在k8s的pod中时,我们会自动在pod中再部署一个Sidecar,用于实现为应用赋能
在运行时,改变云原生应用的行为:如前面所说服务提供方生产一个服务给调用方服务调用,在这里会被改变为将这次调用请求劫持到Sidecar,注意这个改变对应用而言是透明无感知的
在Sidecar中实现各种功能:Sidecar里面就可以实现原有SDK客户端实现的各种功能,如服务发现,负载均衡,路由等等
Sidecar在实现这些功能时,可以对接更多的基础设施,也可以对接其他的中间件产品,这种情况下,Service Mesh产品会成为应用和基础设施/中间件之间的桥梁
可以通过控制平面来控制Sidecar的行为,而这些控制可以独立于应用之外
在对Service Mesh工作原理进行拆分时,第2步,是在部署时动态的在应用所在的 pod 中插入 Sidecar 容器,第3步提到,SideCar在应用透明无感知的情况下,对应用原本请求注册中心的流量进行了劫持,并改为转向本地部署的 Sidecar,彻底改变了这次调用行为。
而这种在运行中动态插入SideCar,并对流量进行透明劫持的行为,其实就是在动态赋能。
想知道这次动态赋能的更详细流程是怎样走的吗?其实就是在Pod启动时,设定并开启流量劫持的规则,然后在SideCar中按规则进行处理和转发,控制面板会连接其他的SideCar,根据出入规则识别这次服务调用,最后转给目标应用。
这里会涉及到K8S容器相关的知识点和机制,就先不做详述,放一张图作为思考,留到后面的章节再做详细剖析,图为Istio的Iptables透明劫持流程。
写到这里,已经是深夜了,排版和整体文章的逻辑考量确实很花时间,但是感觉还不错,没觉得枯燥和乏味,看到自己起的标题有点想笑,但不打算改了......
以上是关于云原生时代——撬动地心引力的技术变革的主要内容,如果未能解决你的问题,请参考以下文章