pod详解的相关的基础知识和初始化容器,以及私有化的镜像仓库*。
pod进阶:pod的状态,pod的探针
pod的详解:
pod是k8s集群管理的最小单位,最小的资源组件,也是最小化运行容器的资源对象。
容器运行在pod里面,一个pod里面可以有多个容器。
一个pod代表的是在k8s集群中运行的进程,k8s的大多数组件都是围绕pod来进行支撑和运行。扩展pod的可能。
控制器就是用来管理pod,绝大多的pod都是基于控制器创建的。
每个pod都有一个独立的ip地址,创建pod的时候由cni网络插件从网段中指定一个ip地址分配给pod。
pod中的多个容器也是共享这一个ip地址。
一般情况下,一个pod里面只允许一个容器。
多个容器的情况下,一个pod的容器都在一个节点上。
pause容器:可以使pod内容器共享两种资源。网络和存储
每创建一个pod都会一个pod容器
网络:pod内的所有容器共享网络空间,包括ip和端口。
pod内的容器可以直接使用localhost互相通信。
存储:pod的生命周期是有限的,容器也会随着pod的销毁而销毁,也会因为pod的重启而重启
定义pod的时候,可以创建多个数据卷和宿主机挂载,pod内的所有容器共享数据卷。
pause容器又被称为初始化容器
初始化容器:
init容器,必须在应用容器启动之前完成,必须是成功,不能失败。
特点:
1、当定义了初始化容器之后,必须是允许到成功完成为止。
2、如果在pod运行过程中,init容器失败了,k8s会一直重启这个pod,知道init容器成功为止(pod重启策略是never就不会重启)
init容器的作用:
init容器必须要先成功运行,所以和应用容器之间是有分离的。
所以在业务容器运行之前,可以为应用容器安装一些需要的工具,代码,环境等等。
3、初始化容器运行完毕之后,就结束了,后面都是和业务容器进行交互。
4、pod内每个容器的名称不能重复
5、重启pod,相当于初始化容器也会重启,也必须成功,才会进入业务容器。
用来给业务容器传参数,初始化不是必须的,根据情况来进行调整。
镜像的拉取策略:
k8s中如何拉取镜像:
pod的核心就是容器,容器必须要有镜像,k8s在拉取镜像的时候可以由用户来定拉取镜像的方式
1、Always每次创建pod都会重新拉取一次镜像(保证镜像永远是最新的)
2、Nerver pod不会主动从网络拉取镜像,只从本地拉取。
3、IfNotPresent:默认模式,只有本地没有镜像时,才会去仓库中重新拉取
拉取策略
创建本地镜像仓库
创建一个登录凭证的清单:
直接把加密信息保存到集群中,无需在输入密码
base64 -w 0:
pod的状态说明:
1、pending,所有创建的资源对象都可能pending,pending属于已经提交给了apiserver,并且保存在了etcd当中。
但是因为种种原因,资源对象无法被创建。
1)、资源不足,节点上的磁盘,内存,cpu不足,无法创建资源对象。
2)、端口被占用,尤其是在pod当中使用hostPort,直接使用了宿主机的端口。
3)、网络原因,cni插件故障,flannel或者calico网络pod有问题,无法分配ip地址给pod。
4)、无节点可以部署资源对象,集群当中没有满足部署条件的节点,节点上有污点,设置了指定部署的条件。
以上的情况,只要满足了条件,pending会自动解除。
2、ContainerCreateing,pod正在拉取镜像,镜像拉取失败,或者超时,会出现
3、imagePullBackoff,镜像拉取失败,超时,镜像名称配置错误,和仓库的密钥配置错误。
4、CrashLoopBackOff:pod内的容器已经启动了,但是以异常状态退出了,就要查看一下pod的日志。也可能是部署的时候节点资源有,但是pod内的容器运行之后,资源不足,也会导致容器异常退出。
5、complete:容器已经运行完毕,以正常状态退出,返回码是0
容器没有可持久化运行的命令,启动之后就会立刻退出。或者是用户使用了command和args,把容器的输出命令覆盖了。
6、error:pod在启动过程中发生错误,自定义执行的命令报错,挂载点不存在,configmap配置和secret,以及pv等不存在。
pod的权限不足,容器无法使用集群资源。
7、Terminating状态,表示资源对象正在被删除和回收资源的过程。
删除pod时i,会进入这个状态,有一个资源回收的过程。
特殊情况下,需要使用立刻删除,正常情况下不需要使用。
8、initialized:pod中的所有容器已经初始化完毕
9、ready 正常状态,表示pod已经部署完毕,可以使用
1/1:表示的业务容器的数量,初始化容器不再这个范围,所有的容器都是ready之后,才可以使用。
pod状态一览:
CrashLoopBackOff: 容器退出,kubelet正在将它重启
InvalidImageName: 无法解析镜像名称
ImageInspectError: 无法校验镜像
ErrImageNeverPull: 策略禁止拉取镜像
ImagePullBackOff: 正在重试拉取
RegistryUnavailable: 连接不到镜像中心
ErrImagePull: 通用的拉取镜像出错
CreateContainerConfigError: 不能创建kubelet使用的容器配置
CreateContainerError: 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError: 启动容器失败
PostStartHookError: 执行hook报错
ContainersNotInitialized: 容器没有初始化完毕
ContainersNotReady: 容器没有准备完毕
ContainerCreating: 容器创建中
PodInitializing:pod 初始化中
DockerDaemonNotReady: docker还没有完全启动
NetworkPluginNotReady: 网络插件还没有完全启动
Evicte: pod被驱赶
pod的资源限制:
pod只能使用节点资源的配额:
cpu:
数字表达:1 2 0.5
1个cpu,2个cpu,0.5半个cpu,最小0.1个cpu。
单位表达:millicores为单位
m:1000m 2000m 500m 100m
内存:ki Mi Gi Ti
在工作中,只需要limits字段,可以不写requests。