马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
作者:微信文章
背景
近几年,我一直在一个SaaS公司做软件私有化交付相关的工作,在软件的交付过程中都会面临各种各样的问题。有些问题是大家都会遇到的,有些问题是我们独有的。有些问题可以通过技术手段解决,有些问题无法通过技术手段解决。作为一个技术人,我的想法肯定是通过技术手段解决尽可能多的问题,也就是去屏蔽尽可能多的需要人为参与的流程。这也是信息化最终要达成的目标,当然也是软件交付想要达到的理想状态。因为人始终是一种不可靠的动物。
技术没有银弹
虽然技术没有银弹,但是我们可以一直增加银的含量。
Docker、Kubernetes等等一系列云原生技术的出现给软件交付加了一口大大的油。短时间内各种概念层出不穷,GitOps、OAM(Open Application Model)等等。开源社区涌也现出了很多优秀的有关CI/CD的项目,翻开CNCF的Landspace上我们看到
CI/CD领域有这些:
[img=100%,100%]https://mmbiz.qpic.cn/sz_mmbiz_png/UGDf19AoEbcALMUlictUeU9mVGN4uaibo2u3tEXEhAxK5mUdHdY8TAwxAPkvJuu23pQoqNv7FnwX6Y0uImqCNBbw/640?wx_fmt=png&from=appmsg[/img]
Application Definition 领域有这些:
[img=100%,100%]https://mmbiz.qpic.cn/sz_mmbiz_png/UGDf19AoEbcALMUlictUeU9mVGN4uaibo2IGx8kdGHVxibcketIGJ5fsfaYia3pGq76nOiclfcx3ZicjqsBZlKceXuIA/640?wx_fmt=png&from=appmsg[/img]
2023年OpenAI的爆火,AIOps的概念也被提了出来。大家都在想方设法的把AI落地到自己的领域,在这个大蛋糕上份上一块儿。让我们看看AI和Ops该如何结合。下图是一个完成的AIOps的学习路径。我们看到无论如何,云原生这道坎是一定要迈过去的。因为它位于整个架构的最底层。
[img=100%,100%]https://mmbiz.qpic.cn/sz_mmbiz_png/UGDf19AoEbcALMUlictUeU9mVGN4uaibo2m39RDLnujXFsjKDv3M29gnYBvuNx8FTFFyNCqeDOpgIaH92u0CzE0Q/640?wx_fmt=png&from=appmsg[/img]
Docker&Kubernetes
关于Docker和Kubernetes,我有这样两个问题。他们对于软件交付分别有什么重要的意义。
Docker颠覆了传统PaaS在软件打包方式上的认知,创造性的提出了Docker Image的概念。使得现代软件打包、分发流程趋近于完美。
Kubernetes以其超前的、独特的设计理念统一了容器编排的江湖。声明式API的出现,将我们的应用交付、运维相关的各个维度具象化的展现给了开发者。
敌军不是十五万,而是十五万零两个
Docker容器不是虚拟机,而是特殊的进程加根文件系统(rootfs)。
一开始接触Docker的时候认为,Docker最重要的技术是他的容器运行时,殊不知Docker Image才是它的立命之本。我之所以这么说,且听我娓娓道来。
了解过Docker原理的人都知道,Docker之所以表现出来虚拟机的特性,是Docker开发人员包装的结果。Docker将Linux系统的Namespace,Cgroup,Chroot经过层层包装后,体现给用户的效果就是你在使用Docker容器的过程就像是使用Linux系统一样简单。Docker之所以以势不可挡之势掀翻传统PaaS平台,也是因为他们包装出来的容器给了用户极致的使用体验。接下来,让我们逐一介绍一下上面提到的概念在容器中的作用。
Namespace
隔离进程看到的文件
隔离进程使用的网络,例如只能看到当前namespace下的网络设备。
隔离进程,使进程只能看到自己namespace内的进程。
process namespace
network namespace
mount namespace
Cgroup
Chroot
改变当前进程的根目录,可以把任意目录当做当前系统的根目录。
总之Docker通过隔离加限制构建出了容器的雏形,但是还有一个问题就是如何让容器的行为表现出来像是一个虚拟机,这里docker采用的方案就是通过chroot或者privot_root改变进程的根目录。而这个根目录就是我们上文提到的Docker Image,它其实就是一些列系统文件和应用程序文件的组合。
通过上面的信息我们还可以初步窥探到一个Docker容器的启动流程。
从网络上下载或者从本地加载镜像资源包,将资源包解压成rootfs。
找到容器的启动命令,将其启动为Linux的一个进程
设置容器进程的namespace、cgroup信息,例如设置进程、网络、挂载点命名空间,限制CPU、内存等。
切换容器根目录、完成启动
老子打的就是精锐
上文提到的不论是 namespace、cgroup还是chroot,其实都是Linux系统很早就有的概念,各个PaaS厂商也都是基于这些技术去实现应用的隔离和限制,但是他们始终没有很好解决的就是应用的打包和分发问题。直到Docker Image的出现这个问题才算画上了一个比较完美的句号。PS: 之所以说它比较完美,是因为Docker目前还不能很好的隔离Linux内核。
我们来看看Docker Image是怎么回事,我们可以简单的认为Docker Image就是将我们的系统文件,例如ubuntu系统的系统文件(除了内核),加上应用程序文件,例如Springboot应用的jdk,jar包等统一的压缩成一个压缩包。我们使用的时候就直接从网络、或者本地加载这个压缩包,构成一个容器的rootfs。
当然如果直接每个镜像都如此压缩势必会浪费很多的存储空间,所以Docker就提出了联合文件系统(Union FS)。Docker将他的镜像分成了很多层,举个比较形象化的例子,例如一个镜像可能会包含Ubuntu层、Jdk层、Springboot 应用程序层等等,另外每个层都会单独存储。这样做的好处显而易见,比如你的多个应用都依赖ubuntu操作系统,那么多个应用所使用的ubuntu层是同一个。这样就大大减少了本地磁盘的存储压力。
[img=100%,100%]https://mmbiz.qpic.cn/sz_mmbiz_png/UGDf19AoEbcALMUlictUeU9mVGN4uaibo27QR9sWicEsDECER7ry90Qibtia38n2Z0TDnNLbxOrQiaRUq3nO7GZxSEwQ/640?wx_fmt=png&from=appmsg[/img]
而在挂载rootfs的时候,Docker使用的是联合挂载的方式,也就是通过获取docker image的描述文件中的信息,将镜像的每一层依次挂载到当前容器的rootfs目录,当然上下如果有冲突文件,上层文件会覆盖下层。同时为了保障镜像的不可变性,上层中的文件删除操作其实是逻辑删除,就是在当前层把删除的文件标记为删除(whiteout)。上文示意图中的只读层部分就是我们镜像实际的样子,括号中的rw+wh是一种挂载方式,表示读写挂载,当文件被删除的时候不做物理删除,而是生成一个whiteout文件将被删除的文件隐藏起来。
而上面的Init层其用处是挂载一些初始化文件,例如hosts文件等,因为这些文件如果放在只读层不太合适,因为这些信息会被频繁的改动。最上层的可读写层其实就是我们容器实际运行起来的时候可以操作的层。
总之,Docker Image通过其巧妙的设计,将应用所依赖的操作系统文件以及应用本身一并打包起来,无论宿主机的环境如何变化,同一个镜像都能很快的通过docker run的方式运行起来。而PaaS行业盘踞的这群精锐被这个小创新打的丢亏卸甲,溃不成军。
你叫集装箱?老子叫舵手,腿给你打折
如果Docker的结局和Docker的开局一样完美就好了。
话说前几年Docker风头正盛时,它也面临着一个相当棘手的问题。它本身仅仅是一个好用的工具,Docker并没有高大的技术壁垒,cgroup、namespace、chroot这些东西也都是人家玩剩下的东西,唯一的Docker Image技术壁垒也不高,可替代性实在是太强了。所以为了发展,它必须向容器平台转型,势必要加入容器编排特性。但这条路并不好走。这里有很多家大业大,技术沉淀丰富的竞争对手,例如Redhat、Google之流。看到这里似乎Docker这边比较好的出路就是选择和这些老家伙们合作,但是Docker确选择了硬刚。Docker很快推出了自己的平台化解决方案,即docker swarm。然而面对Redhat、Google这些老流氓的围剿最终还是败下了阵来。
当然Docker还是真的很厉害,Google为了对付Docker,祭出了它的看家神器。即Kubernetes---脱胎自自家的容器管理平台Borg。从此Kubernetes的传奇开始了,它以绝对开放的王者之姿,荡平了整个云原生领域,成为了事实上的云原生标准。
你们的王来了
Kubernetes堪称是概念之王,他给业界带来了众多的新概念,例如,声明式API、各种各样的资源类型(Pod、Deployment、ReplicaSet、StatefulSet、CronJob、Ingress...)等等。学习坡度相当陡峭。然而这座山是必须要跨过去的,后续让我们一一介绍吧。
预知后事如何,且听下回分解。 |