0
点赞
收藏
分享

微信扫一扫

Kubernetes的Pod研究(1)--定义Pod资源

墨春 2023-05-14 阅读 47

一、对Pod的介绍

1.1 什么是Pod

它是一个或多个容器的集合,又称为容器集。它是Kubernetes调度、部署、运行应用的最小单元(原子单元,即不可分割的整体)。

Pod内封装的内容:可被其内部多个容器共享的存储资源、网络环境等。

Pod内的“基础设施容器”Pause容器事先创建可被各个应用容器共享的基础环境,默认共享network、IPC(进程间通信)、UTS名称空间给各容器。PID名称空间也可以共享,但需要用户手动定义。但Mount、PID和USER仍隔离。

Kubernetes的Pod研究(1)--定义Pod资源_认识Pod

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

Kubernetes的Pod研究(1)--定义Pod资源_认识Pod_02

但是手写一个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

Kubernetes的Pod研究(1)--定义Pod资源_Kubernetes_03

三、了解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.   启动容器

Kubernetes的Pod研究(1)--定义Pod资源_Kubernetes_04

关于镜像下载策略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 对该容器的重启回退计时器执行重置操作。

举报

相关推荐

0 条评论