云计算
我是谁
我叫张磊,是 kubernetes 社区的一位资深成员和项目维护者。在 kubernetes 和 kata containers 社区从事上游开发工作,先后发起了容器镜像亲密性调度、基于等价类的调度优化等多个核心特性,参与了容器运行时接口、安全容器沙盒等多个基础特性的设计和研发。作为主要的研发人员和维护者之一,亲历了 serverless container 概念的诞生与崛起。
在工作之余,发起和组织撰写了《docker 容器与容器云》一书,受到了广大希望进阶容器技术的读者的好评。参与和亲历了容器技术从“初出茅庐”到“尘埃落定”的全过程
文末福利有获取 k8s 知识福利的指南。
从“容器”到“容器云”
我曾经提过:一个“容器”,实际上是一个由 linux namespace、linux cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。
所以,一个正在运行的 linux 容器,其实可以被“一分为二”地看待:
一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(container image),是容器的静态视图;
一个由 namespace cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(container runtime),是容器的动态视图。
作为一名开发者,我们并不关心容器运行时的差异。因为,在整个“开发 – 测试 – 发布”的流程中,真正承载着容器信息进行传递的,是容器镜像,而不是容器运行时。
这个重要假设,正是容器技术圈在 docker 项目成功后不久,就迅速走向了“容器编排”这个“上层建筑”的主要原因:作为一家云服务商或者基础设施提供商,我只要能够将用户提交的 docker 镜像以容器的方式运行起来,就能成为这个非常热闹的容器生态图上的一个承载点,从而将整个容器技术栈上的价值,沉淀在我的这个节点上。
更重要的是,只要从我这个承载点向 docker 镜像制作者和使用者方向回溯,整条路径上的各个服务节点,比如 ci/cd、监控、安全、网络、存储等等,都有我可以发挥和盈利的余地。这个逻辑,正是所有云计算提供商如此热衷于容器技术的重要原因:通过容器镜像,它们可以和潜在用户(即开发者)直接关联起来。
从一个开发者和单一的容器镜像,到无数开发者和庞大的容器集群,容器技术实现了从“容器”到“容器云”的飞跃,标志着它真正得到了市场和生态的认可。
这样,容器就从一个开发者手里的小工具,一跃成为了云计算领域的绝对主角;而能够定义容器组织和管理规范的“容器编排”技术,则当仁不让地坐上了容器技术领域的“头把交椅”。
这其中,最具代表性的容器编排工具,当属 docker 公司的 compose swarm 组合,以及 google 与 redhat 公司共同主导的 kubernetes 项目。
kubernetes 项目的设计与架构
想和大家聊聊 kubernetes 项目的设计与架构。
跟很多基础设施领域先有工程实践、后有方法论的发展路线不同,kubernetes 项目的理论基础则要比工程实践走得靠前得多,这当然要归功于 google 公司在 2015 年 4 月发布的 borg 论文了。
borg 系统,一直以来都被誉为 google 公司内部最强大的“秘密武器”。虽然略显夸张,但这个说法倒不算是吹牛。因为,相比于 spanner、bigtable 等相对上层的项目,borg 要承担的责任,是承载 google 公司整个基础设施的核心依赖。在 google 公司已经公开发表的基础设施体系论文中,borg 项目当仁不让地位居整个基础设施技术栈的最底层。
图片来源:malte schwarzkopf. “operating system support for warehouse-scale computing”. phd thesis. university of cambridge computer laboratory (to appear), 2015, chapter 2.
上面这幅图,来自于 google omega 论文的第一作者的博士毕业论文。在这个图里,你既可以找到 mapreduce、bigtable 等知名项目,也能看到 borg 和它的继任者 omega 位于整个技术栈的最底层。
正是这样,borg 可以说是 google 最不可能开源的一个项目。幸运地是,得益于 docker 项目和容器技术的风靡,它却终于得以以另一种方式与开源社区见面,这个方式就是 kubernetes 项目。
所以,相比于“小打小闹”的 docker 公司、“旧瓶装新酒”的 mesos 社区,kubernetes 项目从一开始就比较幸运地站上了一个他人难以企及的高度:在它的成长阶段,每个核心特性的提出,几乎都脱胎于 borg/omega 系统的设计与经验。更重要的是,这些特性在开源社区落地的过程中和社区的合力之下得到了极大的改进,修复了很多当年遗留在 borg 体系中的缺陷和问题。
所以,尽管在发布之初被批评是“曲高和寡”,但是在逐渐觉察到 docker 技术栈的“稚嫩”和 mesos 社区的“老迈”之后,这个社区很快就明白了:kubernetes 项目在 borg 体系的指导下,体现出了一种独有的“先进性”与“完备性”,而这些特质才是一个基础设施领域开源项目赖以生存的核心价值。
为了更好地理解这两种特质,我们不妨从 kubernetes 的顶层设计说起。
kubernetes 项目要解决的问题
编排?调度?容器云?还是集群管理?
实际上,这个问题到目前为止都没有固定的答案。因为在不同的发展阶段,kubernetes 需要着重解决的问题是不同的。
但是,对于大多数用户来说,他们希望 kubernetes 项目带来的体验是确定的:现在我有了应用的容器镜像,请帮我在一个给定的集群上把这个应用运行起来。
更进一步地说,我还希望 kubernetes 能给我提供路由网关、水平扩展、监控、备份、灾难恢复等一系列运维能力。
等一下,这些功能听起来好像有些耳熟?这不就是经典 paas(比如,cloud foundry)项目的能力吗?
而且,有了 docker 之后,我根本不需要什么 kubernetes、paas,只要使用 docker 公司的 compose swarm 项目,就完全可以很方便地 diy 出这些功能了!
所以说,如果 kubernetes 项目只是停留在拉取用户镜像、运行容器,以及提供常见的运维功能的话,那么别说跟“原生”的 docker swarm 项目竞争了,哪怕跟经典的 paas 项目相比也难有什么优势可言。
而实际上,在定义核心功能的过程中,kubernetes 项目正是依托着 borg 项目的理论优势,才在短短几个月内迅速站稳了脚跟,进而确定了一个如下图所示的全局架构:
从这个架构中我们可以看到,kubernetes 项目的架构,跟它的原型项目 borg 非常类似,都由 master 和 node 两种节点组成,而这两种角色分别对应着控制节点和计算节点。
其中,控制节点,即 master 节点,由三个紧密协作的独立组件组合而成,它们分别是负责 api 服务的 kube-apiserver、负责调度的 kube-scheduler,以及负责容器编排的 kube-controller-manager。整个集群的持久化数据,则由 kube-apiserver 处理后保存在 ectd 中。
而计算节点上最核心的部分,则是一个叫作 kubelet 的组件。
kubelet 组件
在 kubernetes 项目中,kubelet 主要负责同容器运行时(比如 docker 项目)打交道。而这个交互所依赖的,是一个称作 cri(container runtime interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数。
这也是为何,kubernetes 项目并不关心你部署的是什么容器运行时、使用的什么技术实现,只要你的这个容器运行时能够运行标准的容器镜像,它就可以通过实现 cri 接入到 kubernetes 项目当中。而具体的容器运行时,比如 docker 项目,则一般通过 oci 这个容器运行时规范同底层的 linux 操作系统进行交互,即:把 cri 请求翻译成对 linux 操作系统的调用(操作 linux namespace 和 cgroups 等)。
此外,kubelet 还通过 grpc 协议同一个叫作 device plugin 的插件进行交互。这个插件,是 kubernetes 项目用来管理 gpu 等宿主机物理设备的主要组件,也是基于 kubernetes 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。
而 kubelet 的另一个重要功能,则是调用网络插件和存储插件为容器配置网络和持久化存储。这两个插件与 kubelet 进行交互的接口,分别是 cni(container networking interface)和 csi(container storage interface)。
实际上,ku
html如何引用bootstrap蓝牙耳机怎么连电视 蓝牙耳机连电视的图文步骤电脑计算器怎么算十进制转二进制云服务器搭建腾讯会议用户突破1亿,发布企业版最高支持2000人同时参会蚂蚁集团重新上市或被推迟半年 真相引起网友关注第一次用电脑需要注意什么 电脑第一次使用的注意事项分享云存储哪家好