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

正常退出

非正常退出

相关推荐
阿伟*rui2 小时前
docker入门
运维·docker·容器
运维小文3 小时前
K8S资源限制之resources
云原生·k8s·资源限制·resources
it噩梦3 小时前
k8s 中传递参数给docker容器
docker·容器·kubernetes
weixin_438197384 小时前
k8s服务内容滚动升级以及常用命令介绍
linux·运维·docker·云原生·容器·kubernetes
.生产的驴5 小时前
Docker 部署Nacos 单机部署 MYSQL数据持久化
android·运维·spring boot·sql·mysql·docker·容器
dreams_dream5 小时前
Ubuntu22.04.2 k8s部署
云原生·容器·kubernetes
大新新大浩浩5 小时前
使用docker-compose单点搭建社区版seafile+onlyoffice在线word编辑平台
docker·容器·word
葡萄皮Apple5 小时前
[CKS] 使用ingress公开https服务
云原生·容器·kubernetes
优质&青年7 小时前
【云原生系列--Longhorn的部署】
云原生
Linux运维技术栈9 小时前
信创化浪潮下的ARM镜像构建指南
arm开发·云原生·kubernetes