【K8s】Pod
目录
1.请解释Pod是什么?
2. 什么是Pod的根容器?
3. 解释Pod的生命周期。
4.. Init 类型容器有什么特点,主要用途?
5. Sidecar 类型容器和Init容器的区别在哪?
6. 什么是静态Pod?
1.解释Pod是什么?
Pod 是 K8s 中可调度、可管理的最小、最基本的部署单元。
一个 Pod 代表集群中一个“进程”。它封装了一个或多个容器、存储资源、一个唯一的网络 IP 以及关于如何运行容器的选项。Pod 里的多个容器共享同一个网络命名空间(共享 IP 和端口空间)和 IPC 命名空间,因此它们可以通过 localhost 互相通信,并能共享存储卷(Volume)。这非常适合部署紧密耦合、需要高效协作的多个进程。
理解要点:K8s 不直接操作单个容器,而是操作 Pod。一个典型的场景是“主容器 + 辅助容器”(例如一个容器运行 Web 服务,另一个负责拉取日志)。
2. 什么是Pod的根容器?
在 Kubernetes 的早期设计中,这个概念被称为"pause" 容器,可以理解为 Pod 的根容器或基础容器,其主要职责是占位并维护 Pod 的资源,确保 Pod 的生命周期稳定。
(1)作用:它是最先启动的容器,负责为整个 Pod 持有网络和 IPC 命名空间。Pod 内所有其他用户容器都会加入(共享)由这个 pause 容器创建的命名空间。
(2)为什么需要它:有了这个“根容器”作为锚点,即使 Pod 内的某个业务容器崩溃或被重启,它的网络配置和共享存储等资源也不会受到影响,因为根容器始终在运行,维持着 Pod 的基础结构。
3. 如何理解Pod的生命周期。
当用户在终端执行命令创建Pod时,kubectl将用户写好的yaml文件转化为JSON格式发给API Server,API Server进行校验,检查Pod的权限、申请的资源是否符合要求,检查通过后,把Pod状态写入etcd库,容器的状态为pending。同时,API Server把Pod的信息公示,调度器、kubelet等实时关注API Server公示的信息,发现有自己的任务就迅速认领并处理,这就是list-watch机制。
调度器发现有新的Pod没有绑定节点,采用调度算法对所有节点进行检查,过滤掉资源不足、不符合要求的节点,再对符合要求的节点按照权重打分,找出一个最合适的节点和Pod绑定,并且将绑定信息发送给API Server,API Server将绑定信息更新到etcd库,同时公示。
Pod绑定节点的kubelet监测发现了分给自己的Pod,准备好网络和存储,立即拉取镜像创建容器,容器启动后,kubelet监测容器的健康状态,把结果发送给API Server,API Server更新容器的状态为running,API Server把容器最终的状态写入etcd库。
每次的处理都要写入etcd库,只要写进etcd库,系统就会想办法实现。
4.. Init 类型容器有什么特点,主要用途?
Init 容器是一种特殊的、在应用容器启动之前运行的专用容器。
Init容器有以下特点:
(1)顺序执行:一个 Pod 可以定义多个 Init 容器,它们会按顺序逐一执行,成功完成一个才能启动下一个。
(2)必须成功:所有 Init 容器都必须成功(运行后退出且退出码为0),否则 Pod 会不断重启直至成功。
(3)阻塞应用:在全部 Init 容器完成之前,Pod 会一直处于 Pending 或 Init:0/... 状态,主容器不会被启动。
Init容器主要用于环境准备、数据初始化和权限设置:
(1)环境准备:等待数据库、消息队列等依赖服务就绪。
(2)数据初始化:创建数据库 Schema、执行数据迁移脚本、预填配置文件。
(3)权限设置:修改共享卷的文件权限或所有者。
5. Sidecar 类型容器和Init容器的区别在哪?
通过一个表格从多个维度对比sidecar容器和Init容器的区别:
| 维度 | Init 容器 | Sidecar 容器 |
|---|---|---|
| 运行阶段 | 在 Pod 启动时,主容器之前运行。 | 与主容器同时运行,伴随整个生命周期。 |
| 执行模式 | 运行任务后必须退出(成功/失败)。 | 持续运行,不会退出(除非出错)。 |
| 数量 | 可以有多个,但顺序执行。 | 通常一个,与主容器并行运行。 |
| 资源占用 | 任务完成后即释放资源(CPU/内存)。 | 长期占用 Pod 的资源。 |
| 典型用途 | 初始化、等待依赖、数据准备。 | 日志收集、代理/流量转发、监控辅助、配置动态更新。 |
6. 什么是静态Pod?
静态 Pod 是直接由节点上的 kubelet 守护进程管理,而不通过 Kubernetes API Server 控制的 Pod。
(1)创建方式:你需要在节点的特定目录(通常由 --pod-manifest-path 或 --manifest-url 指定,如 /etc/kubernetes/manifests)里放一个 Pod 的 JSON/YAML 文件。kubelet 会定期扫描该目录,自动创建并维护其中的 Pod。
(2)特点:不服从调度:静态 Pod 永远只能运行在它所在的节点上,不受调度器控制。
API 只读:你可以用 kubectl get pod 看到它,但无法通过 kubectl delete 删除它
(3)主要用于部署核心控制平面组件,这也是Kubeadm 部署 Kubernetes 集群的方法——kube-apiserver、etcd、kube-controller-manager 等组件都是以静态 Pod 的形式运行在 master 节点上的。这保证了即使 API Server 宕机,这些核心组件仍能由 kubelet 维持运行。
