k8s学习笔记(3)——Pod
原文链接 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