Hi,大家好,欢迎大家和我一起学 K8S,这是系列第三篇。
每一种技术,为了描述清楚它的设计理念,都会自定义一堆概念或术语。在进入一门技术的研究之前,我们有必要扫清它的基本概念。
K8S 的操作实体,在 K8S 中,有很多的操作对象,比如容器、Pod、Deployment、Service、Node 等,我们统统称它们为资源对象。
K8S 集群,是计算、存储和网络资源的集合,K8S 基于这些资源来承载容器化的应用。
K8S 集群的大脑,负责整个集群的管控、资源调度。可以部署在普通物理机或虚拟机上,为了实现高可用,可以部署多个 Master。
K8S 集群的执行者,受 Master 指挥,负责运行和监控容器应用、管理容器的生命周期,并向 Master 定期汇报容器的状态。同样,Node 也可以部署在物理机或虚拟机之上,也可以部署多个。
在 K8S 集群中,Pod 是资源调度的最小单位,一个 Pod 可以包含一个或多个容器应用,这些容器应用彼此之间存在某种强关联。Pod 内的所有容器应用共享计算、存储、网络资源。
Controller 是 K8S 中负责管理 Pod 的资源对象,它定义 Pod 的部署属性,比如有几个副本,副本异常怎么处理等,如果把 Pod 副本看做是一个公司职员,那么 Controller 就像是 HR,会不断根据人员的变动来招人满足公司的发展需求。
为了满足多种业务场景,K8S 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefulSet、Job 等。
Deployment 是最常用的 Controller,定义了用户的期望场景,实现了 Pod 的多副本管理,如果运行过程中有一个副本挂了(员工离职),那么 K8S 会根据 Deployment 的定义重新拉起一个副本继续工作(招一个新员工),始终保证 Pod 按照用户期望的状态运行。
ReplicaSet 和 Deployment 实现了同样的功能,确切的说是 Deployment 通过 ReplicaSet 来实现 Pod 的多副本管理。我们通常不需要直接使用 ReplicaSet。
DaemonSet 用于每个 Node 最多只运行一个副本的场景,通常用于运行 Daemon。
Job 用于运行结束就删除的应用,而其他 Controller 则是会长期保持运行。
以上 Controller 都是无状态的,也就是说副本的状态信息会改变,比如当某个 Pod 副本异常重启时,其名称会改变。StatefulSet 提供有状态的服务,能够保证 Pod 的每个副本在其生命周期中名称保持不变。这是通过持久化的存储卷来实现的。
Label 定义了其他资源对象所属的标签,类似于你在公司被分到 A 小组、B 小组。有了标签,就可以针对性地对每个小组进行管理。比如把某个小组搬到哪个办公区(把某个 Pod 部署到哪个 Node 上)。给指定的资源对象定义一个或多个不同的标签能够实现多维度的资源分组管理,方便进行资源分配、调度、配置、部署等管理工作。
Label 选择器,K8S 通过 Selector 来过滤筛选指定的资源对象,类似于 SQL 语句中的 where 查询条件,Label 实现了简单又通用的对象查询机制。
在 K8S 中,Service 是对 Pod 对象的抽象,通常,Pod 会以多副本的形式部署,每个 Pod 都有自己的 IP,都可以对外提供服务,但 Pod 是脆弱的,也就是说,它随时都有可能被频繁地销毁和重启,IP 也会随之改变,这样,服务的访问就会出现问题。
Service 就是提出来解决这个问题的,它定义了一个虚拟 IP(也叫集群 IP),这个 IP 在 Service 的整个生命周期内都不会改变。当有访问到达时,Service 会将请求导向 Pod,如果存在多个 Pod,Service 还能实现负载均衡。
K8S 的存储卷,定义了一个 Pod 中多个容器可访问的共享目录。和 Docker 的 Volume 不太一样的是,K8S 的 Volume 是以 Pod 为单位的,也就是 Volume 的生命周期和 Pod 相关,和 Pod 内的容器不相关,即使容器终止或重启,Volume 中的数据也不会丢失,只有当 Pod 被删除时,数据才会丢失。
当有多个用户或租户使用同一个 K8S 集群时,如何区分它们创建的资源呢?答案就是 Namespace。
Namespace 将一个物理的集群从逻辑上划分成多个虚拟的集群,每个集群就是一个 Namespace,不同 Namespace 里的资源是完全隔离的。每个用户在自己创建的 Namespace 里操作,都不会影响到其他用户。
Annotation 与 Label 类似,但和 Label 不同 的事,Annotation 不用于过滤筛选,它只是用户定义的某一种资源的附加信息,目的是方便外部查找该资源。有点类似于我们常说的别名,没有它完全可以,但有了它可以很方便查找。