k8s学习笔记(3)——Pod

2019-01-13 Alex Sun 更多博文 » 博客 » GitHub »

原文链接 https://syaning.github.io/2019/01/13/k8s-3/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


一、Pod定义

官网文档对Pod的定义是:

A Pod is the basic building block of Kubernetes–the smallest and simplest unit in the Kubernetes object model that you create or deploy. A Pod represents a running process on your cluster.

Pod的基本特点有:

  • Pod其实是对容器的一层包装,每个Pod内可以包含一个或者多个容器
  • Pod内的容器共享网络和存储,互相之间可以通过localhost来进行通信
  • Pod是非持久的、一次性的 (ephemeral, disposable)
  • Pod不会自愈,当一个Pod失败后,会被删除
  • Controller用于管理Pod,对Pod进行调度,复本管理,滚动升级等
  • 很少直接使用Pod,一般都是通过Controller来使用
  • Pod template也通常不直接使用,而是放在Controller template里

二、Pod生命周期

Pod的生命周期状态由Pod的status来反映,有以下几种:

  • Pending:尚未调度,镜像在下载中
  • Running:被调度到一个节点上,其中至少一个容器还在运行中,启动中或者重启中
  • Succeeded:所有容器运行成功然后终止,且不会重启
  • Failed:所有容器已经终止运行,且至少有一个容器失败而终止
  • Unknow:状态未知

三、探针(probes)

kubelet会定期对容器进行健康检查,健康检查使用的就是探针,探针类型有以下三种:

  • 执行一个命令,如果返回值是0,则认为成功
  • TCP检测端口是否可以连通
  • 发起一个HTTP GET请求,如果状态码在[200, 400)之间,则认为成功

探针检测的结果有以下三种:

  • Success
  • Failure
  • Unknown

目前支持的检测有两种:

  • livenessProbe:检测容器是否运行,通常结合Pod的restartPolicy来使用,用于判断什么时候应当重启容器来自愈
  • readinessProbe:检测容器是否ready,如果检测成功,则会将该Pod加入到Service的负载均衡池中,开始对外提供服务

下面是一个livenessProbe的例子,创建文件liveness.yml,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: liveness-demo
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

然后执行:

$ kubectl create -f liveness.yml

然后执行:

$ kubectl get pods -f

可以看到Pod在不断重启:

NAME            READY     STATUS    RESTARTS   AGE
liveness-demo   1/1       Running   1          2m
liveness-demo   1/1       Running   2         2m
liveness-demo   1/1       Running   3         4m
liveness-demo   1/1       Running   4         5m
liveness-demo   1/1       Running   5         6m