pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)
在Kubernetes
集群当中,我们可以通过配置liveness probe
(存活探针)和readiness probe
(可读性探针)来影响容器的生存周期。参考文档:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
kubelet 通过使用 liveness probe 来确定你的应用程序是否正在运行,通俗点将就是是否还活着。一般来说,如果你的程序一旦崩溃了, Kubernetes 就会立刻知道这个程序已经终止了,然后就会重启这个程序。而我们的 liveness probe 的目的就是来捕获到当前应用程序还没有终止,还没有崩溃,如果出现了这些情况,那么就重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去。
kubelet使用活跃度探头知道什么时候重新启动的容器。例如,liveness probe可以捕获死锁,应用程序正在运行,但无法取得进展。在这种状态下重新启动容器可以继续存活。
kubelet 使用 readiness probe 来确定容器是否已经就绪可以接收流量过来了。这个探针通俗点讲就是说是否准备好了,现在可以开始工作了。只有当 Pod 中的容器都处于就绪状态的时候 kubelet 才会认定该 Pod 处于就绪状态,因为一个 Pod 下面可能会有多个容器。当然 Pod 如果处于非就绪状态,那么我们就会将他从我们的工作队列(实际上就是我们后面需要重点学习的 Service)中移除出来,这样我们的流量就不会被路由到这个 Pod 里面来了。
使用readiness probe来了解容器何时准备开始接受流量。当所有容器准备就绪时,Pod被认为已准备就绪。此信号的一个用途是控制哪些Pod用作服务的后端。当Pod未就绪时,它将从服务负载平衡器中删除。例如当一个应用服务有大文件加载时,这种情况下不允许接受用户访问,readiness probe就不会对这类型的程序启动服务。
许多运行很长时间的应用程序最终会转换到损坏状态,除非重新启动,否则无法恢复。Kubernetes提供活体探测器来检测和纠正这种情况。
通过busybox来练习一下liveness probe
liveness-exec.yaml liveness-http.yaml pod-example.yaml poststart-hook.yaml prestop-hook.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
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
在配置文件中,您可以看到Pod具有单个Container。该periodSeconds
字段指定kubelet应每5秒执行一次活跃度探测。该initialDelaySeconds
字段告诉kubelet它应该在执行第一次探测之前等待5秒。要执行探测,kubelet将cat /tmp/healthy
在Container中执行命令。如果命令成功,则返回0,并且kubelet认为Container是活动且健康的。如果该命令返回非零值,则kubelet会终止Container并重新启动它。
当Container启动时,它会执行以下命令:
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
在Container的生命的前30秒,有一个/tmp/healthy
文件。因此,在前30秒内,该命令cat /tmp/healthy
返回成功代码。30秒后,cat /tmp/healthy
返回失败代码。
创建Pod:
kubectl apply -f liveness-exec.yaml
在30秒内,查看Pod事件:
kubectl describe pod liveness-exec
有消息指示活动探测失败,并且容器已被杀死并重新创建。
另一种活动探测器使用HTTP GET请求
apiVersion: v1
kind: Pod
metadata:
name: liveness-http
labels:
app: liveness
spec:
containers:
- name: liveness
image: cnych/liveness
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
在配置文件中,您可以看到Pod具有单个Container。该periodSeconds
字段指定kubelet应每3秒执行一次活跃度探测。该initialDelaySeconds
字段告诉kubelet它应该在执行第一次探测之前等待3秒。为了执行探测,kubelet向在Container中运行的服务器发送HTTP GET请求并侦听端口8080.如果服务器/healthz
路径的处理程序返回成功代码,则kubelet认为Container是活动且健康的。如果处理程序返回失败代码,则kubelet会终止Container并重新启动它。
任何大于或等于200且小于400的代码表示成功。任何其他代码表示失败。
您可以在server.go中查看服务器的源代码 。
对于Container /healthz
处于活动状态的前10秒,处理程序返回状态200.之后,处理程序返回状态500。
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
duration := time.Now().Sub(started)
if duration.Seconds() > 10 {
w.WriteHeader(500)
w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
} else {
w.WriteHeader(200)
w.Write([]byte("ok"))
}
})
在容器启动3秒后,kubelet开始执行运行状况检查。因此,前几次健康检查将成功。但是10秒后,运行状况检查将失败,并且kubelet将终止并重新启动Container。
要尝试HTTP活跃度检查,请创建一个Pod:
kubectl apply -f liveness-http.yaml
10秒后,查看Pod事件以验证活动探测失败并且Container已重新启动:
kubectl describe pod liveness-http
在v1.13之前的版本(包括v1.13)中,如果在运行pod的节点上设置了环境变量http_proxy(或HTTP_PROXY
),则HTTP活动探针将使用该代理。在v1.13之后的版本中,本地HTTP代理环境变量设置不会影响HTTP活动探测。
定义TCP活动探测
第三种类型的活动探测器使用TCP套接字。使用此配置,kubelet将尝试在指定端口上打开容器的套接字。如果它可以建立连接,则容器被认为是健康的,如果它不能被认为是失败的话。
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: cnych/goproxy
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
我们可以看到,TCP 检查的配置与 HTTP 检查非常相似,只是将httpGet
替换成了tcpSocket
。 而且我们同时使用了readiness probe
和liveness probe
两种探针。 容器启动后5秒后,kubelet
将发送第一个readiness probe
(可读性探针)。 该探针会去连接容器的8080端,如果连接成功,则该 Pod 将被标记为就绪状态。然后Kubelet
将每隔10秒钟执行一次该检查。
除了readiness probe
之外,该配置还包括liveness probe
。 容器启动15秒后,kubelet
将运行第一个 liveness probe
。 就像readiness probe
一样,这将尝试去连接到容器的8080端口。如果liveness probe
失败,容器将重新启动。
有的时候,应用程序可能暂时无法对外提供服务,例如,应用程序可能需要在启动期间加载大量数据或配置文件。 在这种情况下,您不想杀死应用程序,也不想对外提供服务。 那么这个时候我们就可以使用readiness probe
来检测和减轻这些情况。 Pod中的容器可以报告自己还没有准备,不能处理Kubernetes服务发送过来的流量。
从上面的YAML
文件我们可以看出readiness probe
的配置跟liveness probe
很像,基本上一致的。唯一的不同是使用readinessProbe
而不是livenessProbe
。两者如果同时使用的话就可以确保流量不会到达还未准备好的容器,准备好过后,如果应用程序出现了错误,则会重新启动容器。
另外除了上面的initialDelaySeconds
和periodSeconds
属性外,探针还可以配置如下几个参数:
- timeoutSeconds:探测超时的秒数。默认为1秒。最小值为1。
- initialDelaySeconds:启动活动或准备就绪探测之前容器启动后的秒数。
- periodSeconds:执行探测的频率(以秒为单位)。默认为10秒。最小值为1。
- failureThreshold:当Pod启动并且探测失败时,Kubernetes会failureThreshold在放弃之前尝试一次。在活动探测的情况下放弃意味着重新启动Pod。如果准备好探测,Pod将被标记为未准备好。默认为3.最小值为1。
- successThreshold:失败后探测成功的最小连续成功次数。默认为1.活跃度必须为1。最小值为1。
[HTTP探针] 具有可以设置的其他字段httpGet
:
host
:要连接的主机名,默认为pod IP。您可能希望在httpHeaders中设置“主机”。scheme
:用于连接主机的方案(HTTP或HTTPS)。默认为HTTP。path
:HTTP服务器上的访问路径。httpHeaders
:要在请求中设置的自定义标头。HTTP允许重复标头。port
:容器上要访问的端口的名称或编号。数字必须在1到65535的范围内。
对于HTTP探测,kubelet将HTTP请求发送到指定的路径和端口以执行检查。kubelet将探测器发送到pod的IP地址,除非地址被可选host
字段覆盖httpGet
。如果 scheme
字段设置为HTTPS
,则kubelet会发送跳过证书验证的HTTPS请求。在大多数情况下,您不希望设置该host
字段。这是您设置它的一个场景。假设Container侦听127.0.0.1并且Pod的hostNetwork
字段为true。然后host
,在httpGet
,应设置为127.0.0.1。如果您的pod依赖虚拟主机,这可能是更常见的情况,您不应该使用host
,而是设置Host
标头httpHeaders
。
对于探测器,kubelet在节点处而不是在pod中进行探测连接,这意味着您无法在host
参数中使用服务名称,因为kubelet无法解析它。
pod健康检查(liveness probe存活探针&&readiness probe 可读性探针)的更多相关文章
- Kubernetes Pod 健康检查
参考文档: https://jimmysong.io/kubernetes-handbook/guide/configure-liveness-readiness-probes.html 一.Pod的 ...
- kubernetes之pod健康检查
目录 kubernetes之pod健康检查 1.概述和分类 2.LivenessProbe探针(存活性探测) 3.ReadinessProbe探针(就绪型探测) 4.探针的实现方式 4.1.ExecA ...
- pod资源的健康检查-liveness探针的exec使用
使用探针的方式对pod资源健康检查 探针的种类 livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器 readinessProbe:可用性检查,周期性检查服务是否 ...
- pod资源的健康检查-liveness探针的httpGet使用
使用liveness探针httpget方式检测pod健康,httpGet方式使用的最多 [root@k8s-master1 tanzhen]# cat nginx_pod_httpGet.yaml a ...
- Kubernetes中Pod健康检查
目录 1.何为健康检查 2.探针分类 2.1.LivenessProbe探针(存活性探测) 2.2.ReadinessProbe探针(就绪型探测) 3.探针实现方法 3.1.Container Exe ...
- K8s中Pod健康检查源代码分析
了解k8s中的Liveness和Readiness Liveness: 表明是否容器正在运行.如果liveness探测为fail,则kubelet会kill掉容器,并且会触发restart设置的策略. ...
- 容器探针(liveness and readiness probe)
一.为什么需要容器探针 如何保持Pod健康 只要将pod调度到某个节点,Kubelet就会运行pod的容器,如果该pod的容器有一个或者所有的都终止运行(容器的主进程崩溃),Kubelet将重启容 ...
- Pod生命周期和健康检查
Pod生命周期和健康检查 Pod的生命周期涵盖了前面所说的PostStart 和 PreStop在内 Pod phase Pod的status定义在 PodStatus对象中,其中有一个phase字段 ...
- K8s-Pod健康检查原理与实践
Pod健康检查介绍 默认情况下,kubelet根据容器运行状态作为健康依据,不能监视容器中应用程序状态,例如程序假死.这将会导致无法提供服务,丢失流量.因此重新健康检查机制确保容器健康幸存.Pod通过 ...
随机推荐
- centos7.6下的python3.6.9虚拟环境安装elastalert
centos7.6安装python3.6.9+elastalert .编译安装python3..9环境 # 安装依赖 yum -y install zlib-devel bzip2-devel ope ...
- Anaconda3_5.3.1+Pycharm2018.3安装步骤
最近更新了Anaconda软件,重新配置了以下Python开发环境,结果之前旧环境开发的好好的程序竟然跑不起来.网上各种搜索,各种找答案还是没有一篇靠谱的文章教我把问题解决.走了各种弯路,足足整了几天 ...
- Laya改变文档结构后GameConfig自动生成错误问题
原来的WeaponPanel,ItemPanel,PetPanel改变了路径,然后GameConfig还是一直生成旧的路径,因为旧路径已经不存在,所以提示报错,编译不过去. 需要把编辑模式下的改路径相 ...
- ios开发和安卓app开发有哪些区别
ios平台和Android平台开发APP应用程序主要区别:一.编码语言Android平台开发中是使用Java,ios平台则是使用的Objective-C和Swift.需要注意的是,如果你是要用ios进 ...
- 取消Windows server 2008关机提示备注的方法
打开“开始”-“运行”,在“打开”一栏中输入“gpedit.msc”命令打开组策略编辑器,依次展开“计算机配置”→“管理模板”→“系统”,双击右侧窗口出现的“显示‘关闭事件跟踪程序’”,将“未配置”改 ...
- WIN7 浏览器 收藏夹栏字体太小
在“窗口颜色和外观”-项目-“消息框”,把字体大小调大. "标题按钮" 大小 21.
- c# Aspose.Cells 通过Excel模板生产excel数据再打印
多的不说,我们先来利用Northwind做两个小demo.先说说Aspose.Cells的模板语法: &=DataSource.Field,&=[DataSource].[Field] ...
- Qt信号-槽原理剖析--(1)信号槽简介
唯有创造才是快乐.只有创造的生灵才是生灵.--罗曼·罗兰 信号槽是观察者模式的一种实现,特性如下: A.一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知: B.一个槽就是一个观察者, ...
- 04 Mybatis 框架的环境搭建及入门案例
1.搭建 Mybatis 开发环境 mybatis的环境搭建 第一步:创建maven工程并导入坐标 第二步:创建实体类和dao的接口 第三步:创建Mybatis的主配置文件 SqlMapConifg. ...
- 【转帖】处理器史话 | 当Power架构的发展之路遭遇“滑铁卢”
处理器史话 | 当Power架构的发展之路遭遇“滑铁卢” https://www.eefocus.com/mcu-dsp/366740 (8)Power8:决定了 Power 平台的未来发展 2014 ...