一、Pod的分类
自主式Pod :
控制器管理的Pod:Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。每个Pod都有一个特殊的被称为“根容器”的Pause容器。
Pod与controllers的关系
• controllers:在集群上管理和运行容器的对象
• 通过label-selector相关联
• Pod通过控制器实现应用的运维,如伸缩,升级等
二、Pod容器分类
• Infrastructure Container:基础容器 • 维护整个Pod网络空间
• InitContainers:初始化容器 • 先于业务容器开始执行
• Containers:业务容器 • 并行启动
三、Pod存活性探测(健康检查)
Probe有以下两种类型:
livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。
readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。
Probe支持以下三种检查方法:
httpGet 发送HTTP请求,返回200-400范围状态码为成功。
exec 执行Shell命令返回状态码是0为成功。
tcpSocket
发起TCP Socket建立成功。
四、Pod的资源限制
Pod和Container的资源请求和限制:
• spec.containers[].resources.limits.cpu
• spec.containers[].resources.limits.memory
• spec.containers[].resources.requests.cpu
• spec.containers[].resources.requests.memory
五、Pod资源调度
在调度的过程当中有3个阶段:节点预选、节点优选、节点选定,从而筛选出最佳的节点。
节点预选:基于一系列的预选规则对每个节点进行检查,将那些不符合条件的节点过滤,从而完成节点的预选
节点优选:对预选出的节点进行优先级排序,以便选出最合适运行Pod对象的节点
节点选定:从优先级排序结果中挑选出优先级最高的节点运行Pod,当这类节点多于1个时,则进行随机选择
当我们有需求要将某些Pod资源运行在特定的节点上时,我们可以通过组合节点标签,以及Pod标签或标签选择器来匹配特定的预选策略并完成调度,如MatchInterPodAfinity、MatchNodeSelector、PodToleratesNodeTaints等预选策略,这些策略常用于为用户提供自定义Pod亲和性或反亲和性、节点亲和性以及基于污点及容忍度的调度机制。
六、Pod的控制器Controllers
• Deployment : 无状态应用部署
• StatefulSet : 有状态应用部署
• DaemonSet : 确保所有Node运行同一个Pod
2.Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
Deployment为Pod和Replica Set(下一代Replication Controller)提供声明式更新。
只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。也可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
3.DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
特性:服务是无状态的
服务必须是守护进程
DaemonSet确保全部(或者一些)Node上运行一个Pod的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
Deployment
• 部署无状态应用
• 管理Pod和ReplicaSet
• 具有上线部署、副本设定、滚动升级、回滚等功能 • 提供声明式更新,例如只更新一个新的Image
应用场景:Web服务
SatefulSet
• 部署有状态应用
• 解决Pod独立生命周期,保持Pod启动顺序和唯一性
1. 稳定,唯一的网络标识符,持久存储
2. 有序,优雅的部署和扩展、删除和终止
3. 有序,滚动更新
应用场景:数据库
SatefulSet
StatefulSet与Deployment区别:有身份的! 身份三要素:
• 域名
• 主机名
• 存储(PVC)
Headless Service(无头服务)用于为Pod资源标识符生成可解析的DNS记录。
volumeClaimTemplates (存储卷申请模板)基于静态或动态PV供给方式为Pod资源提供专有的固定存储。
StatefulSet,用于管控Pod资源。
有状态集群服务的两个需求,一个是存储需求。另一个是集群需求 。
对存储需求,Kubernetes的解决方案是Volume、Persistent Volume 。对PV,除了手动创建PV池外,还可以通过Storage Class来让存储系统自动创建。
对集群需求,Kubernetes的解决方案是Pet Set。Pet Set 又通过Init Container来做集群初始化,通过Headless Service来为集群成员提供稳定 的网络身份。