Kubernetes 是一种用于在一组主机上运行和协同容器化应用程序的系统,提供应用部署、规划、更新维护的机制。应用运行在 kubernetes 集群之上,实现服务的扩容、缩容,执行滚动更新以及在不一样版本的应用程序之间调度流量以测试功能或回滚有问题的部署。Kubernetes 实现管理服务的各项功能是经过定义各类类型的资源来实现的,如 deployment、pod、service、volume 等。下面经过该文章来简述 pod 的基础信息并详述 pod 的生命周期。node
Pod 是 kubernetes 系统的基础单元,是由用户建立或部署的最小组件,也是 kubernetes 系统上运行容器化应用的资源对象。Kubernetes 集群中其余资源对象都是为 pod 这个资源对象作支撑来实现 kubernetes 管理应用服务的目的。docker
Kubernetes 集群组件主要包括主节点组件API Server、Controller Manager、Scheduler 以及子节点组件 kubelet、container Runtime(如docker)、kube-proxy 等。从与集群各组件交互角度讲述 pod 的建立、运行、销毁等生命周期,Pod 生命周期中的几种不一样状态包括pending、running、succeeded、failed、Unknown。restful
API Server 提供了集群与外部交互的接口,经过 kubectl 命令或者其余 API 客户端提交 pod spec 给 API Server 做为pod建立的起始。网络
Pod 与 API Server 交互的主要流程以下:异步
当提交建立 pod 的请求与 API Server 的交互完成以后,接下来由 scheduler 进行工做,该组件主要是完成 pod 的调度来决定 pod 具体运行在集群的哪一个节点上。注意,此处声明一点,API Server 完成任务以后,将信息写入到 etcd 中,此时 scheduler 经过 watch 机制监听到写入到 etcd 的信息而后再进行工做。函数
Scheduler 读取到写入到 etcd 中的 pod 信息,而后基于一系列规则从集群中挑选一个合适的节点来运行它,调度时主要经过三步来肯定 pod 运行节点:测试
注:若是有特殊 pod 资源须要运行在特殊节点上,此时能够经过组合节点标签以及 pod 标签和标签选择器等来实现高级调度,如 MatchInterPodAffinity、MatchNodeSelector 和 PodToleratesNodeTaints 等预选策略,他们为用户提供自定义 Pod 亲和性或反亲和性、节点亲和性以及基于污点及容忍度的调度机制。
预选策略ui
预选策略就是节点过滤器,例如 MathNodeSelector 实现的规则,以及 PodFitsResources 实现的规则等。执行预选操做时,若是不存在适合的节点,此时 pod 会一直处于 pending 状态,直到至少有一个可用节点。spa
支持的预选策略列举一下(1.10版本):rest
CheckNodeCondition
General
NoDiskConflict
PodToleratesNodeTaintsPodToleratesNodeNoExecuteTaints
CheckServiceAffinity
MaxEBsVolumeCount
MaxGCEPDVolumeCount
MaxAzureDiskVolumeCount
CheckVolumeBinding
NoVolumeZoneConflict
CheckNodeMemoryPressure
CheckNodePIDPressure
CheckNodeDiskPressure
MatchInterPodAffinity
简单介绍几种:
优选函数
经常使用优选函数:
BalancedResourceAllocation
LeaastRequstedPriority
NodePreferAvoidPodsPriority
NodeAffinityPriority
TaintTolerationPriority
InterPodAffinityPriority
SelectorSpreadPriority
NodeLabelPriority
MostRequestedPriority
ImageLoccalityPriority
此外调度器支持为每一个优选函数指定一个简单的整数值表示权重,进行节点优先级分值的计算,计算公式以下:
FinalScoreNode = (weight1 priorityFunc1) + (weight2 priorityFunc2)+ ....
列举说明几个优选函数:
对于上述节点调度中还包括一些节点亲和度:硬亲和度和软亲和性、资源亲和调度。硬亲和调度和软亲和调度以及反亲和调度、污点容忍度等,都是 pod 调度的策略,不一一详述。
当 scheduler 经过一系列策略选定 pod 运行节点以后将结果信息更新至 API Server,由 API Server 更新至 etcd 中,并由 API Server 反映调度结果,接下来由 kubelet 在所选定的节点上启动 pod。
kubelet 组件的做用不仅仅是建立 pod,另外还包括节点管理、cAdvisor 资源监控管理、容器健康检查等功能。
启动pod流程分析
kubelet 经过 API Server 监听 etcd 目录,同步 pod 列表。若是发现有新的 pod 绑定到本节点,则按照 pod 清单要求建立 pod,若是是发现 pod 被更新,则作出相应更改。
读取到 pod 的信息以后,若是是建立和修改 pod 的任务,则作以下处理:
详述pod声明周期中的重要行为
除了建立应用容器(主容器及辅助容器以外,注意,若是集群中部署了 istio,则会在 pod 启动的时候注入一个新的和 istio 相关的容器,那是另外一个美好故事的开端),还能够为 pod 对象定义其声明周期中的多种行为,如初始化容器、容器探测以及就绪性探测等。
容器生命周期的几种行为
初始化容器
初始化容器即 pod 内主容器启动以前要运行的容器,主要是作一些前置工做,初始化容器具备如下特征:
声明周期钩子函数
备注:钩子程序的执行方式有“Exec”和“HTTP”两种。
容器探测
容器探测分为存活性探测和就绪性探测容器探测是kubelet对容器健康状态进行诊断,容器探测的方式主要如下三种:
Pod终止过程
终止过程主要分为以下几个步骤:
此外 kubelet 除了启动以外,kubelet 中还有 cAdvisor,用于收集容器 CPU、内存、文件系统和网络使用状况等信息,与 prometheus 结合实现对集群内 pod 监控。
此外,除了上述三个组件在建立 pod 过程当中的交互,还有 controller-manager 来保证 pod 处于用户指望状态(即保证 pod 永远处于存活状态)等功能以及 proxy 用于集群内 pod 之间通讯等。
本文由博云研究院原创发表,转载请注明出处。