Pod、Service、Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用、工作负载、网络和磁盘资源,共同定义了集群的状态。Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合。
Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,想要彻底和完整的了解 Kubernetes 的实现原理,我们必须要清楚 Pod 的实现原理以及最佳实践。
在这里,我们将分两个部分对 Pod 进行解析,第一部分主要会从概念入手介绍 Pod 中必须了解的特性,而第二部分会介绍 Pod 从创建到删除的整个生命周期内的重要事件在源码层面是如何实现的。
概述
作为 Kubernetes 集群中的基本单元,Pod 就是最小并且最简单的 Kubernetes 对象,这个简单的对象其实就能够独立启动一个后端进程并在集群的内部为调用方提供服务。在上一篇文章 Kubernetes 的基本组件与概念 中,我们曾经介绍过简单的 Kubernetes Pod 是如何使用 YAML 进行描述的:
apiVersion: v1
kind: Pod
metadata:
name: busybox
labels:
app: busybox
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
YAML
这个 YAML 文件描述了一个 Pod 启动时运行的容器和命令以及它的重启策略,在当前 Pod 出现错误或者执行结束后是否应该被 Kubernetes 的控制器拉起来,除了这些比较显眼的配置之外,元数据 metadata
的配置也非常重要,name
是当前对象在 Kubernetes 集群中的唯一标识符,而标签 labels
可以帮助我们快速选择对象。
在同一个 Pod 中,有几个概念特别值得关注,首先就是容器,在 Pod 中其实可以同时运行一个或者多个容器,这些容器能够共享网络、存储以及 CPU、内存等资源。在这一小节中我们将关注 Pod 中的容器、卷和网络三大概念。
容器
每一个 Kubernetes 的 Pod 其实都具有两种不同的容器,两种不同容器的职责其实十分清晰,一种是 InitContainer
,这种容器会在 Pod 启动时运行,主要用于初始化一些配置,另一种是 Pod 在 Running 状态时内部存活的 Container
,它们的主要作用是对外提供服务或者作为工作节点处理异步任务等等。
小结
Kubernetes 中的每一个 Pod 都包含多个容器,这些容器在通过 Kubernetes 创建之后就能共享网络和存储,这其实是 Pod 非常重要的特性,我们能通过这个特性构建比较复杂的服务拓扑和依赖关系。
生命周期
想要深入理解 Pod 的实现原理,最好最快的办法就是从 Pod 的生命周期入手,通过理解 Pod 创建、重启和删除的原理我们最终就能够系统地掌握 Pod 的生命周期与核心原理。
当 Pod 被创建之后,就会进入健康检查状态,当 Kubernetes 确定当前 Pod 已经能够接受外部的请求时,才会将流量打到新的 Pod 上并继续对外提供服务,在这期间如果发生了错误就可能会触发重启机制,在 Pod 被删除之前都会触发一个 PreStop
的钩子,其中的方法完成之后 Pod 才会被删除,接下来我们就会按照这里的顺序依次介绍 Pod 『从生到死』的过程。
总结
在这篇文章中,我们已经介绍了 Pod 中的几个重要概念 — 容器、卷和网络以及从创建到删除整个过程是如何实现的。
Kubernetes 中 Pod 的运行和管理总是与 kubelet 以及它的组件密不可分,后面的文章中也会介绍 kubelet 究竟是什么,它在整个 Kubernetes 中扮演什么样的角色。