【云原生|探索 Kubernetes-1】容器的本质是进程
【云原生|探索 Kubernetes-2】容器 Linux Cgroups 限制
【云原生|探索 Kubernetes 系列 3】深入理解容器进程的文件系统
大家好,我是秋意零。
CSDN作者主页
简介
- 普通本科生在读
- 在校期间参与众多计算机相关比赛,如: “省赛”、“国赛”,斩获多项奖项荣誉证书
- 各个平台,秋意零 账号创作者
- 云社区 创建者
欢迎加入云社区
今天介绍的主题是:Kubernetes 的本质。文章有点长,希望大家能完整阅读完,并品味。
前面三篇文章中,我们介绍了容器的具体实现是怎么回事。通过前三篇文章,你应该能理解:一个 “容器”,首先是启用 Linux Namespace(名称空间)、配置 Linux Cgroups(限制)、使用 rootfs (根文件系统) 三种技术来实现容器进程的隔离。
1.容器基础核心技术是由三个技术实现的:Linux Namespace、 Linux Cgroups、rootfs 。一个正在运行的 Linux 容器 ,我们可以 “一分为二” 看待为静态和动态视图:
/var/lib/docker/overlay2//merged
,这个是我们容器的 rootfs 根文件系统,也称为 “容器镜像”(Container Image),是容器的静态视图;Namespace + Cgroups
技术构建的隔离环境,我们称为 “容器运行时”(Container Runtime),是容器的动态视图。2.如果你是一名开发人员,我们只需要关心 “容器镜像”,而如果你是一名运维人员,你需要关心 “容器运行时”。软件开发流程:开发-测试-发布-运维,“容器镜像”(这里是开发部分)承载着容器信息的传递,而不是 “容器运行时”(这里是运维部分)。
3.这里的价值在于:通过容器镜像将开发者关联起来,科技圈中 “得开发者得天下”。
这样,容器从一个开发者当中的工具,一跃变成了云计算领域的绝对主角;
- 而这里容器还不够有意义,更有意义的是 “容器编排”,因为单一的容器,到庞大的容器集群,从容器到容器云的飞跃,非常需要对容器进行编排管理;
- 而能够定义容器组织和管理规范的 “容器编排” 技术,则会是容器技术领域的 “头把交椅”。
具有代表性的容器编排工具(这里主要介绍 Kubernetes):
Compose + Swarm
组合;Kubernetes
项目。Kubernetes 是由 Google 开源的容器编排系统,最初是基于 Google 内部的 Borg 系统(始于 2003 年)开发的。2014 年,Google 将 Kubernetes 作为开源项目发布,并将其交给了 Cloud Native Computing Foundation(CNCF)来管理和维护,使其成为一个全球性的开源项目。Kubernetes 的诞生是为了解决容器编排的问题,使得开发人员能够更轻松地管理和部署大规模容器化应用程序。
Google 公司的 Borg 系统和 Borg 论文密切相关。Borg 论文是由 Google 的工程师们在 2015 年 4 月发表的一篇论文,详细描述了 Borg 系统的设计、实现和应用场景。这篇论文对于后来 Kubernetes 的设计和发展产生了深远的影响。 因此,Borg 系统和 Borg 论文可以说是互相关联、相辅相成的。
Borg 系统要承担的责任,是承载 Google 公司整个基础设施的核心依赖。在 Google 整个基础设施技术栈的最底层。正是由于这个地位,Borg 可以说是 Google 最不可能开源的一个项目。而幸运的是,得益于 Docker 项目和容器技术的风靡,它却终于得以以另一种方式与开源社区见面,这个方式就是 Kubernetes 项目。
Kubernetes 项目在 Borg 体系的指导下,体现出了一种独有的 “先进性” 与 “完备性”。
容器编排?容器调度?容器集群管理?
但是实际上,随着社会和 Kubernetes 项目的不断发展,Kubernetes 需要解决的问题是不同的,所以没有一个标准答案,不过 Kubernetes 的诞生是为了解决容器编排的问题。
目前为止 Kubernetes 已经逐渐演进为云原生下的 ”操作系统”:
所以 Kubernetes 解决的问题和所在的高度对比 Compose 、Swarm 是不一样的。
下图是 ChatGPT 回答的 “操作系统” 和 “Kubernetes(操作系统)” 功能对比图:
Kubernetes 项目依托 Borg 项目的理论优势,在短短几个月内迅速站稳了脚跟,进而确定了Kubernetes 全局架构图:
Kubernetes 架构是由 Master (控制节点)和 Node(计算节点) 两种节点组成:
Master 控制节点,主要负责管理和控制整个集群的运行。
Kubernetes 没有把 Docker 作为整个框架的核心,而是把它作为做底层容器运行时实现。
Kubernetes 着重要解决的问题,则来自于 Borg 的研究人员在论文中提到的一个非常重要的观点:
运行在大规模集群中的各种任务之间,实际上存在着各种各样的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。
如:一个 Web 应用与后端数据库之间的访问关系,一个负载均衡器和它的后端服务之间的代理关系。
Node(计算节点)承载容器的运行,负责运行容器的工作负载,并提供计算资源、容器运行时、容器网络、存储卷挂载等功能。
Node(计算节点):Node 节点中最核心的部分,是 kubelet 组件。
(这里需要说明的是:只要支持和 CRI 接口对接,就可以替换容器运行时和 Kubernetes 无缝集成,比如:Kubernetes 1.24.x 及以后的版本 ,Docker 项目已经不是 Kubernetes 的默认容器运行时了,而是 containerd,常见的容器运行时,可以看下图我在官网上截取的,更多信息参考官网)
Node 计算节点 kubelet 工作流程图:
在传统虚拟机中,发现并不相关的应用被一股脑儿地部署在同一台虚拟机中(粗粒度),有了容器之后就是单独一个应用一个环境(粗粒度)。容器也是 “微服务” 思想得以落地的先决条件。
如果只做 “封装微服务、调度单容器” 这一层次,Docker Swarm + Compose 项目就能很好实现,并具备了处理一些简单依赖关系,如:一个 “Web 容器” 和它的后端数据库 “DB 容器” 之间的访问。
在 Compose 中,你可以使用 “link” 将这两个具有依赖关系的容器联系起来,这种 “link” 实际上是配置了两个容器之间的 /etc/hosts
文件。
Kubernetes 项目最主要的设计思想是,从更宏观的角度,以统一的方式来定义任务之间的各种关系,并且为将来支持更多种类的关系留有余地。
Kubernetes 对容器间的 "访问“ 进行了分类,比如:Pod,它是 Kubernetes 中最基本的单元,Pod 中可以包含一个或多个容器,这些容器可以通过 locahost
进行频繁的交互和访问,也可以通过本地磁盘目录交换文件,因为一个 Pod 中它们的 Network Namespace 和数据卷是共享的,从而提高效率来交换信息。
需要注意的是:需要非常频繁的交互和访问,我们一般把这类容器放入到一个 Pod 中。
对于另外一种更为常见的需求,比如: Web 应用与数据库之间的访问关系,它们之间一般不会部署到一个 Pod 中或者说一台机器上,这样即使 Web 端 down 机了,数据库也不会受到影响,对于容器来说把当前运行的容器删除了,或者后端数据库做了高可用(前端也可以)IP地址会变化或后端 IP 地址很多,这种时候 Web 怎么和数据库连接呢?
从 Servcie 服务可以看到,我们都是围绕着 Pod 去扩展和去提供服务的,我们可以看下图 Kubernetes 项目核心功能的“全景图”:
从这副图中,我们可以看到 Pod 的地位是在最中心,所有的服务都是为 Pod 提供服务或者管理 Pod。
从容器这个最基础的概念出发,首先遇到了容器间 “紧密协作” 关系的难题,于是就有了 Pod;有了 Pod 之后,我们希望能一次启动或收缩多个应用的实例,这样就需要 Deployment 这个 Pod 的控制器;有了这样的控制器之后(一组相同的 Pod),就需要一个 VIP 来负载均衡和暴露服务访问它,这个时候就有了 Service。
这个时候还有一些问题,比如:Web 访问数据库时肯定时需要密码的,这个时候我们怎么安全的定义密码而不会以明文的方式暴露在外呢?
Kubernetes 项目并没有像其他项目那样,为每一个管理功能创建一个指令,然后在项目中实现其中的逻辑。
这种使用方法,就是所谓的 “声明式 API”。这种 API 对应的 “编排对象” 和 “服务对象”,都是 Kubernetes 项目中的 API 对象(API Object)。
首先我们简单的回顾了一下前面章节的知识,理解静态视图和动态视图,了解开发和运维在容器中所承担的角色。
接着我们介绍了 Kubernetes 它和 borg 系统和论文之间的关系,这里也说明了 Kubernetes 诞生的基础,阐述了 Kubernetes 是为解决什么问题而诞生的。然后我们重点介绍了 Kubernetes 的全局架构图,从 Master 控制节点和 Node 计算节点展开。
最后我们说明了设计思想所站在的高度和其他项目有什么不同,同时阐述了 Kubernetes 之间的对象服务关系,分清楚 “编排对象” 和 “服务对象”,理解 Kubernetes 是管理 Pod 以及为 Pod 提供服务的。通过 Pod 我们应该能明白 Kubernetes 是可以想象成操作系统的,为 Pod 提供网络、存储、安全、等服务,而 Pod 则是我们这个系统中的应用程序。
我是秋意零,欢迎大家一键三连、加入云社区
我们下期再见(⊙o⊙)!!!
参考《深入剖析Kubernetes》作者 张磊