马老师云原生DevOps应用平台开发实战
Docker容器:
docker大部分人都熟悉或者至少是听过。Docker技术在很多技术资料和书籍上,往往会跟虚拟化技术做对比,它们的对比如下:
KVM等虚拟化技术是在操作系统级别上进行虚拟和隔离,每一个虚机都是独立的OS。
而docker是在同一个操作系统中,实现了轻量级的虚拟化。“轻量级的虚拟化”怎么理解呢?看起来docker容器是独立的操作系统,本质上是同一个操作系统中的进程隔离。所以它是轻量级的;从而,docker比KVM更省资源、资源利用率更高。
Docker的设计理念很伟大、作用也很伟大。但是docker的伟大性远不只是体现在“轻量的虚拟化”;docker的伟大性体现在:它实现了:同一个软件发布,在不同的平台上运行。
这个好处是不是很熟悉?这其实就是Java最初流行起来的原因。Python语言为了实现这一点,弄出了VirtualEnv,把依赖包都随着程序发布,才解决了多平台运行的问题。Docker的设计很优雅,一个应用都打包成一个image格式,image采用分层技术等等,这部分不是本文的重点,大家希望更深入了解的话,可以参考其他资料。
2. Kubernetes
docker镜像运行起来是一个一个的程序,多个程序合起来做成一个大的分布式应用怎么做呢?
答案很简单,一样的,程序之间互相调用就行。就好比传统的分布式应用,多弄几台服务器,一个服务器上装一个程序,程序之间通过socket或其他协议通信。基于docker的分布式应用也是如此,区别只是网络虚拟化了、CPU和内存资源也虚拟化了。
但是永远不要低估分布式应用的复杂性,举两个例子,想象我们搭建了一套分布式集群,运行了一套分布式应用:
这个集群中的某个机器出故障了(断电了、硬盘坏了等等),怎么去排查故障、怎么去修复?
这个集群中某一部分业务由于访问量增加,需要扩充支撑能力,怎么扩充?
针对这两个问题,我们很容易想到答案,那就是人过去检查机器、修复或者重装,负载过大了,就改应用的架构,上面套上负载均衡性,采用可扩展的架构。这些都是传统的办法,这些解决办法不好的地方也很明显,就是修复太慢,太费人力、成本高、对业务影响大,想象一个网站,等扩展架构都弄好了,用户也就都流失了。
Kubernetes是容器编排系统,它首要的目的就是为了解决上面这个例子里的两个问题:
分布式容器应用的可靠性,在服务器或容器应用出现问题的情况下,自动感知,自动将容器应用在集群内的其他机器里重新运行起来
分布式容器应用的可扩展性,通过启动相同的容器应用,自动的提升应用的负载支撑能力。
Google为了压制AWS,把自己的容器运行平台开源出来,成为了现在的Kubernetes,