pod的生命周期

1、pod定义: pod是k8s中最小的资源管理组件,也是最小化运行容器化应用的资源管理对象。pod是一个抽象的概念,可以理解为一个或多个容器化应用的集合,通常在一个pod中运行一个容器(最常用的方式),在一个pod中可以同时运行多个容器,在一个pod中可以同时封装几个需要耦合的互相协作的容器,这些容器共享资源,也可以互相协作组成一个service单位对外提供访问。不论运行一个还是多个容器,k8s管理的都是pod而不是容器

一个pod内的容器必须都运行在同一个节点上,基于现在容器技术的要求,最常见的是一个pod运行一个容器,一个容器只运行一个进程,主要为了横向扩展,方便扩缩容,还为了解耦,一个pod内运行多个容器,耦合度太高,一旦一个进程失败,整个pod将全部失败。通过一个容器运行一个pod的方式实现解耦,基于pod可以创建多个副本,实现高可用和负载均衡,便于管理,简单直观

2、 pod内的容器共享网络资源和存储资源,由pause提供共享资源的机制

pause容器是基础容器,也称为父容器,管理pod内容器的共享操作,还管理容器的生命周期,k8s提供pause容器两大核心功能:

(1)为pod内的所有容器提供一个命名空间

(2)启动容器内的pid命名空间,每个pod中都有一个pid为1的进程(pause进程),包括分配资源、回收僵尸进程(pause进程管理每个pod内的所有进程)

注:创建pod时,先创建pause,再拉取镜像生成容器,最后形成pod

kubelet管理节点上的容器,pause管理pod内的容器

pause容器共享两种资源,网络资源和存储资源。每个pod会分配一个集群内部的唯一的IP地址,pod内的容器共享网络(pod在集群内部的IP地址和端口),pod内部的容器可以使用localhost互相通信,pod中的容器与外部通信时,从共享的资源当中进行分配。比如宿主机的端口映射

pod可以指定多个共享的volume,pod内的容器共享这些volume,volume可以实现数据的持久化,防止pod重新构建之后文件消失

3、pause容器的特点 【面试题】

(1)创建pod就会创建pause

(2)pause容器共享网络资源和存储资源

总结:

每个pod都有一个基础容器pause容器

pause容器对应的镜像属于k8s集群的一部分,创建集群就会有pause这个基础镜像

pod里面包含了一个或多个相关的容器(应用)

4、pause的作用

(1)pod内部有一组容器,挂了一个,整个pod就失效了吗?引入pause机制,代表整个容器的组的状态,可以解决对pod内部整体状态的判断

(2)pod内的容器共享IP地址,共享挂载卷,解决容器内网络通信问题和容器内文件共享问题

5、pod的分类

(1)自主式pod

特点:不会自我修复,若pod内容器进程终止或被删除或因缺少资源被驱逐,该pod无法自愈

(2)控制器管理pod

特点:可以滚动升级、自愈(自动重启)、管理pod的数量以及pod的扩缩容

6、pod的生命周期 【面试题。必问】

|---------------------------------------------|--------------------------------------------------------------|
| pending 挂起状态 | pod已被创建,但尚未被分配到运行的node节点。一直处于pending状态,会导致节点资源不够,需等待其他pod的调度 |
| running 运行状态 | pod已被分配到node节点,pod内部所有容器都已经启动,运行状态正常、稳定 |
| completed(successed) 正常退出状态 | 容器内部的进程运行完毕,正常退出,没有发生错误 |
| failed 非正常退出状态 | pod中的容器非正常退出,发生错误,需要通过查看详情和日志来定位问题 |
| unkown | 由于某些原因,k8s无法获取pod的状态 (一般是apiserver出现问题。少见) |
| terminating | 终止中,pod正在被删除,里面的容器正在终止。终止过程中,资源回收,垃圾清理以及终止过程中需要执行的命令需要一些时间 |

|---------------------------------------------------------------------------------------------------------------------|
| 创建pod的容器分类 |
| 第一步:基础容器pause |
| 第二步:初始化容器init(自定义) |
| 第三步:业务容器 |
| 注:基础容器和初始化容器全部成功启动后才启动业务容器 |

7、实验。如何自定义初始化容器以及容器创建顺序

注:①在pod启动过程中,容器按照初始化容器先启动,每个容器都必须在下一个容器启动之前成功退出

②若运行失败,会按照容器的重启策略(always、never、onfailure非正常退出重启)进行指定动作

③所有的init容器没有成功之前,pod不会进入ready状态。init容器与service无关,不能对外提供访问

④重启pod,所有的init容器一定会重新执行

⑤基于deployment创建的pod,若修改init容器的spec(参数),只限制于镜像,修改其他字段不生效

⑥每个容器的名称都唯一,不能重复

8、init容器的作用

环境变量

  1. 可以在创建的过程中为业务容器定制相关的代码和工具
  2. init容器独立于业务容器,是单独构建的镜像,对业务容器不产生任何安全影响
  3. init容器能以不同于pod内应用容器的文件系统视图、secrets权限。应用容器无法访问secrets权限

总结:

init容器提供应用容器运行之前的先决条件,提供一种阻塞机制(延迟机制)来控制应用容器的启动,只有前置条件满足才会创建pod内的应用容器

  1. pod的重启策略

|-----------|-----------------------------------------------------------------|
| pod的重启策略(基于容器的在状态) ||
| Always | 只要容器退出,总是重启,不论容器的状态码是否正常(默认策略。在deployment的yaml文件中重启策略只能是always) |
| Never | 只要容器退出,不论容器的状态码是否正常都不重启 |
| OnFailure | 只有容器状态码非0时才会重启容器,正常退出不重启 |
| 重启策略不会影响 Pod 本身的终止状态。只要 Pod 中至少有一个容器在运行,就认为 Pod 处于"正在运行"阶段。如果 Pod 中的所有容器都退出,则 Pod 会过渡到"已完成"或"失败"阶段,具体取决于最后一个容器的退出状态 ||

验证onfailure

正常退出

非正常退出

相关推荐
阿里云云原生22 分钟前
Skills Registry 公测开启:为企业打造私有的 Skill 管理中心
云原生
吃胖点儿29 分钟前
DevOps与自动化原理
云原生
GentleDevin44 分钟前
Docker 运维常用命令大全
docker·容器·运维命令
运维全栈笔记1 小时前
基于Docker的MinIO单机部署与功能测试指南
运维·docker·容器
阿里云云原生1 小时前
HiClaw 发布 v1.1.0,提供 Kubernetes 集群部署实现,支持 Hermes Worker 运行时
kubernetes
心机之蛙qee2 小时前
docker的安装(RHEL9)
运维·docker·容器
Cat_Rocky2 小时前
kubernetes ingress粗浅学习
学习·容器·kubernetes
凤舞飘伶3 小时前
windows安装docker-desk
windows·docker·容器
运维全栈笔记3 小时前
Docker一键部署Immich:自建私有云相册,照片视频备份无忧
linux·服务器·网络·docker·容器
PH = 74 小时前
K8S集群部署Dashboard
云原生·容器·kubernetes