Pod介绍
Kubernetes 工作负载概述
工作负载是在 Kubernetes 上运行的应用程序。在 Kubernetes 中,无论你的负载是由单个组件还是由多个一同工作的组件构成, 你都可以在一组 Pod 中运行它。 在 Kubernetes 中, Pod 代表的是集群上处于运行状态的一组 容器 的集合。Kubernetes Pod 遵循预定义的生命周期。 例如,当在你的集群中运行了某个 Pod,但是 Pod 所在的 节点 出现致命错误时, 所有该节点上的 Pod 的状态都会变成失败。Kubernetes 将这类失败视为最终状态: 即使该节点后来恢复正常运行,你也需要创建新的 Pod 以恢复应用。不过,为了减轻用户的使用负担,通常不需要用户直接管理每个 Pod 。 而是使用负载资源来替用户管理一组 Pod。 这些负载资源通过配置 控制器 来确保正确类型的、处于运行状态的 Pod 个数是正确的,与用户所指定的状态相一致。
内置的工作负载资源
- Deployment 和 ReplicaSet (替换原来的资源 ReplicationController)。 Deployment 很适合用来管理你的集群上的无状态应用, Deployment 中的所有 Pod 都是相互等价的,并且在需要的时候被替换。
- StatefulSet 让你能够运行一个或者多个以某种方式跟踪应用状态的 Pod。 例如,如果你的负载会将数据作持久存储,你可以运行一个 StatefulSet ,将每个 Pod 与某个 PersistentVolume 对应起来。你在 StatefulSet 中各个 Pod 内运行的代码可以将数据复制到同一 StatefulSet 中的其它 Pod 中以提高整体的服务可靠性。
- DaemonSet 定义提供节点本地支撑设施的 Pod 。这些 Pod 可能对于你的集群的运维是 非常重要的,例如作为网络链接的辅助工具或者作为网络 插件 的一部分等等。每次你向集群中添加一个新节点时,如果该节点与某 DaemonSet 的规约匹配,则控制平面会为该 DaemonSet 调度一个 Pod到该新节点上运行。
- Job 和 CronJob。 定义一些一直运行到结束并停止的任务。 Job 用来执行一次性任务,而CronJob 用来执行的根据时间规划反复运行的任务
Pod 基本概念
- 最小部署单元:Pod 是 Kubernetes 中创建和管理的最小对象
- 容器组:一个 Pod 可以包含一个或多个紧密耦合的容器
- 共享环境:Pod 中的容器共享:
- 网络命名空间(相同的 IP 和端口空间)
- 存储卷(Volumes)
- 内存/CPU 资源限制
Pod 的主要特点
- 生命周期短暂:Pod 是临时的,可以被创建、销毁和重新调度
- 原子性调度:Pod 中的所有容器总是被调度到同一个节点上
- 共享网络:Pod 内的容器通过 localhost 互相通信
- 共享存储:Pod 可以定义一组共享的存储卷
Pod 的典型使用场景
- 单容器 Pod:最常见的模式,一个 Pod 只运行一个容器
- Sidecar 模式:主容器 + 辅助容器(如日志收集器)
- 适配器模式:标准化不同容器的输出
- 大使模式:代理到外部服务的连接
Pod 多容器示例
demo-multi.yaml
yaml
apiVersion: v1
kind: Namespace
metadata:
name: demo
---
apiVersion: v1
kind: Pod
metadata:
name: demo-multi
namespace: demo
spec:
volumes:
- name: html
emptyDir: {}
containers:
- name: demo-nginx
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
- name: demo-alpine
image: alpine
command:
[
"/bin/sh",
"-c",
"while true; do date > /html/index.html; sleep 0.5; done;",
]
volumeMounts:
- name: html
mountPath: /html进入pod
bash
kubectl exec -it demo-multi -n demo -c demo-nginx/demo-alpine -- /bin/sh- -c:选择进入那个容器
Pod 生命周期
- Pending:Pod 已被系统接受,但容器尚未创建
- Running:Pod 已绑定到节点,所有容器已创建
- Succeeded:所有容器成功终止
- Failed:至少一个容器异常终止
- Unknown:无法获取 Pod 状态
Pod 管理
- 一般不直接创建 Pod:通常通过 Deployment、StatefulSet 等控制器来管理 Pod
- 临时调试 Pod:可以使用
kubectl run命令快速创建临时 Pod - 查看 Pod 信息:
kubectl get pods,kubectl describe pod <pod-name>
