Hi,大家好,我是 CloudDeveloper,欢迎大家和我一起学习 K8S,这是系列第 8 篇。
上篇我们简单学习了 Pod 的基础知识,本篇开始讲述一些 Pod 的高阶知识(本文只做理论的简单阐述,后面会针对每个点进行实践)。
豌豆荚自诞生之日起,便注定要经历生老病死的一生。Pod 是由容器组成的,Pod 生命周期实际上是由容器的生命周期决定的。
在整个生命周期过程中,Pod 会被定义为各种状态,如下:
这些状态包括正常状态和异常状态,当出现异常状态时,K8S 的监控机制会检测到这种异常,并执行相应的异常处理。
Pod 的监控主要是监控 Pod 内容器的健康状况,并进行相关的异常处理和容错管理。
当监控到某个容器异常退出或健康检查失败时,Pod 会执行重启策略,使得 Pod 内的容器健康运转。
如下记录了 Pod 的重启策略和健康检查机制:
K8S Master 上的 Scheduler 服务负责实现 Pod 的调度管理,Pod 是静态的,只有真正被调度到具体的节点上才能发挥它的作用。K8S 根据不同的应用场景,定义了多种不同的调度策略。这些策略可以是根据算法自动完成的,也可以是人为指定的。具体可以看下面这张导图:
笼统来看,有时候为了权衡应用场景和集群资源的需求,需要对 Pod 进行扩容和缩容,这同样属于 Pod 调度管理的范畴。
Pod 和容器的数据存储使用 Volume,K8S Volume 和 Docker 的 Volume 是一样的原理,都是文件系统上的一个目录,只不过在 K8S 中实现了更多的 backend driver。包括 emptyDir、hostPath、GCE Persistent Disk、NFS、Ceph 等。
Volume 提供了对各种 driver 的抽象,容器在使用 Volume 读写数据的时候不需要关心底层具体存储方式的实现,对它来说,所有类型的 Volume 都是一个目录。
当 Volume 被挂载到 Pod 中时,这个 Pod 中的容器都会共享这个 Volume,当其中的容器销毁时,Volume 中的数据也不会丢失,当 Pod 销毁时,根据不同的 driver 实现,数据也可以保存下来。
Volume 提高了 Pod 内数据的持久化管理,延长了 Pod 和容器的生命周期。
在 K8S 中,定义了多种资源对象,很多对象本身就是一个通信的实体,比如容器、Pod、Service、Node。
K8S 维护这多种对象之间的通信关系,比如:Pod 内容器之间的通信、Pod 与容器之间的通信、Pod 之间的通信、Pod 与 Service 之间的通信,以及外部的访问。
这些通信机制的建立离不开 K8S 建立的完善的网络模型。K8S 使用了 CNI(容器网络规范)来标准化、归一化网络模型。
第三方的厂商或开发者可以根据自身网络需求,遵从 CNI 的规范,实现各种网络方案,并以插件的形式提供给 K8S 使用。目前比较知名的网络方案有:flannel、calico、weave、canal 等。
这些网络方案各有千秋、虽然实现方式各有区别,但殊途同归,最终都是满足 K8S 中各种实体间的通信需求。
OK,本文就到这里,我们通过两篇文章大致梳理了豌豆荚从出生到死亡要面临的多种人生的关卡。跨过去了,就成熟了,希望我们都能跨过自己人生的关卡。
下文我们开始进入实践的部分。