4、k8s的pod详解

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 即可。

相关推荐
Zhao_yani1 小时前
k8s基础知识
云原生·容器·kubernetes
styshoo1 小时前
NVSentinel 数据流梳理
kubernetes·gpu·ai-infra·nvsentinel
zx78542 小时前
Kubernetes 生产级实战:从零部署 LNMP 架构 ECShop 商城(完整指南)
容器·架构·kubernetes
IT大白鼠3 小时前
K8S发展历史及未来展望
云原生·容器·kubernetes
weixin_439930644 小时前
Kubernetes(K8s)入门实践
云原生·容器·kubernetes·k8s
众人皆醒我独醉18 小时前
Pod 一直 Terminating,死活删不掉?三个凶手,每一个你都意想不到
面试·kubernetes
飞翔沫沫情19 小时前
K8s Alloy 采集 Pod 控制台日志
云原生·容器·kubernetes
潮起鲸落入海1 天前
Kubernetes Metric Server, Quota and Limits
容器·kubernetes
摇滚侠1 天前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 19-25
java·云原生·kubernetes
咕噜咕噜的猪大侠1 天前
《K8s 核心知识梳理:Deployment 滚动更新、JobCronJob、DaemonSet 和 Service》
云原生·容器·kubernetes