一、Pod基本概念
- 最小编排单位:Pod是Kubernetes项目中的最小编排单位,而非容器。容器(Container)是Pod属性中的一个字段。
- 设计目的:Pod的设计旨在模拟传统部署环境中的“虚拟机”角色,以平滑用户从传统环境(虚拟机环境)向Kubernetes(容器环境)的迁移。
二、Pod与容器的属性区分
- Pod级别属性:
- 调度、网络、存储、安全相关属性,描述的是“机器”整体。
- 例如:网卡配置(网络定义)、磁盘配置(存储定义)、防火墙配置(安全定义)、调度节点(通过NodeSelector或NodeName指定)。
- 与Linux Namespace相关的属性也是Pod级别,因为Pod内的容器尽可能多地共享Linux Namespace。
- 容器级别属性:
- 构成Kubernetes项目中Container的主要字段,如镜像(Image)、启动命令(Command)、工作目录(workingDir)、端口(Ports)、挂载卷(volumeMounts)。
- 特定属性如ImagePullPolicy(镜像拉取策略)、Lifecycle(生命周期钩子)也值得关注。
三、Pod重要字段
- NodeSelector:用于将Pod与Node绑定。
- NodeName:指定Pod运行的节点,一般由调度器设置,用户也可在测试或调试时设置。
- HostAliases:定义Pod的/etc/hosts文件内容。
- shareProcessNamespace:使Pod内的容器共享PID Namespace。
- hostNetwork、hostIPC、hostPID:使Pod内的容器共享宿主机的Network、IPC和PID Namespace。
四、Pod生命周期与状态
- 生命周期变化:主要体现在Pod API对象的Status部分,特别是pod.status.phase字段。
- 状态类型:
- Pending:Pod已提交给Kubernetes,但部分容器因某种原因不能顺利创建(如调度不成功)。
- Running:Pod已调度成功,与具体节点绑定,且至少有一个容器正在运行。
- Succeeded:Pod内所有容器都正常运行完毕并退出,常见于一次性任务。
- Failed:Pod内至少有一个容器以非正常状态退出。
- Unknown:Pod状态无法持续被kubelet汇报给kube-apiserver,可能是主从节点间通信问题。
- Conditions:进一步细分Pod状态的原因,如PodScheduled、Ready、Initialized、Unschedulable。
- Ready状态:意味着Pod不仅已正常启动(Running状态),且已可以对外提供服务。
五、应用停止服务但Pod状态为Running的例子
- 程序本身有bug,返回错误状态码。
- 程序因内存问题僵死,无响应但进程仍在。
- Dockerfile不规范,应用程序非主进程。
- 程序出现死循环。
六、其他注意事项
- Pod只会监控容器状态,不会监控容器内程序的运行状态。
- 优雅停机可通过prestop hook实现。
- ImagePullPolicy的默认值在不同Kubernetes版本中可能有所不同,需参考官方文档。