k8s——Pod详解

一、Pod基础概念

1.1 Pod定义

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。

一个Pod下的容器必须运行于同一节点上 。现代容器技术建议一个容器只运行一个进程,该进程在容器中PID命令空间中的进程号为1 ,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络通信,这是由于容器间的隔离机制导致,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信

Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器,又叫pause基础容器(也可称为父容器), pause就是为了管理Pod容器间的共享操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,一是它提供整个Pod的Linux命名空间的基础 。二来启用PID命名空间 ,它在每个Pod中都作为PID为1进程(init进程),并回收僵尸进程。

1.2 Pod管理方式

在Kubrenetes集群中Pod有如下两种使用方式

  • 一个Pod中运行一个容器 。"每个Pod中一个容器"的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
  • 在一个Pod中同时运行多个容器 。一个Pod中也可以同时封装几个需要紧密耦合互相协作 的容器,它们之间共享资源 。这些在同一个Pod中的容器可以互相协作成为一个service单位。比如一个容器共享文件,另一个"sidecar"容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

1.3 pod共享资源

pause容器使得Pod中的所有容器可以共享两种资源:网络存储

  • 网络:每个Pod都会被分配一个唯一的IP地址。Pod中的所有容器共享网络空间,包括IP地址和端口。Pod内部的容器可以使用localhost互相通信。Pod中的容器与外界通信时,必须分配共享网络资源(例如使用宿主机的端口映射)。
  • 存储:Pod可以指定多个共享的Volume。Pod中的所有容器都可以访问共享的Volume。Volume也可以用来持久化Pod中的存储资源,以防容器重启后文件丢失。

总结:pause管理网络命名空间、共享存储、负载调用、健康检查、生存探针和协调生命周期,目的是让port之间能够相互共享存储、共享网络

1.4 设计pod的用意

  • 在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了 那么引入与业务无关的Pause容器作为Pod的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。
  • Pod里的多个应用容器共享Pause容器的IP,共享Pause容器挂载的Volume 。这样解决了应用容器之间的通信问题 以及文件共享问题

1.5 pod分类

  • 自主式/静态pod:不被控制器管理的pod,没有自愈能力,一旦挂掉不会被重新拉起,而且副本数量不会因为达不到期望值而创建新的pod,即数据保存在节点上,一旦挂掉直接结束
  • 控制器管理的pod:被控制器管理的pod有自愈能力,一旦pod挂掉会被重新拉起,而且副本数量会因为达不到期望值而创建新的pod。简而言之,pod出现问题(生命周期删除、故障等)会自动重新拉起新的pod

1.6 pod容器分类

  • 基础容器(infrastructure container)

每次创建Pod时候就会创建,运行的每一个Pod都有一个pause-amd64的基础容器自动会运行,对于用户是透明的。

docker ps -a------进行docker容器的查看

  • 初始化容器(initcontainers)

阻塞或者延迟应用容器的启动,可以为应用容器事先提供好运行环境和工具。多个init容器时是串行启动,每个init容器都必须在下一个init容器启动前完成启动和退出

  • 应用容器(Maincontainer)

在所有init容器启动和退出后应用容器才会启动而且是并行启动的应用,提供业务的程序业务

1.7 示例------启动两个init容器

1.7.1 在opt下创建demo文件夹

1.7.2 编辑demo1

官网示例:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/

1.7.3 启动服务并查看pod

查看pod后发现init为0/2

1.7.4 解决问题

1.7.4.1 过滤出myapp
1.7.4.2 查看pod详细信息

kubectl describe pod myapp-pod

1.7.4.3 查看日志信息
1.7.4.4 查看系统信息和服务

发现服务下没有,需要创建一个server

1.7.4.5 编辑svc-demo1文件
1.7.4.6 启动文件

启动文件后,再次查看pod有相应服务

1.7.4.7 查看pod详细信息

发现init-mydb如上方的操作方式一致

kubectl describe pod myapp-pod

1.7.4.8 查看日志信息

kubectl logs myapp-pod -c init-myservice

1.7.4.9 编辑svc-demo1文件
1.7.4.10 执行文件

执行文件后,需要等pod创建完

特别说明:

  • 在Pod启动过程中,Init容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。
  • 如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。然而,如果Pod的restartPolicy设置为Always,Init容器失败时会使用RestartPolicy策略。
  • 在所有的Init容器没有成功之前,Pod将不会变成Ready状态。Init容器的端口将不会在Service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true。
  • 如果Pod重启,所有Init容器必须重新执行。
  • 对Init容器spec的修改被限制在容器image字段,修改其他字段都不会生效。更改Init容器的image字段,等价于重启该Pod。
  • Init容器具有应用容器的所有字段。除了readinessProbe,因为Init容器无法定义不同于完成(completion)的就绪(readiness)之外的其他状态。这会在验证过程中强制执行。
  • 在Pod中的每个app和Init容器的名称必须唯一;与任何其它容器共享同一个名称,会在验证时抛出错误。

1.8 镜像拉取策略

Pod的核心是运行容器,必须指定容器引擎,比如Docker,启动容器时,需要拉取镜像,k8s的镜像拉取策略可以由用户指定,通常分为三类:

  • IfNotPresent:优先使用本地已存在的镜像,如本地没有则从仓库去拉取镜像
  • Always:总是从仓库拉取镜像,无论本地是否已存在镜像
  • Never:总是不从仓库拉取镜像,仅使用本地镜像

注意:

image nginx:latest或nginx 镜像的标签为latest或者无标签时,默认拉取镜像策略为always

nginx:1.14 镜像的标签为非latest时,默认的镜像为获取策略为IfNotPresent

1.8.1 实例一

官方示例:https://kubernetes.io/docs/concepts/containers/images

1.8.1.1 编辑demo2
1.8.1.2 执行demo2并查看pod
1.8.1.3 查看pod详细信息

kubectl describe pod myapp-pod

1.8.1.4 再次查看pod
1.8.1.5 过滤出restart

1.8.2 示例二

1.8.2.1 编辑demo2并执行,同时查看pod
1.8.2.2 查看pod详细信息

kubectl describe pod myapp-pod

1.8.3 示例三

1.8.3.1 编辑demo2并执行
1.8.3.2 查看日志信息

查看pod详细信息

1.8.3.3 查看pod

1.8.4 示例四

编辑demo2并执行,同时查看过滤出镜像的pod

1.9 重启策略(restartPolicy)

pod容器重启策略(restartPolicy)三种和container在同一层绑定。同时镜像下拉策略也分为三种:

  • Always:容器退出时总是重启容器,不管返回状态码如何,默认的Port重启策略
  • OnFailure:仅在容器异常退出时(返回状态码非0时)会重启策略
  • Never:容器退出时从不重启容器,不管返回状态如何

1.9.1 实例一

1.9.1.1 编辑并执行demo3,查看pod状态
1.9.1.2 查看重启策略

1.9.2 示例二

1.9.2.1 编辑并执行demo3,查看pod状态
1.9.2.2 再次查看pod

1.9.3 示例三

1.9.3.1 编辑并执行demo3
1.9.3.2 查看pod状态

1.9.4 示例四

1.9.4.1 编辑并启动demo3
1.9.4.2 查看pod状态
相关推荐
落日漫游11 分钟前
dockercompose和k8s区别
docker·kubernetes
user4840232542391 小时前
使用自定义snapshotter修改容器的rootfs路径
云原生
资源开发与学习1 小时前
kubernetes核心概念 Service
kubernetes
lllsure2 小时前
【Docker】存储卷
运维·docker·容器
有谁看见我的剑了?2 小时前
k8s-容器探针和生命周期回调学习
学习·容器·kubernetes
骆驼10243 小时前
40分钟的Docker实战攻略
云原生·eureka
纤瘦的鲸鱼3 小时前
Docker 从入门到实践:容器化技术核心指南
java·docker·容器
Rancher社区4 小时前
Rancher 社区双周报|聚焦 Harvester 新特性:网络、存储与虚拟化全面升级
kubernetes
阿里云云原生4 小时前
阿里 Qoder 新升级,Repo Wiki 支持共享、编辑和导出
云原生