Pod生命周期和健康检查
Pod生命周期和健康检查
Pod的生命周期涵盖了前面所说的PostStart 和 PreStop在内
Pod phase
Pod的status定义在 PodStatus对象中,其中有一个phase字段。
Pod的运行阶段是Pod在其生命周期中的简单宏观概述。
下面是phase可能的值:
- Pending 挂起:该状态标识Pod没有调度到节点上,可能下载镜像耗费时间,容器还未启动。
- Running 运行中: Pod已经绑定到一个节点上,Pod中的容器已经全部创建,至少有一个容器正在运行,或者证处于启动状态或重启状态。
- Succeeded 成功: Pod中所有的容器都被成功终止,并且不会被重启。
- Failed 失败:Pod中的所有容器都已经终止了,并且至少有一个容器是因为失败终止。容器退出状态非0或被系统终止。
- Unknown 未知: 因为某些原因无法取得Pod状态,通常因为与Pod所在节点失去通信造成失联。
Pod 状态
Pod 有一个 PodStatus 对象,其中包含一个 PodCondition 数组。 PodCondition 数组的每个元素都有一个 type
字段和一个 status
字段。type
字段是字符串,可能的值有 PodScheduled、Ready、Initialized 和 Unschedulable。status
字段是一个字符串,可能的值有 True、False 和 Unknown。
Pod健康检查
查看官网文档,探针是有kubelet对容器状态的一种定期监控和检查,要执行诊断,kubelet可以调用由容器实现的Handler。有三种执行方式:
- HTTPGetAction(http):对指定端口和路径上的容器的IP地址执行HTTP Get请求。如果状态码大于等于200且小于400,则认为诊断成功。
- ExecAction(exec): 在容器内部执行指定命令,执行后退出状态码为0则诊断成功。
- TCPSocketAction(tcp:): kubelet 对指定容器IP和Port进行TCP检查,如果端口打开,则被认为诊断成功
诊断状态有三种:
- 成功: 容器状态健康,通过了检测
- 失败: 容器未通过诊断
- 未知: 诊断失败,不会采取任何行动
容器探针
供kubelet对容器诊断的探针有两种:
- LivenessProbe: 存活探针,指容器是否正在运行。如果检测失败,则kubelet会杀死容器,并且容器会受重启策略的影响而是否重启, 如果容器不提供探针,则默认状态为success。
- ReadnessProbe: 就绪探针,指容器是否准备就绪,接受服务请求。如果就绪探针失败,端点控制器将从与Pod匹配的所有service的端点中移除该Pod的IP 地址。初始延迟之前的就绪状态默认是Failure,如果容器不提供就绪探针,则默认状态为Success。
什么时候选择livenessProbe 存活探针和readnessProbe就绪探针?
如果容器中的进程能够在出现服务故障的时候自动崩溃,那么这种时候是不需要提供livenessProbe ,kubelet将根据Pod的restartPolicy自动执行正确的操作
如果希望容器在探测失败时被杀死并重新启动,那么请指定一个livenessPRobe存活探针,并指定restartPolicy为Always或OnFailure。
如果要在探测成功才开始向Pod发送流量,就需要指定一个readnessProbe 。在这种情况下,就绪探针可能和存活探针同时存在,这种情况下的readnessProbe意味容器在没有接受到任何 流量的情况下启动,并且只有在探针成功后才接收流量。如果希望容器能够自行维护,那就指定一个readnessProbe探针,和livenessProbe探测不同的端点。
注意,如果只想在pod被删除时能够排除请求,则不一定需要使用就绪探针;在删除Pod时,Pod将自动将自身置于未完成状态,无论是否有就绪探针。当等待Pod中的容器停止时,Pod仍处于未完成状态。
模板 使用exec方式
apiVersion: v1
kind: Pod
metadata:
name: probe
spec:
containers:
- name: probe
image: busybox
argx:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 #等待容器启动5秒后发起探针
periodSeconds: 5 #发起探针的间隔5秒一次
使用kubectl 部署这个yaml文件,创建一个Pod,可以发现在启动完成后等待5秒后开始发起探针诊断,每隔5秒后发起一次诊断,而这里使用的是exec方式,在30秒后容器会执行删除/tmp/healthy 文件操作,这之后再发起探针诊断则诊断失败,容器将被kubelet 杀掉然后重启。
livenessProbe和readnessProbe一起使用
apiVersion: v1
kind: Pod
metadata:
name: probe-http
label:
app: probe-http
sepc:
containers:
- name: probe-http
image: nginx
containerPort:
- name: http
port: 80
livenessProbe:
# 当没有定义 "host" 时,使用 "PodIP"
# host: my-host
# 当没有定义 "scheme" 时,使用 "HTTP" scheme 只允许 "HTTP" 和 "HTTPS"
# scheme: HTTPS
path: / #路径可以是想要检查的能访问到的任何路径,如:/healthy
port: 80
# httpHeaders: 设置http请求头
# - name: X-Custom-Header
# value: Awesome
initialDelaySeconds: 15
timeoutSeconds: 1 #超时时间
readnessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
periodSeconds: 20
从上面的YAML
文件我们可以看出readiness probe
的配置跟liveness probe
很像,基本上一致的。唯一的不同是使用readinessProbe
而不是livenessProbe
。两者如果同时使用的话就可以确保流量不会到达还未准备好的容器,准备好过后,如果应用程序出现了错误,则会重新启动容器。
探针参数:
* timeoutSeconds:探测超时时间,默认1秒,最小1秒。
* successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是 1,但是如果是`liveness`则必须是 1。最小值是 1。
* failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是 3,最小值是 1。
重启策略
PodSpec 中有一个 restartPolicy
字段,可能的值为 Always、OnFailure 和 Never。默认为 Always。 restartPolicy
适用于 Pod 中的所有容器。restartPolicy
仅指通过同一节点上的 kubelet 重新启动容器。失败的容器由 kubelet 以五分钟为上限的指数退避延迟(10秒,20秒,40秒…)重新启动,并在成功执行十分钟后重置。如 Pod 文档 中所述,一旦绑定到一个节点,Pod 将永远不会重新绑定到另一个节点。
restartPolicy:
- Always 容器失效时,kubelet 自动重启该容器
- OnFailure 容器终止运行且退出码不为0时重启
- Never 不论状态为何, kubelet 都不重启该容器
Pod 的生命
一般来说,Pod 不会消失,直到人为销毁他们。这可能是一个人或控制器。这个规则的唯一例外是成功或失败的 phase
超过一段时间(由 master 确定)的Pod将过期并被自动销毁。
有三种可用的控制器:
- 使用 Job 运行预期会终止的 Pod,例如批量计算。Job 仅适用于重启策略为
OnFailure
或Never
的 Pod。 - 对预期不会终止的 Pod 使用 ReplicationController、ReplicaSet 和 Deployment ,例如 Web 服务器。 ReplicationController 仅适用于具有
restartPolicy
为 Always 的 Pod。 - 提供特定于机器的系统服务,使用 DaemonSet 为每台机器运行一个 Pod 。
所有这三种类型的控制器都包含一个 PodTemplate。建议创建适当的控制器,让它们来创建 Pod,而不是直接自己创建 Pod。这是因为单独的 Pod 在机器故障的情况下没有办法自动复原,而控制器却可以。
如果节点死亡或与集群的其余部分断开连接,则 Kubernetes 将应用一个策略将丢失节点上的所有 Pod 的 phase
设置为 Failed
Pod生命周期和健康检查的更多相关文章
- 容器编排系统之Pod生命周期、健康/就绪状态探测以及资源限制
前文我们了解了在k8s上的资源标签.标签选择器以及资源注解相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14141080.html:今天我们来聊下k8 ...
- 2.k8s.Pod生命周期,健康检查
#Pod生命周期,健康检查 pod创建过程 Init容器 就绪探测 存活探测 生命周期钩子 #Pod创建过程 master节点:kubectl -> kube-api -> kubenle ...
- Kubernetes Pod 生命周期
一. Pod Hook Kubernetes 为我们提供了生命周期钩子,就是我们所说的Pod Hook,Pod Hook是由kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行.这是 ...
- Kubernetes1.3:POD生命周期管理
转:http://blog.csdn.net/horsefoot/article/details/52324830 (一) 核心概念 Pod是kubernetes中的核心概念,kubernetes对 ...
- k8s学习-pod生命周期
4.2.pod生命周期 创建一个pod的时候过程如下: 1.容器环境初始化: 2.pause执行网络.容器卷等初始化工作: 3.所有的InitC按顺序执行,每个InitC执行完后才能执行下一个,且必须 ...
- pod生命周期
Pod生命周期 我们一般将pod对象从创建至终这段时间范围成为pod的生命周期,它主要包含以下的过程: pod创建过程 运行初始化容器(init container)过程 运行主容器(main con ...
- 【三】Kubernetes学习笔记-Pod 生命周期与 Init C 介绍
一.容器生命周期 Init C(初始化容器)只是用于 Pod 初始化的,不会一直随着 Pod 生命周期存在,Init C 在初始化完成之后就会死亡. 一个 Pod 可以有多个 Init C,也可以不需 ...
- k8s的pod生命周期
pod的生命周期: 1.init container 2.main contianer (1) post start hook :容器启动后做什么操作(可以命令查看kubectl explain po ...
- Pod 生命周期和重启策略
Pod 在整个生命周期中被系统定义为各种状态,熟悉 Pod 的各种状态对于理解如何设置 Pod 的调度策略.重启策略是很有必要的. Pod 的状态 状态值 描述 Pending API Server ...
随机推荐
- Webpack 4 SplitChunksPlugin配置方案(转)
通常情况下我们的 WebApp 是有我们的自身代码和第三方库组成的,我们自身的代码是会常常变动的,而第三方库除非有较大的版本升级,不然是不会变的,所以第三方库和我们的代码需要分开打包,我们可以给第三方 ...
- https本地自签名证书添加到信任证书访问
1.背景 本文适用于基于https(http+ssl)的网站通信.本地调试等,上线是请寻找免费 ssl证书申请. 本地调试过程中,一些特殊的场景需要我使用http+ssl通信,比如在Chrome中使用 ...
- [PHP] Laravel 体现 MySQL、Sqlite 数据的大小写敏感
要想实现数据比对的大小写敏感,方式是设置数据库字段类型 或者 字段校验字符集. MySQL 和 Sqlite 所支持的 collations 形式是不同的,你可以通过以下文档了解到. MySQL co ...
- 启动Oracle 12c数据库实例
启动Oracle 12c数据库实例 启动Oracle数据库实例,主要分为两步:第一步,启动监听:第二步,启动数据库实例. 1. 切换到oracle用户- su oracle- cd - source ...
- [xsy3132]数表
题意:一个$n\times m$的数表,数值$\in[0,4)$,你可以任意次选择一行或一列$+1,\text{mod }4$,要最小化所有数的和 因为$n\leq10$,所以数表可以看成$m$个$n ...
- electron实现MessageBox
1.在渲染进程引用主进程模块 var remote = require('electron').remote; var dialog = remote.dialog; 2.实现一点简单的确定取消操作 ...
- vs 远程调试
程序在vs安装目录: D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Remote Debugge ...
- OpenLayers加载谷歌地球离线瓦片地图
本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...
- 单选 textarea 赋初值
自闭合标签赋初值用$().val(),比如:<input type="text" name="text" value="123"> ...
- LeetCode 1253. 重构 2 行二进制矩阵 - Java - 统计
题目链接:https://leetcode-cn.com/contest/weekly-contest-162/problems/reconstruct-a-2-row-binary-matrix/ ...