pod概念
pod是k8s集群管理的最小单位,最小的资源组件,也是最小化运行容器的资源对象。
容器运行在pod里面,一个pod里面可以有多个容器。一般情况下,一个pod里面只运行一个容器。多个容器的情况下,一个pod内的容器都在一个节点上。
一个pod代表的是k8s集群中运行的进程,k8s的大多数组件都是围绕pod来进行支撑和运行。扩展pod的功能。
控制器就是用来管理pod,绝大多的pod都是基于控制器创建的。
每个pod都有一个独立的IP地址,创建pod的时候是由cni网络插件从网段中指定一个IP地址分配给pod。pod中的多个容器也是共享这一个IP地址。
pause容器:可以使pod内的容器共享两种资源,分别是网络和存储。每创建一个pod都会有pause容器。pause容器又被称为初始化容器。
- 网络:pod内的所有容器共享网络空间,包括IP和端口。pod的容器可以直接使用localhost互相通信。
- 存储:pod的生命周期是有限的,容器也会随着pod的销毁而销毁,也会因为pod的重启而重启。定义pod的时候,可以创建多个数据卷和宿主机挂载,pod内的所有容器共享数据卷。
初始化容器
init容器,必须在应用容器启动之前完成,必须是成功,不能失败。
init容器的作用:
1、init容器必须要先成功运行,所以和应用容器之间是有分离的。
2、在业务容器运行之前,可以为应用容器安装一些需要的工具,代码,环境等等。
3、工作中,主要用于给业务容器传参,初始化不是必须的,根据情况来进行调整。
特点:
1、当定义了初始化容器之后,必须是运行到成功完成为止。
2、如果在pod运行过程中,init容器失败了,k8s会一直重启这个pod,直到init容器成功为止(pod重启策略是never就不会重启)。
3、初始化容器运行完毕之后就结束了,后面都是和业务容器进行交互。
4、pod内每个容器的名称不能重复
5、重启pod,相当于初始化容器也会重启,也必需成功才会进入业务容器。
如下面这个示例中:
业务容器my-app1在运行之前,会先运行两个初始化容器my-service和my-db,并执行command的命令。并且初始化容器和主容器可以共享同一个卷share-date。
- Init状态表示正在进行两个初始化容器任务,完成之后才能进行业务容器。
镜像的拉取策略
k8s中如何拉取镜像
pod的核心就是容器,容器必须要有镜像,k8s在拉取镜像的时候可由用户指定拉取镜像的方式。
1、Always:每次创建pod都会重新拉取一次镜像(保证镜像永远是最新的)。
2、Nerver:pod不会主动从网络拉取镜像,只从本地拉取,本地有就拉,没有就报错。
3、IfNotPresent:默认模式,只有本地没有镜像时,才会去仓库中重新拉取。
设置拉取策略如下
本地镜像仓库
创建本地镜像仓库需要compose和harbor两个组件,创建步骤和从镜像仓库上传和下载镜像步骤与docker一样。
k8s集群从镜像仓库上传和下载镜像需要登录仓库账号密码,在master节点不太方便实现,所以需要创建一个加密登录凭据。
创建一个加密登录凭据的清单:直接把加密信息保存在集群中,无需再输入账号密码。
1、首先在镜像仓库创建端生成密钥对
- base64 -w 0:把标准输出的内容按照base64的格式进行编码,-w 0:表示显示在一行不换行。
2、创建k8s集群master端创建secret.yml文件
3、创建pod的yml文件
pod的状态说明
1、pending:所有创建的资源对象都可能pengding,pengding属于已经提交给了apiserver,并且保存在了etcd当中。但是因为种种原因,资源对象无法被创建。
- 资源不足,节点上的磁盘、内存、cpu不足,无法创建资源对象。
- 端口被占用,尤其是在pod当中使用hostport,直接使用了宿主机的端口。
- 网络原因,cni插件故障,flannel或者calico网络pod有问题,无法分配IP地址给pod。
- 无节点可以部署资源对象,集群当中没有满足部署条件的节点,节点上有污点,设置了指定部署的条件。
以上的情况,可能会导致pending状态,只要满足了条件,pending会自动解除。
2、ContainerCreateing:pod正在拉取镜像,镜像拉取失败,或者超时,会出现imagePullBackoff,表示镜像拉取失败、超时,镜像名称配置错误,和仓库的密钥配置错误。
3、CrashLoopBcakOff:pod内的容器已经启动,但是以异常状态退出了,就要查看下pod的日志。也可能是部署的时候节点资源有,但是pod内的容器运行之后,资源不足,也会导致容器异常退出。
4、comolete:容器已经运行完毕,以正常状态退出,返回码是0,可能原因如下:
- 容器没有可持久化运行的命令,启动之后就会立刻退出。
- 用户使用了command和args,把容器的输出命令覆盖了。
5、error:pod在启动的过程中发送错误,可能原因如下:
- 自定义执行的命令报错
- 挂载点不存在
- configmap配置和secret(加密配置),以及pv(自动挂载配置)等不存在。
- pod的权限不足,容器无法使用集群资源。
6、Terminating:表示资源对象正在被删除和回收资源的过程。删除pod时,会进入这个状态,有一个资源回收的过程。
特殊情况下,需要使用立刻删除,正常情况下不需要使用。
7、initialized:pod中的所有容器已经初始化完毕
8、ready:正常状态,表名pod已经部署完毕,可以使用。1/1:表示的业务容器的数量,初始化容器不再这个范围,所有的容器都是ready之后,才可以使用。
pod的资源限制
pod只能使用节点资源的配额:
cpu
数字表达:1(1个cpu)、2(2个cpu)、0.5(半个cpu)、0.1(0.1个cpu)
单位表达:1000m(1个cpu)、2000m、500m、100m(以millicores为单位)
内存:ki、Mi、Gi、Ti
工作中创建有容器必须要有资源限制,通常只需要硬限制 limit 即可。