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容器的作用
环境变量
- 可以在创建的过程中为业务容器定制相关的代码和工具
- init容器独立于业务容器,是单独构建的镜像,对业务容器不产生任何安全影响
- init容器能以不同于pod内应用容器的文件系统视图、secrets权限。应用容器无法访问secrets权限
总结:
init容器提供应用容器运行之前的先决条件,提供一种阻塞机制(延迟机制)来控制应用容器的启动,只有前置条件满足才会创建pod内的应用容器
- pod的重启策略
|-----------|-----------------------------------------------------------------|
| pod的重启策略(基于容器的在状态) ||
| Always | 只要容器退出,总是重启,不论容器的状态码是否正常(默认策略。在deployment的yaml文件中重启策略只能是always) |
| Never | 只要容器退出,不论容器的状态码是否正常都不重启 |
| OnFailure | 只有容器状态码非0时才会重启容器,正常退出不重启 |
| 重启策略不会影响 Pod 本身的终止状态。只要 Pod 中至少有一个容器在运行,就认为 Pod 处于"正在运行"阶段。如果 Pod 中的所有容器都退出,则 Pod 会过渡到"已完成"或"失败"阶段,具体取决于最后一个容器的退出状态 ||
验证onfailure
正常退出
非正常退出