4、k8s的pod详解

发布于:2025-02-12 ⋅ 阅读:(8) ⋅ 点赞:(0)

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当中。但是因为种种原因,资源对象无法被创建。

  1. 资源不足,节点上的磁盘、内存、cpu不足,无法创建资源对象。
  2. 端口被占用,尤其是在pod当中使用hostport,直接使用了宿主机的端口。
  3. 网络原因,cni插件故障,flannel或者calico网络pod有问题,无法分配IP地址给pod。
  4. 无节点可以部署资源对象,集群当中没有满足部署条件的节点,节点上有污点,设置了指定部署的条件。

以上的情况,可能会导致pending状态,只要满足了条件,pending会自动解除。

2、ContainerCreateing:pod正在拉取镜像,镜像拉取失败,或者超时,会出现imagePullBackoff,表示镜像拉取失败、超时,镜像名称配置错误,和仓库的密钥配置错误。

3、CrashLoopBcakOff:pod内的容器已经启动,但是以异常状态退出了,就要查看下pod的日志。也可能是部署的时候节点资源有,但是pod内的容器运行之后,资源不足,也会导致容器异常退出。

4、comolete:容器已经运行完毕,以正常状态退出,返回码是0,可能原因如下:

  1. 容器没有可持久化运行的命令,启动之后就会立刻退出。
  2. 用户使用了command和args,把容器的输出命令覆盖了。

5、error:pod在启动的过程中发送错误,可能原因如下:

  1. 自定义执行的命令报错
  2. 挂载点不存在
  3. configmap配置和secret(加密配置),以及pv(自动挂载配置)等不存在。
  4. 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 即可。


网站公告

今日签到

点亮在社区的每一天
去签到