一、对Pod的介绍
1.1 什么是Pod
它是一个或多个容器的集合,又称为容器集。它是Kubernetes调度、部署、运行应用的最小单元(原子单元,即不可分割的整体)。
Pod内封装的内容:可被其内部多个容器共享的存储资源、网络环境等。
Pod内的“基础设施容器”Pause容器事先创建可被各个应用容器共享的基础环境,默认共享network、IPC(进程间通信)、UTS名称空间给各容器。PID名称空间也可以共享,但需要用户手动定义。但Mount、PID和USER仍隔离。
1.2 Pod的组成形式
- 单容器Pod:仅含有单个容器。
- 多容器Pod:含有多个具有“超亲密关系”的容器。往往运行于同一Node节点。
二、Pod资源规范的基础框架
一个简单的Pod定义,只需为其指定一个要运行的容器即可。以下通过一个Pod资源示例来说明。
vim pod-demo.yml
apiVersion: v1
kind: Pod
metadata:
#pod标识名,在名称空间中必须唯一
name: pod-demo
#该Pod所属的名称空间,省略时使用默认名称空间default
namespace: default
spec:
#定义容器,它是一个对象列表,可包括多个容器的定义,至少有一个
containers:
#容器名,必选字段,在Pod中必须唯一
- name: demo
#创建容器时使用的镜像
image: ikubernetes/demoapp:v1.0
但是手写一个Pod配置文件通常比较麻烦,易出错。可以生成Pod的资源配置文件框架。
#语法
kubectl run NAME --image=image [--env="key=value"] [--port=port]
[--dry-run=server|client] [--command] -- [COMMAND] [args...]
其中--dry-run=client表示不会真正运行起来(即不发送到apiserver),只是生成一个基本的yml模板,根据该模板来修改。
#示例
kubectl run demoapp --image=ikubernetes/demoapp:v1.0 --restart=Never --port=80
--dry-run=client -o yaml > demoapp-02.yaml
三、了解Pod的运行情况
打印Pod的完整资源规范
#语法
kubectl get TYPE NAME -o yaml|json
#示例
kubectl get pods pod-demo -o yaml|json
打印Pod资源的详细状态。其中Events字段所显示的该资源对象所发生的事件信息需要特别关注(尤其排错的时候)。
#语法
kubectl describe TYPE NAME
#示例
kubectl describe pods pod-demo
获取Pod中容器的日志
kubectl logs [-f] [-p]
(POD | TYPE/NAME) [-c CONTAINER]
下图展现了Events字段中pod所经历的事件信息
1st. 将pod调度到K8S-Node1节点
2nd. 在对应节点拉取ikubernetes/demoapp:v1.0镜像
3rd. 创建容器
4th. 启动容器
关于镜像下载策略imagePullPolicy的说明:
- IfNotPresent: 在镜像标签不是latest时,当前节点存在相关的Image时,就直接使用;否则,就去pull image;若镜像标签为latest,则无论如何都会去pull image;
- Always:无论当前节点是否存在相关的Image,都要进行pull image
- Never:无论当前节点是否存在相关的Image,都不执行pull image
四、Pod的相位
Pod的相位(phase)是Pod在其生命周期中的简单宏观概述。Pod对象总是应该处于其生命进程中以下几个相位(phase)之一:
- Pending
ApiServer创建了Pod资源对象并已存入etcd中,但它尚未被调度完成,或仍处于从仓库中下载镜像的过程中。调度Pod加上下载镜像的时间即为等待时间。
- Running
该Pod已经绑定到一个节点上,Pod中所有的容器都已经被创建,至少有一个容器正在运行或者处于启动或者重启状态。
- Succeeded
Pod中的所有容器都已经成功终止并且不会被重启。
- Failed
所有容器已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态或已经被系统终止。
- UnKnown
ApiServer无法正常获取到Pod对象的状态信息,通常由于其无法与Pod所在Node节点的kubelet通信所致。
五、Pod中容器的状态
- Waiting(等待)
处于 Waiting 状态的容器仍在运行它完成启动所需要的操作。Eg:从某个容器镜像仓库拉取容器镜像,或者向容器应用Secret数据等等。
- Running(运行中)
Running 状态表明容器正在执行状态并且没有问题发生。
- Terminated(已终止)
处于 Terminated 状态的容器已经开始执行且正常结束或者因为某些原因失败。
六、Pod的重启策略
Pod 的 spec字段中包含一个 restartPolicy 字段,它决定了容器终止后是否重启。重启策略如下:
- Always:默认策略。当容器终止退出后,无论何种退出状态码,总是重启容器。
- OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
- Never:当容器终止退出,无论何种退出状态码,从不重启容器。
restartPolicy适用于 Pod 中的所有容器。restartPolicy仅针对同一节点上kubelet的容器重启动作。当 Pod 中的容器退出时,kubelet会按指数回退方式计算重启的延迟(10s、20s、40s、...),其最长延迟为5分钟。 一旦某容器执行了10分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行重置操作。