Kubernetes中的pod

Posted _雪辉_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes中的pod相关的知识,希望对你有一定的参考价值。

1.1 Pod的概念

  首先Kubernetes本身相当于传统环境中的操作系统,操作系统中的应用通常不是单一进程的,而是以一个进程组的形式构成,这个概念在Kubernetes中就映射为了Pod。Pod是Kubernetes最小的调度单位,container就相当于进程。如果要用docker swarm部署一个进程组应用,那么多个容器必然会落在同一节点,就会面临后调度的进程资源不足的问题;而Kubernetes中以pod为原子单位进行调度就不存在这个问题;一个应用包含多个容器的pod看起来等同于docker中一个容器共享另外一个容器的网络和 Volume,但是这种方式在docker里就变成了拓扑关系,而不是对等关系,在 Kubernetes 里,Pod 通过Infra 容器(k8s.gcr.io/pause)解决了这个问题。这是一个永远处于“暂停”状态的容器,Infra 容器永远都是第一个被创建的容器,Pod的生命周期只和Infra 有关;而其他用户定义的容器,则通过 Join Network Namespace 的方式,与 Infra 容器关联在一起。Pod 里的所有容器(container)共享的是同一个 Network Namespace,并且可以声明共享同一个Volume。

1.2 Pod的生命周期

  Pod 生命周期的变化,主要体现在 Pod API 对象的 Status 部分,这是它除了 Metadata 和 Spec 之外的第三个重要字段。其中,pod.status.phase,就是 Pod 的当前状态,它有如下几种可能的情况:

  • Pending。这个状态意味着,Pod 的 YAML 文件已经提交给了 Kubernetes,API 对象已经被创建并保存在 Etcd 当中。但是,这个 Pod 里有些容器因为某种原因而不能被顺利创建。比如,调度不成功。
  • Running。这个状态下,Pod 已经调度成功,跟一个具体的节点绑定。它包含的容器都已经创建成功,并且至少有一个正在运行中。
  • Succeeded。这个状态意味着,Pod 里的所有容器都正常运行完毕,并且已经退出了。这种情况在运行一次性任务时最为常见。
  • Failed。这个状态下,Pod 里至少有一个容器以不正常的状态(非 0 的返回码)退出。这个状态的出现,意味着你得想办法 Debug 这个容器的应用,比如查看 Pod 的 Events 和日志。
  • Unknown。这是一个异常状态,意味着 Pod 的状态不能持续地被 kubelet 汇报给 kube-apiserver,这很有可能是主从节点(Master 和 Kubelet)间的通信出现了问题。
    Pod 对象的 Status 字段,还可以再细分出一组 Conditions。这些细分状态的值包括:PodScheduled、Ready、Initialized,以及 Unschedulable。它们主要用于描述造成当前 Status 的具体原因是什么。

1.3 pod与container的对象

  Pod,是 Kubernetes 项目中的最小编排单位,容器是Pod属性下的一个字段。凡是调度、网络、存储,linux namespace以及安全相关的属性,基本上是 Pod 级别的。

Pod中的几个重要字段:

  • NodeSelector:是一个供用户将 Pod 与 Node 进行绑定的字段
apiVersion: v1
kind: Pod
...
spec:
 nodeSelector:
   disktype: ssd
  • NodeName:一旦 Pod 的这个字段被赋值,Kubernetes 就会认为这个 Pod 已经经过了调度,调度的结果就是赋值的节点名字。所以,这个字段一般由调度器负责设置,但用户也可以设置它来“骗过”调度器。
  • HostAliases:定义了 Pod 的 hosts 文件(比如 /etc/hosts)里的内容
apiVersion: v1
kind: Pod
...
spec:
  hostAliases:
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
...

container中的几个重要字段:

  • ImagePullPolicy
    默认是 Always,即每次创建 Pod 都重新拉取一次镜像。另外,当容器的镜像是类似于 nginx 或者 nginx:latest 这样的名字时,ImagePullPolicy 也会被认为 Always。而如果它的值被定义为 Never 或者 IfNotPresent,则意味着 Pod 永远不会主动拉取这个镜像,或者只在宿主机上不存在这个镜像时才拉取。
  • Lifecycle
    它定义的是 Container Lifecycle Hooks。顾名思义,Container Lifecycle Hooks 的作用,是在容器状态发生变化时触发一系列“钩子”。

以上是关于Kubernetes中的pod的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes之NetworkPolicy,Flannel和Calico

Kubernetes Pod 中如何查看动态创建绑定的远程磁盘使用情况

Kubernetes in Action 3 pod:运行于Kubernetes中的容器

Kubernetes in Action 3 pod:运行于Kubernetes中的容器

Kubernetes in Action 3 pod:运行于Kubernetes中的容器

8kubernetes之存储卷资源