深入理解Pod的核心知识

简介: 【4月更文挑战第17天】Pod是Kubernetes中的基本执行单元,代表一个或多个紧密耦合的容器,共享存储/网络资源。

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使用率。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
负载均衡 网络协议 安全
负载均衡4层和7层区别
所谓四层就是基于IP+端口的负载均衡;七层就是基于URL等应用层信息的负载均衡
|
SQL 安全 关系型数据库
精通MySQL:核心功能、性能优化与安全管理
h3> 第一章:MySQL入门 1.1 MySQL概述 介绍MySQL的历史、版本发展及其在当前数据库领域的重要地位
|
开发框架 前端开发 JavaScript
使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面
使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面
视频结构化——原子能力解析
视频结构化是指对视频数据进行结构化处理,通过对原视频进行智能分析,提取出视频中的关键信息,以标签文本的形式进行描述。
834 0
视频结构化——原子能力解析
|
运维 Kubernetes API
Kubernetes operator 模式开发实践
0. 前言 近日我们在开发符合我们业务自身需求的微服务平台时,使用了 Kubernetes 的 Operator Pattern 来实现其中的运维系统,在本文,我们将实现过程中积累的主要知识点和技术细节做了一个整理。
3011 112
|
存储 缓存 Kubernetes
聊一聊K8s Operator在日志采集器中的应用
Kubernetes提供了自定义资源(Custom Resource)和K8s Operator为应用程序的部署提供扩展。本文调研了K8s Operator在各个日志采集器中的应用场景与架构。
1022 0
|
存储 运维 Shell
运维面试题库之Ansible
运维面试题库之Ansible
4976 0
|
JavaScript Linux
Linux安装Node.js(图文解说详细版)
Linux安装Node.js(图文解说详细版)
Linux安装Node.js(图文解说详细版)
|
移动开发 缓存 前端开发
DingTalk「开发者说」第8期 钉钉微应用开发实战
DingTalk「开发者说」是钉钉开发者最新上线的开发者栏目,联合阿里云ACE团队,分享钉应用开发解决方案、技术更新、实战技巧,致力于成为钉钉与开发者的桥梁与纽带,让更多的钉钉开发者传播技术、提升技能、分享观点。在数字化变革的时代,“云钉一体”“钉钉全面开放”战略之后,希望钉钉技术可以持续激发开发者的创造力,为组织数字化赋能。 本篇介绍了钉钉H5微应用的概念、原理及开发实战。
3206 2
DingTalk「开发者说」第8期 钉钉微应用开发实战
|
安全 Linux 程序员
使用阿里云服务器部署Code-server
本人是iPad党,实在不想感受游戏本的重量,但是又要用到C++,Go语言开发,于是想起了GitHub上Code-server的项目,正巧有个服务器,所以就开始干了!