原文出处:https://www.kubernetes.org.cn/2362.html

当你使用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: v1kind: Podmetadata:labels:test: livenessname: liveness-execspec: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 worker023s       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 worker036s       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 86849c15382e2s        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: v1kind: Podmetadata:labels:test: livenessname: liveness-httpspec: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头。

转载于:https://my.oschina.net/xiaominmin/blog/3069657

Kubernetes中配置Pod的liveness和readiness探针相关推荐

  1. pod配置Liveness和Readiness探针

    全栈工程师开发手册 (作者:栾鹏) 架构系列文章 本文将向您展示如何配置容器的存活和可读性探针. kubelet 使用 liveness probe(存活探针)来确定何时重启容器.例如,当应用程序处于 ...

  2. Kubernetes 中创建 Pod 时集群中到底发生了些什么?

    想象一下,如果我想将 nginx 部署到 Kubernetes 集群,我可能会在终端中输入类似这样的命令: $ kubectl run --image=nginx --replicas=3 然后回车. ...

  3. Kubernetes 中 Evicted pod 是如何产生的

    线上被驱逐实例数据 最近在线上发现很多实例处于 Evicted 状态,通过 pod yaml 可以看到实例是因为节点资源不足被驱逐,但是这些实例并没有被自动清理,平台的大部分用户在操作时看到服务下面出 ...

  4. Kubernetes 中 设置pod不部署在同一台节点上

    在k8s中,节点的调度主要由亲和性和污点来进行控制的.   而在亲和性部分由分为了节点亲和性和节点反亲和性.   节点亲和性是指在pod部署时,尽量(软策略)或者必须满足(硬策略)部署在某些节点上. ...

  5. Kubernetes 学习总结(25)—— Kubernetes 中的 pod 与容器的区别和联系

    前言 容器本可以成为轻量级虚拟机的替代品.但是由于 Docker/OCI 的标准化,最广泛使用的容器形式是每个容器只有一个进程服务.这种方法有很多优点--增加隔离性.简化水平扩展.更高的可重用性等.但 ...

  6. Kubernetes中配置livenessProbe、readinessProbe和startupProbe

    livenessProbe.readinessProbe和startupProbe作用 kubelet使用livenessProbe(存活探针)来判断何时重启容器.例如,当程序中产生死锁的时候,程序还 ...

  7. Kubernetes 中的 Pod 是什么?

    前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...

  8. Kubernetes 中的 Pod 安全策略

    很多人分不清 SecurityContext 和 PodSecurityPolicy 这两个关键字的差别,其实很简单: •SecurityContext 是 Pod 中的一个字段,而 PSP 是一个独 ...

  9. kubernetes中给pod加hosts解析

    在一些环境中,有些服务会绑定一个域名,这个时候我们想去访问这个服务的域名就需要做下对应的解析,经常使用的做法是在主机的/etc/hosts文件里面加上域名对应的ip方可访问,如果给在k8s上运行的po ...

  10. Liveness和Readiness两种Health Check手段在Kubernetes中的使用

    一.概述 强大的自愈能力是Kubernetes这一类容器编排管理引擎的一个重要特性.通常情况下,Kubernetes通过重启发生故障的容器来实现自愈.除此之外,我们还有其他方式来实现基于Kuberne ...

最新文章

  1. easyui datagrid 表格动态隐藏部分列的展示
  2. 计算机视觉>>PCV安装和使用
  3. libevent java_libevent简介
  4. String类型数组 根据首字母排序
  5. Qt元对象QMetaObject的indexOfSlot等函数获取类方法注意问题
  6. C# 图像模板匹配并标注
  7. 关于a标签不能调用js方法的小细节,你注意到了么?
  8. python struct pack一个数组_Python中struct.pack的一个疑问
  9. 实现文件拖放的一种简洁方法
  10. Windows不需要输密码,直接登录显示桌面
  11. 黑马程序员——OC代码规范和编程风格
  12. 软件获取手机的ime权限_【干货】解锁VIP会员权限,两款手机必备剪辑软件,免登陆,1080P输出无压力!...
  13. SOLIDWORKS教程:solidworks设计绘图的七大实用技巧
  14. 关于指针总结(指针种类,概念,作用与用途)
  15. MySQL最全整理!java技术总监面试常见问题及答案
  16. 京东价格监控软件开发技术探讨七:如何获取京东商品评价信息
  17. 盘点一个Python面向对象的基础问题
  18. 无意中发现软件下载网站 softonic
  19. CS全球排名44,复旦计科实力如何?
  20. markdown中如何设置图片的显示大小

热门文章

  1. 计算机信息中心管理制度,信息技术中心内部管理制度(试行)
  2. 城市聚焦:全球十二大性感之城
  3. Python爬虫爬取网页数据
  4. Mysql数据库死锁实战-死锁演示-排他锁的相互等待
  5. 聊聊大龄程序员的一条出路
  6. 民宿管理系统课程设计_民宿室内设计毕业设计
  7. 4.1 制定项目章程
  8. LOJ10099矿场搭建
  9. steam怎么共享计算机游戏,steam怎么共享游戏给好友?steam向好友共享游戏教程
  10. 题目 2291: [蓝桥杯][2018年第九届真题]调手表(BFS)