配置Pod的liveness和readiness探针
当你使用kuberentes的时候,有没有遇到过Pod在启动后一会就挂掉然后又重新启动这样的恶性循环?你有没有想过kubernetes是如何检测pod是否还存活?虽然容器已经启动,但是kubernetes如何知道容器的进程是否准备好对外提供服务了呢?让我们通过kuberentes官网的这篇文章Configure Liveness and Readiness Probes,来一探究竟。
本文将向展示如何配置容器的存活和可读性探针。
Kubelet使用liveness probe(存活探针)来确定何时重启容器。例如,当应用程序处于运行状态但无法做进一步操作,liveness探针将捕获到deadlock,重启处于该状态下的容器,使应用程序在存在bug的情况下依然能够继续运行下去(谁的程序还没几个bug呢)。
Kubelet使用readiness probe(就绪探针)来确定容器是否已经就绪可以接受流量。只有当Pod中的容器都处于就绪状态时kubelet才会认定该Pod处于就绪状态。该信号的作用是控制哪些Pod应该作为service的后端。如果Pod处于非就绪状态,那么它们将会被从service的load balancer中移除。
定义 liveness命令
许多长时间运行的应用程序最终会转换到broken状态,除非重新启动,否则无法恢复。Kubernetes提供了liveness probe来检测和补救这种情况。
在本次实验中,你将基于 gcr.io/google_containers/busybox
镜像创建运行一个容器的Pod。以下是Pod的配置文件exec-liveness.yaml
:
apiVersion: v1 kind: Pod metadata:labels:test: livenessname: liveness-exec spec:containers:- name: livenessargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600image: gcr.io/google_containers/busyboxlivenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5
该配置文件给Pod配置了一个容器。periodSeconds
规定kubelet要每隔5秒执行一次liveness probe。 initialDelaySeconds
告诉kubelet在第一次执行probe之前要的等待5秒钟。探针检测命令是在容器中执行 cat /tmp/healthy
命令。如果命令执行成功,将返回0,kubelet就会认为该容器是活着的并且很健康。如果返回非0值,kubelet就会杀掉这个容器并重启它。
容器启动时,执行该命令:
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
在容器生命的最初30秒内有一个 /tmp/healthy
文件,在这30秒内 cat /tmp/healthy
命令会返回一个成功的返回码。30秒后, cat /tmp/healthy
将返回失败的返回码。
创建Pod:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/exec-liveness.yaml
在30秒内,查看Pod的event:
kubectl describe pod liveness-exec
结果显示没有失败的liveness probe:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 24s 24s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker0 23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "gcr.io/google_containers/busybox" 23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "gcr.io/google_containers/busybox" 23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined] 23s 23s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e
启动35秒后,再次查看pod的event:
kubectl describe pod liveness-exec
在最下面有一条信息显示liveness probe失败,容器被删掉并重新创建。
FirstSeen LastSeen Count From SubobjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 37s 37s 1 {default-scheduler } Normal Scheduled Successfully assigned liveness-exec to worker0 36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulling pulling image "gcr.io/google_containers/busybox" 36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Pulled Successfully pulled image "gcr.io/google_containers/busybox" 36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Created Created container with docker id 86849c15382e; Security:[seccomp=unconfined] 36s 36s 1 {kubelet worker0} spec.containers{liveness} Normal Started Started container with docker id 86849c15382e 2s 2s 1 {kubelet worker0} spec.containers{liveness} Warning Unhealthy Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
再等30秒,确认容器已经重启:
kubectl get pod liveness-exec
从输出结果来RESTARTS
值加1了。
NAME READY STATUS RESTARTS AGE liveness-exec 1/1 Running 1 1m
定义一个liveness HTTP请求
我们还可以使用HTTP GET请求作为liveness probe。下面是一个基于gcr.io/google_containers/liveness
镜像运行了一个容器的Pod的例子http-liveness.yaml
:
apiVersion: v1 kind: Pod metadata:labels:test: livenessname: liveness-http spec:containers:- name: livenessargs:- /serverimage: gcr.io/google_containers/livenesslivenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: X-Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3
该配置文件只定义了一个容器,livenessProbe
指定kubelete需要每隔3秒执行一次liveness probe。initialDelaySeconds
指定kubelet在该执行第一次探测之前需要等待3秒钟。该探针将向容器中的server的8080端口发送一个HTTP GET请求。如果server的/healthz
路径的handler返回一个成功的返回码,kubelet就会认定该容器是活着的并且很健康。如果返回失败的返回码,kubelet将杀掉该容器并重启它。
任何大于200小于400的返回码都会认定是成功的返回码。其他返回码都会被认为是失败的返回码。
查看该server的源码:server.go.
最开始的10秒该容器是活着的, /healthz
handler返回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将杀掉和重启容器。
创建一个Pod来测试一下HTTP liveness检测:
kubectl create -f https://k8s.io/docs/tasks/configure-pod-container/http-liveness.yaml
After 10 seconds, view Pod events to verify that liveness probes have failed and the Container has been restarted:
10秒后,查看Pod的event,确认liveness probe失败并重启了容器。
kubectl describe pod liveness-http
定义TCP liveness探针
第三种liveness probe使用TCP Socket。 使用此配置,kubelet将尝试在指定端口上打开容器的套接字。 如果可以建立连接,容器被认为是健康的,如果不能就认为是失败的。
如您所见,TCP检查的配置与HTTP检查非常相似。 此示例同时使用了readiness和liveness probe。 容器启动后5秒钟,kubelet将发送第一个readiness probe。 这将尝试连接到端口8080上的goproxy容器。如果探测成功,则该pod将被标记为就绪。Kubelet将每隔10秒钟执行一次该检查。
除了readiness probe之外,该配置还包括liveness probe。 容器启动15秒后,kubelet将运行第一个liveness probe。 就像readiness probe一样,这将尝试连接到goproxy容器上的8080端口。如果liveness probe失败,容器将重新启动。
使用命名的端口
可以使用命名的ContainerPort作为HTTP或TCP liveness检查:
ports: - name: liveness-portcontainerPort: 8080hostPort: 8080livenessProbe:httpGet:path: /healthzport: liveness-port
定义readiness探针
有时,应用程序暂时无法对外部流量提供服务。 例如,应用程序可能需要在启动期间加载大量数据或配置文件。 在这种情况下,你不想杀死应用程序,但你也不想发送请求。 Kubernetes提供了readiness probe来检测和减轻这些情况。 Pod中的容器可以报告自己还没有准备,不能处理Kubernetes服务发送过来的流量。
Readiness probe的配置跟liveness probe很像。唯一的不同是使用 readinessProbe
而不是livenessProbe
。
readinessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 5periodSeconds: 5
Readiness probe的HTTP和TCP的探测器配置跟liveness probe一样。
Readiness和livenss probe可以并行用于同一容器。 使用两者可以确保流量无法到达未准备好的容器,并且容器在失败时重新启动。
配置Probe
Probe中有很多精确和详细的配置,通过它们你能准确的控制liveness和readiness检查:
initialDelaySeconds
:容器启动后第一次执行探测是需要等待多少秒。periodSeconds
:执行探测的频率。默认是10秒,最小1秒。timeoutSeconds
:探测超时时间。默认1秒,最小1秒。successThreshold
:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。failureThreshold
:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。
HTTP probe中可以给 httpGet
设置其他配置项:
host
:连接的主机名,默认连接到pod的IP。你可能想在http header中设置”Host”而不是使用IP。scheme
:连接使用的schema,默认HTTP。path
: 访问的HTTP server的path。httpHeaders
:自定义请求的header。HTTP运行重复的header。port
:访问的容器的端口名字或者端口号。端口号必须介于1和65525之间。
对于HTTP探测器,kubelet向指定的路径和端口发送HTTP请求以执行检查。 Kubelet将probe发送到容器的IP地址,除非地址被httpGet
中的可选host
字段覆盖。 在大多数情况下,你不想设置主机字段。 有一种情况下你可以设置它。 假设容器在127.0.0.1上侦听,并且Pod的hostNetwork
字段为true。 然后,在httpGet
下的host
应该设置为127.0.0.1。 如果你的pod依赖于虚拟主机,这可能是更常见的情况,你不应该是用host
,而是应该在httpHeaders
中设置Host
头。
配置Pod的liveness和readiness探针相关推荐
- pod配置Liveness和Readiness探针
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 本文将向您展示如何配置容器的存活和可读性探针. kubelet 使用 liveness probe(存活探针)来确定何时重启容器.例如,当应用程序处于 ...
- Kubernetes Liveness and Readiness Probes
在设计关键任务.高可用应用程序时,弹性是要考虑的最重要因素之一. 当应用程序可以快速从故障中恢复时,它便具有弹性. 云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中.为了确保Kuber ...
- Liveness和Readiness两种Health Check手段在Kubernetes中的使用
一.概述 强大的自愈能力是Kubernetes这一类容器编排管理引擎的一个重要特性.通常情况下,Kubernetes通过重启发生故障的容器来实现自愈.除此之外,我们还有其他方式来实现基于Kuberne ...
- pod进阶(资源管理和探针)
文章目录 一: Pod的资源限制 1.1 概念 1.1.1 什么是pod的计算资源显稚嫩 CPU和内存的Requests和Limits的特点 1.2 pod 之间,和容器之间的通信 1.3 官网中的示 ...
- 容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额
容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额 1 Before you begin 2 创建名字空间 3 创建ResourceQuota对象 4 练习环境的清理 5 ...
- kubernetes之容器探针(liveness and readiness probe)
1.为什么需要容器探针 只要将pod调度到某个节点,Kubelet将运行pod的容器,如果该pod的容器有一个或所有的都终止运行(容器的主进程崩溃),Kubelet将重新启动容器,那么即使应用程序本身 ...
- linux探针,存活探针(Liveness)、就绪探针(Readiness)、启动探针(Startup)、容器钩子
一.探针 1.1.探针类型 LivenessProbe 用于判断容器是否存活(running状态),如果LivenessProbe探针探测到容器不健康,则kubelet杀掉该容器,并根据容器的重启策略 ...
- kubernetes集群实战——Pod生命周期、检测探针和控制器的运用
1. Pod生命周期 Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或 多个先于应用容器启动的 Init 容器. 1.1 Init 容器介绍 Init 容器是一种专用的容 ...
- Rancher入门到精通-2.0 K8S容器时区自动配置-Pod Preset
默认情况下,K8S集群里管控的Pod内部时区是UTC0时,跟我们实际所在时区不一致,会导致日志记录等方面存在问题.所以需要使容器内部与宿主机(node节点)的时间保持一致.想要解该问题主要有以下几种思 ...
- k8s pod MySQL环境变量_Kubernetes 配置Pod和容器(一)定义容器环境变量
此页展示了如何给运行在Kubernetes Pod中的容器定义环境变量. 开始之前 必须有一个Kubernets集群,和一个能和集群沟通的kubectl命令行工具.如果你还没有集群,你可以用Minik ...
最新文章
- Windows 11 正式官宣:全新 UI、支持安卓 App、应用商店 0 抽成!
- matlab中打不开保存好的模糊控制器,【求助大神】模糊控制器仿真,在Simulink运行时出现问题...
- 计算机考研:计算机组成原理考点分析
- php点击价格_按价格从高到低排序和从低到高排序_可点击切换,WooCommerce 教程:[解决] 排序,航运成本 – 从低到高...
- P3275-[SCOI2011]糖果【差分约束,负环】
- git常用操作,切换分支,合并分支
- (原)android的JNI中使用C++的类
- 自定义View之组合式
- IT项目管理之系统规划
- sql2012下载,安装,激活
- Scratch的广播与消息
- 地址总线、数据总线、控制总线
- java覆盖写入_java写入文件(覆盖和续写)
- 计算机一级怎么加波浪下划线,Word快速添加下划线,双下划线条、波浪线、虚线一键搞定...
- HDS 高端存储TC原理和配置总结
- Springboot 中类不能使用@Value注解从yml中加载值
- 白胡子不杀黑胡子的真正原因
- Hoofball(B题)
- 百度可观测系列 | 如何构建亿级指标的高可用 TSDB 存储集群?
- git 回退远端master/develop分支版本
热门文章
- 无人机/FPV穿越机航模的遥控器/接收机等配件厂商
- MIPI扫盲——DSI介绍(一)
- 20155313 杨瀚 《网络对抗技术》实验四 恶意代码分析
- Verilog 任意整数分频器
- 高端大气上档次!10个精美的国外HTML5网站欣赏
- python excel 复制行_通过python复制excel行
- python中怎么压缩文件_如何使用Python实现文件压缩?
- Code3 将文件转换到byte数组中
- 数仓(五):数据建模--ER模型/维度建模,概念模型/逻辑模型/ 物理模型
- android 音量调节不起作用,Android音量控制