关于Pod的基础知识概览

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 【6月更文挑战第19天】Pod是Kubernetes的基本执行单元,是最小部署和管理的粒度,包含一个或多个共享网络和存储的容器,常比喻为豆荚中的豆子。Pod中的容器共享IP和端口,便于协作,支持Docker等容器运行时。

Pod就是豆荚里面的小豆子,形象地比喻pod在k8s里面的逻辑状态,Pod是k8s中可部署创建管理的最小单元,一个Pod(就像一个豌豆荚)是一个组,这个组中包含一个或多个容器(如Docker容器),具有共享存储/网络,以及如何运行容器的规范。


Pod的内容总是同时定位和同时调度,并在共享上下文中运行。Pod为特定于应用程序的“逻辑主机”建立模型,它包含一个或多个相对紧密耦合的应用程序容器。在容器之前的世界中,在相同的物理或虚拟机上执行则意味着在相同的逻辑主机上执行。

1、Pod是什么

Pod是Kubernetes应用程序的基本执行单元,是创建或部署的Kubernetes对象模型中最小、最简单的单元。Pod代表在集群上运行的进程。


一个Pod封装了一个应用程序的容器(在某些情况下是多个容器)、存储资源、一个唯一的网络IP和控制容器如何运行的选项。


一个Pod代表一个部署单元,即Kubernetes中的应用程序的一个单个实例,它可能由单个容器或少量紧密耦合且共享资源的容器组成。


Docker是Kubernetes Pod中最常用的容器运行时,但是Pods也支持其他容器运行时。


Pod是Kubernetes应用程序的基本执行单元,是创建或部署的Kubernetes对象模型中最小、最简单的单元。Pod代表在集群上运行的进程。


Pod中的容器共享一个IP地址和端口空间,并且可以通过localhost相互查找。它们还可以使用SystemV信号量或POSIX共享内存等标准进程间通信进行通信。不同的Pods中的容器拥有不同的IP地址,没有特殊配置的情况下是不能通过IPC进行通信的。这些容器通常通过Pod IP地址彼此通信。


Pod中的应用程序也可以访问共享volumes,这些共享volumes被定义为Pod的一部分,可以安装到每个应用程序的文件系统中。


与单个应用程序容器一样,Pods被认为是相对短暂的(而不是持久的)实体。正如在Pod生命周期中所讨论的,创建Pod,分配唯一ID(UID),并将其调度到节点,直到终止(根据重启策略)或删除。如果一个节点死亡,那么在超时之后,该节点的Pods将被删除。给定的Pod(由UID定义)不会“重新调度”到一个新节点;相反,它可以被一个相同的Pod替换,如果需要,甚至可以使用相同的名称,但是要使用一个新的UID。


如果Pod被删除,那么与之相关联的资源都会被销毁,并在必要时重新创建。


Pods是一个模型,这种模型就是将多个协作流程内聚成一个服务。它们通过提供比其组成应用程序集更高级别的抽象来简化应用程序部署和管理。Pods可以作为部署、水平扩展和副本的单元。在Pods中,托管(协同调度)、共享命运(如终止)、协调副本、资源共享和依赖项管理都是自动处理的。


2、Pod的基本用法

Pod在Kubernetes集群中主要有两种使用方式。

  • 运行一个单独的容器:这是最常用的方式;在这种情况下,可以认为一个Pod封装了一个单独的容器,Kubernetes是对Pod进行管理,而不是直接对容器进行管理。
  • 运行耦合度高的多个容器:Pod也可能包含多个容器,这些容器之间关联紧密,需要共享资源。将多个容器添加到单个Pod的主要原因是应用可能由一个主进程和一个或多个辅助进程组成。在实践中,把一个进程放到一个容器中运行是最好的。


首先,静态Pod直接由特定的节点上的kubelet进程来管理,不通过master节点上的apiserver,无法与人们常用的控制器Deployment或者DaemonSet进行关联,它由kubulet进程自己来监控,当Pod崩溃时重启该Pod,kubelet也无法对它们进行健康检查。


静态Pod始终绑定在某一个kubelet上,并且始终运行在同一个节点上。kubelet会自动为每一个静态Pod在Kubernetes的apiserver上创建一个镜像Pod(Mirror Pod),因此可以在apiserver中查询到该Pod,但是不能通过apiserver进行控制和删除。


3、Pod生命周期和重启策略

1)Pod状态

  • Pending:API Server已经创建该Pod,但在Pod内还有一个或多个容器的镜像还没被创建,包括正在下载镜像的过程。
  • Running:Pod内所有的容器均已创建,且至少有一个容器处于运行状态,正在启动状态或正在重启状态。
  • Succeeded:Pod内所有容器均已成功执行后退出,且不会重启。
  • Unknow:由于某种原因无法获取该Pod状态,可能由于网络通信不畅导致。


2)Pod重启策略

Pod重启策略(RestartPolicy)应用于Pod内的所有容器,并且在Pod所处的Node上由kubelet进行判断和重启操作。当某个容器异常退出或健康检查失败时,kubelet将根据RestartPolicy的设置来进行相应的操作。Pod的重启策略包括Always(默认)、OnFailure和Never。

  • Always:当容器失败时,由kubelet自动重启该容器。
  • OnFailure:当容器终止运行且退出码不为0时,由kubelet重启该容器。
  • Never:不论容器运行状态如何,kubelet都不会重启该容器。


kubelet重启失效容器的时间间隔以sync-frequnecy乘以2n来计算,如1、2、4、8倍等,最长延迟5min,并且在重启后10min重置该时间。

  • RC和DaemonSet:必须设置为Always,需要保证该容器持续运行。
  • Job:OnFailure或Never,确保容器执行完后不会再运行。
  • Kubelet:在Pod失效时自动重启它,不论将RestartPolicy设置为何值,也不会对Pod进行健康检查。


4、Pod的健康检查

Kubernetes对Pod的健康检查可以通过两类探针来检查:LivenessProbe和ReadinessProbe。

  • LivenessProbe探针:用于判断容器是否存活(Running状态),如果LivenessProbe探测到容器不健康,则kubelet将杀死该容器,并根据容器的重启策略进行相应的处理。如果一个容器不包括LivenessProbe探针,那么kubelet则会认为该容器的LivenessProbe探针返回的结果永远是success。
  • ReadinessProbe探针:用于判断容器是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。对于被Service管理的Pod,Service与Pod Endpoint的关联关系也将基于Pod是否Reday进行设置。如果在运行过程中Ready变为False,则系统自动将其从Service的后端Endpoint列表中隔离出去,然后再把恢复到Ready状态的Pod加入到Endpoint列表。这样可以保证客户端再次访问Service时不会被转发到不可用的Pod实例上。


5、Pod的升级和回滚

在Deployment的定义中,可以通过spec.strategy指定Pod更新的策略,目前支持两种策略:Recreate(重建)和RollingUpdate(滚动更新),默认值为RollingUpdate。

有时(如新的Deployment不稳定时)用户可能需要将Deployment回滚到旧版本。默认情况下,所有Deployment的发布历史记录都被保留在系统中,以便于用户随时进行回滚(可以配置历史记录数量)。


6、Pod的扩容和缩容

Kubernetes对Pod的扩容和缩容操作提供了手动和自动两种模式,手动模式通过执行kubectl scale命令对一个Deployment/RC进行Pod副本数量的设置,即可一键完成。自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。


从Kubernetes v1.1版本开始,新增了一个名为Horizontal Pod Autoscaler(HPA)的控制器,用于实现基于CPU使用率进行自动Pod扩容和缩容的功能。HPA控制器基于Master的kube-controller-manager服务启动参数--horizontal-pod autoscaler-sync-period定义的时长(默认为30秒),周期性地检测目标Pod的CPU使用率,并在满足条件时对Deployment/RC或Deployment中的Pod副本数量进行调整,以符合用户定义的平均Pod CPU使用率。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5月前
|
Kubernetes 监控 调度
Kubernetes Pod调度:从基础到高级实战技巧
Kubernetes Pod调度:从基础到高级实战技巧
914 0
|
5月前
|
Kubernetes Perl 容器
k8s学习-ReplicationController 、ReplicaSet(工作原理、模板、实战)
k8s学习-ReplicationController 、ReplicaSet(工作原理、模板、实战)
69 0
|
5月前
|
Web App开发 Kubernetes 数据可视化
Kubernetes Dashboard 可视化插件部署 博主亲自实践可用
Kubernetes Dashboard 可视化插件部署 博主亲自实践可用
109 0
|
5月前
|
Prometheus Kubernetes 监控
|
5月前
|
存储 Kubernetes 安全
Kubernetes Pod配置:从基础到高级实战技巧
Kubernetes Pod配置:从基础到高级实战技巧
286 0
|
10月前
|
Kubernetes 固态存储 调度
k8s教程(pod篇)-调度概述
k8s教程(pod篇)-调度概述
71 0
|
监控 Kubernetes Perl
Kubernetes版快速入门的实验报告-9
Kubernetes版快速入门的实验报告-9
107 0
Kubernetes版快速入门的实验报告-9
|
Kubernetes 容器
Kubernetes版快速入门的实验报告-6
Kubernetes版快速入门的实验报告-6
141 0
Kubernetes版快速入门的实验报告-6
|
Web App开发 Kubernetes 负载均衡
阿里云容器服务Kubernetes版快速入门 详情笔记
阿里云容器服务Kubernetes版快速入门 详情笔记
阿里云容器服务Kubernetes版快速入门 详情笔记
|
监控 Kubernetes Perl
Kubernetes版快速入门的实验报告-8
Kubernetes版快速入门的实验报告-8
93 0
Kubernetes版快速入门的实验报告-8
下一篇
无影云桌面