大亨图话之Docker与Kubernetes
毋庸置疑,Docker与Kubernetes,已经是现代程序员、尤其是现代后台程序员的必备技能。事实上,以Docker和Kubernetes为代表的虚拟化基础设施,已经几乎改变了传统的Infrastructure。可以不那么负责任地说,Docker和Kubernetes,在后台开发中的角色,已经等同于10年前的操作系统了。
虚拟化技术太火,以至于有本现代操作系统教科书,把virtualization列为三大主题之一,感兴趣的可以看看《Operating Systems: Three Easy Pieces》。
虚拟化技术简介
我们说Docker是新时代的、轻量级的虚拟化技术,那么到底啥是虚拟化技术呢?准确来说,虚拟化技术(virtualization)是一种资源管理技术,更通俗点,虚拟化是一种抽象化,把真实的、复杂的东西,抽象成更灵活、更易使用的东西。
历史上,虚拟化有不同的层次,从硬件到软件,从编程语言到程序库,都有出现过,也实实在在地存在大家的周围,因为太普遍了,春风化雨,润物无声,很难引起特别注意。
而从时间轴上来看,很多知名度技术,鳞次栉比,是陆续登场的,不过大都是站在巨人的肩膀上,亦或用了前车之鉴,请看下图。
可以看到,虚拟化几乎在计算机学科诞生之初就出现了,现在所谓的Xen、KVM、Docker只是后起之秀,大型机、小型机的硬件虚拟化,早已有之,UNIX世界里,虚拟化是再普通不过的东西。这里我们跳过硬件虚拟化,直接看软件虚拟化。作为软件虚拟化的两大类代表技术,下面这张图几乎随处可见。
显然,右侧的Container,容器化技术,消耗小,更灵活,更Modern,也是我们今天的主角。
容器技术发展史
大多数人以为Docker很新鲜,了解的人都知道,Docker作为一种容器化技术,只是新瓶装旧酒、新帽遮旧颜。因为在Docker没有面世时,Google就已经大规模应用了。但更令你想不到的是,容器化技术也不是什么新鲜的玩意儿,梦醒处,且看来时路。
也就是说,20世纪70年代chroot这个System Call诞生的时候,容器之路就开始了,其后各种用户隔离的虚拟化技术蓬勃发展,直到Google发明了Process Containers,并更名为cgroups合入Linux内核,容器化技术正式成熟,并且两大关键功能全部具备:隔离& 限制。
又过数年,docker横空出世,容器化技术从此走出专业技术圈,步入大众视野,且一发不可收拾,成为今日容器技术的代名词、同义语。且看今日之Infrastructure,下图已然是事实上的标准了。
Docker核心概念
Docker如此传奇,但并不复杂,我们来看其官方介绍,清晰自然。
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly.
Docker Overview
其整体架构,也相当简洁,基本上可以认为由三部分组成:Client、Docker Host、Registries。
Register相当于一个静态的模板仓库,类似于CentOS和Ubuntu的更新源,或是各种开源软件的Mirror;Client就是大家平时用的docker命令;Docker Host上文章比较多,上图是Docker官方示意,下面有个更详细的流转图。
这里,Docker是引擎,不是容器。使用docker命令Build一个Image,Ship到Repository,然后去Repository拉取Image,创建Container,Run起来,大概就是这个过程,你说简单不简单?隔着老远看,当然神秘又牛掰,但走近了,仔细瞅瞅,其实不复杂,这世上大部分技术,莫不如此,何况还是已经资料满天飞的成熟技术呢!
docker命令本身,有很多子命令,大部分并不会天天用到,掌握核心的几个最佳实践很有必要,这里有一个很好的向导。
想要更详细的,拼网匠,大亨图话嘛,安排上。
Docker to K8S
Docker火了以后,Google很是尴尬,容器技术自己才是弄潮儿,才是江湖中的执牛耳者,没想到起个大早赶个晚集,风头都被Docker抢了去,而且随着云计算的发展,自己还不得不兼容Docker。于是,它瞅准了容器编排这个方向,拉着几个巨头成立了CNCF,并祭出自家大招,基于内部大规模资源管理系统Borg的思想,重新设计开发并开源了Kubernetes。
Kubernetes并不是Borg,虽然参与贡献Kubernetes的很多人也都是Borg的设计与开发者,它类似Borg,是用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。你可以理解为,Kubernetes,简称k8s,是用来管理容器的,而Docker是容器的一种。
Kubernetes核心概念
回到Kubernetes,作为一个管理系统、Docker编排系统,其核心概念与基本架构如下。
可以看到,整体上Kubernetes是个主从架构,类似单机架构里Nginx的Master和Worker。更技术化也更准确的一个图,通信视角,还有一个。
各组件的功能,也有非常好的图。
容器在这里是底层概念,Kubernetes里最小的工作单元是Pod,可以理解为一个容器组,再上是Node,同一个Node节点里的Pod共享网络栈,
不同Node之间,就像不同Host之间一样,通过路由通信。
实际使用中,主要使用基于Pod衍生的应用层逻辑概念,如Deployment。
Cloud Native
以Docker和Kubernetes为起点,裹挟了Microservice、DevOps等各种概念,Cloud Native的布道,一时风靡。著名的Twelve-Factor App methodology和CNCF Cloud Native Interactive Landscape,让人兴奋的同时,又望而生畏,落地之路,漫漫前行。