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
### Kubernetes YAML 文件格式详解 #### 基本结构与字段解释 Kubernetes 中几乎所有资源对象都通过 YAML 或 JSON 文件定义,其中 YAML 是最常用的格式[^1]。下面是一个典型的 Kubernetes 资源对象的 YAML 文件基本结构: ```yaml apiVersion: v1 # API 版本号, 指定使用的API组和版本 kind: Pod # 对象种类, 如Pod、Service等 metadata: # 元数据部分, 包含名称和其他标签信息 name: my-pod # 资源的名字 spec: # 描述期望状态的具体规格 containers: # 容器列表 - name: app-container image: busybox:1.28 command: ["sh", "-c", "echo Hello Kubernetes! && sleep 3600"] ``` 此段代码展示了最基本的 `Pod` 类型资源配置文件模板。 #### TypeMeta 部分解析 TypeMeta 部分为每个 Kubernetes 资源提供了两个重要字段:`apiVersion` 和 `kind`。这两个字段帮助 Kubernetes 正确识别并处理相应的资源请求[^2]。 - **apiVersion**: 表明所用到的 API 组及其版本; - **kind**: 明确指出了当前文档代表哪种类型的 K8s 资源; 例如,在上述例子中,`apiVersion: v1` 表示使用的是核心 API 的第一个稳定版,而 `kind: Pod` 则表明这是一个 Pod 实体。 #### Metadata (元数据) Metadata 字段包含了关于资源的一些辅助性描述信息,比如名字 (`name`) 及其他自定义标签 (`labels`, `annotations`) 等。这部分内容主要用于标识唯一性和分类检索目的。 #### Spec (规范) Spec 字段是最为核心的部分之一,它规定了用户希望达到的目标状态——即所谓的“声明式配置”。这里列出了所有必要的参数设置来构建指定的对象实例。对于不同的 Kind 来说,Spec 下面的内容也会有所不同。 #### 创建与操作 Deployment 示例 为了更好地理解如何实际应用这些概念,考虑如下命令序列用于部署 Nginx 应用程序服务[^4]: ```bash kubectl create namespace jumpoint-ns # 创建命名空间jumpoint-ns kubectl apply -f nginx-deployment.yaml # 使用nginx-deployment.yaml创建Deployment kubectl get deployments -n jumpoint-ns # 查看新创建的deployment详情 kubectl get pods -n jumpoint-ns -o wide # 获取pod列表及相关细节 kubectl describe deployment -n jumpoint-ns jumpoint-web # 展开查看特定deployment的信息 ``` 以上命令集演示了一个完整的流程,从准备环境到最后验证部署成功与否的过程。 #### 验证 YAML 文件的有效性 确保编写的 YAML 文件语法正确非常重要。虽然 Kubernetes 自身能够执行一定程度上的语义校验,但在提交之前最好先利用第三方工具来进行预检以减少错误发生几率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值