ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

5分钟搞懂 Kubernetes 探针/健康检查

2022-02-28 14:01:12  阅读:203  来源: 互联网

标签:liveness Kubernetes exec probe 探针 搞懂 pod


5分钟搞懂 Kubernetes 探针/健康检查

K8S中文社区 2022-02-23 18:00

Kubernetes是一个开源容器编排平台,大大简化了应用程序的创建和管理。

Kubernetes之类的分布式系统可能很难管理,原因是涉及许多活动组件,所有这些组件必须正常工作,整个系统才能顺畅运行。即使某个小组件坏掉,也需要检测和修复它。

这些操作还需要自动化。Kubernetes让我们可以借助就绪探针和存活探针做到这一点。本文详细讨论了这些探针,在此之前先讨论一下健康检查。

 

01

什么是健康检查?

 

健康检查是一种让系统知道应用程序实例是否正常运行的简单方法。如果你的应用程序实例未正常运行,其他服务不会访问它或向它发送请求。相反,会将请求发送到另一个准备就绪的实例,或者你应该重试发送请求。

系统应该能够使你的应用程序处于健康状态。默认情况下,pod内的所有容器都已启动后,Kubernetes会开始向该pod发送流量。容器崩溃时,Kubernetes会重启容器。这个默认行为应该足以开始上手。由于Kubernetes有助于创建自定义健康检查,提高部署稳健性就变得比较简单,现在我们先讨论一下pod生命周期。

 

02

pod生命周期

 

Kubernetes pod遵循已定义的生命周期。这些是不同的阶段:

• pod首次创建后,从pending(挂起)阶段开始。调度器试图搞清楚把pod放置在哪里。如果调度器找不到放置pod的节点,它将保持挂起状态。(要检查pod为何处于挂起状态,运行kubectl describe pod <pod name>命令)。

• 一旦pod被调度,它进入容器creating(创建)阶段,在此阶段拉取应用程序所需的镜像,随后容器启动。

• 一旦容器在pod中,它进入running(运行)阶段,在此阶段它继续运行,直至程序成功完成或终止。

要检查pod的状态,请运行kubectl get pod命令,检查STATUS列。如你所见,在这种情况下,所有pod都处于运行状态。此外,READY列表明pod已准备好接受用户流量。

# kubectl get podNAME READY STATUS RESTARTS AGEmy-nginx-6b74b79f57-fldq6 1/1 Running 0 20smy-nginx-6b74b79f57-n67wp 1/1 Running 0 20smy-nginx-6b74b79f57-r6pcq 1/1 Running 0 20s

 

 

03

Kubernetes中不同类型的探针

 

Kubernetes提供了以下类型的健康检查:

 就绪探针:该探针将告诉你应用程序何时准备为流量提供服务。在允许服务向pod发送流量之前,Kubernetes将确保就绪探针通过。如果就绪探针未通过,Kubernetes不会向pod发送流量,直至探针通过。

• 存活探针:存活探针会让Kubernetes可以知道你的应用程序是否健康。如果应用程序健康,Kubernetes不会干扰pod的运行,但如果不健康,Kubernetes就会销毁pod,并启动新的pod来替换它。

为了进一步理解这点,不妨以实际场景为例。你的应用程序需要一些时间来预热,或从GitHub等某个外部源下载应用程序内容。除非完全准备好,否则你的应用程序不会接受流量。默认情况下,一旦容器内的进程启动,Kubernetes就会开始发送流量。使用就绪探针,Kubernetes会等到应用程序完全启动后,才允许服务将流量发送到新副本。

不妨看另一种场景:你的应用程序因代码错误而崩溃(可能是极端情况),并且无限期挂起,停止为请求提供服务。由于你的进程默认继续运行,Kubernetes会将流量发送到坏掉的pod。使用存活探针,Kubernetes将检测到应用程序不再为请求提供服务,默认情况下重启出故障的pod。

现在看看如何定义探针。探针有三种类型:

• HTTP

• TCP

• 命令

注意:你可以选择从定义就绪探针或存活探针开始,因为两者的实现都需要类似的模板。比如说,如果我们先定义存活探针,可以使用它来定义就绪探针,反之亦然。

• HTTP探针(httpGet):这是最常见的探针类型。即使你的应用程序不是HTTP服务器,通常也可以在应用程序内创建轻量级 HTTP服务器以响应存活探针。Kubernetes将在特定端口(本例中端口8080)测式ping路径(比如/healthz)。如果它收到200或300范围内的HTTP响应,将被标记为健康。(想进一步了解HTTP响应代码,请参阅该链接https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)。否则,它会被标记为不健康。以下是定义HTTP存活探针的方法:

livenessProbe:httpGet:path: /healthzport: 8080

HTTP就绪探针的定义与HTTP存活探针类似,你只需要把liveness换成readiness。

readinessProbe:httpGet:path: /healthzport: 8080

• TCP探针(tcpSocket):使用TCP探针,Kubernetes会尝试在指定端口(比如下例中的8080端口)建立TCP连接。如果可以建立连接,则认为容器是健康的。如果不能,视为失败。在HTTP或命令探针无法正常工作的情况下,这些探针会很方便。比如说,FTP服务将能够使用这种类型的探针。

readinessProbe:tcpSocket:port: 8080

• 命令探针(exec命令):在命令探针情况下,Kubernetes将在你的容器内运行命令。如果命令返回退出代码0,容器将被标记为健康。否则,将被标记为不健康。当你不能或不想运行HTTP服务器时,这种类型的探针很有用,但你可以运行命令来检查应用程序是否健康。在下面示例中,我们检查文件/tmp/healthy是否存在;如果命令返回退出代码0,容器将被标记为健康;否则,它将被标记为不健康。

livenessProbe:exec:command:- cat- /tmp/healthy

可根据需要运行的频率、成功和失败阈值以及等待响应的时间,以多种方式配置探针。

• initialDelaySeconds(默认值0):如果你知道应用程序需要n秒(比如30秒)来预热,可以使用initialDelaySeconds来添加延迟(以秒为单位),直至执行第一次检查。

• periodSeconds(默认值10):如果你想要指定执行检查的频率,可以使用periodSeconds来定义。

• timeoutSeconds(默认值1):这定义了探针操作超时之前的最大秒数。

• successThreshold(默认值1):这是在失败后探针直至被认为成功的尝试次数。

• failureThreshold(默认值 3):万一探针失败,Kubernetes会尝试多次,然后将探针标记为失败。

注意:默认情况下,如果应用程序在尝试3次后仍未准备好,探针将停止。如果是存活探针,它将重启容器。如果是就绪探针,它会将pod标记为不健康。

有关探针配置的更多信息,请参阅该链接:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes。

不妨结合到目前为止已讨论过的所有内容。这里要注意的关键是readinessProbe与httpGet的使用。第一次检查将在10秒后执行,然后每5秒重复一次。

apiVersion: v1kind: Pod metadata:labels:run: nginxname: nginxspec:containers:- image: nginxname: nginxreadinessProbe:httpGet:path: /port: 80initialDelaySeconds: 10periodSeconds: 5

• 要创建pod,请使用kubectl create命令,并使用-f标志指定YAML清单文件。你可以为该文件取任何名称,但后缀名应该是.yaml。

kubectl create -f readinessprobe.yamlpod/nginx created

• 如果你现在检查pod的状态,它应该在STATUS列下显示状态为Running。但如果你检查READY列,它仍然会显示0/1,这意味着它没有准备好接受新的连接。

kubectl get podNAME READY STATUS RESTARTS AGEnginx 0/1 Running 0 16s

• 由于我们将初始延迟设置为1秒,几秒钟后验证状态。现在,pod应该在运行。

kubectl get podNAME READY STATUS RESTARTS AGEnginx 1/1 Running 0 28s

• 要检查定义就绪探针时使用的所有参数(比如initialDelaySeconds、periodSeconds等)的详细状态,运行kubectl describe命令。

kubectl describe pod nginx |grep -i readinessReadiness: http-get http://:80/ delay=10s timeout=1s period=5s #success=1 #failure=3

不妨通过一个例子进一步加深对存活探针和就绪探针概念的了解。先从活性探针开始。在下面例子中,我们在执行命令:

touch healthy; sleep 20; rm -rf healthy; sleep 600’。

借助该命令,我们使用touch 命令创建了文件名“healthy”。该文件前20秒将存在于容器中,然后使用rm -rf命令将其删除。最后,容器将休眠600秒。

随后我们定义了存活探针。它先使用cat health命令检查该文件是否存在。它以5秒的初始延迟完成此操作。我们进一步定义了参数periodSeconds,它每5秒就执行存活探针。一旦我们删除该文件,20秒后,探针将处于失败状态。

apiVersion: v1kind: Podmetadata:labels:name: liveness-probe-execspec:containers:- name: liveness-probeimage: busyboxargs:- /bin/sh- -c- touch healthy; sleep 20; rm -rf healthy; sleep 600livenessProbe:exec:command:- cat- healthyinitialDelaySeconds: 5periodSeconds: 5

• 要创建pod,将上述代码存储在以.yaml结尾的文件中(比如liveness-probe.yaml),然后使用-f <file name> 执行kubectl create命令,这将创建pod。

# kubectl create -f liveness-probe.yamlpod/liveness-probe-exec created

• 运行kubectl get events命令,你会看到存活探针已失败,容器已被杀死并重启。

54s Normal Scheduled pod/liveness-probe-exec Successfully assigned default/liveness-probe-exec to controlplane53s Normal Pulling pod/liveness-probe-exec Pulling image "busybox"52s Normal Pulled pod/liveness-probe-exec Successfully pulled image "busybox" in 384.330188ms52s Normal Created pod/liveness-probe-exec Created container liveness-probe52s Normal Started pod/liveness-probe-exec Started container liveness-probe18s Warning Unhealthy pod/liveness-probe-exec Liveness probe failed: cat: can't open 'healthy': No such file or directory18s Normal Killing pod/liveness-probe-exec Container liveness-probe failed liveness probe, will be restarted

• 你还可以使用kubectl get pods命令进行验证,正如你在重启列中看到,容器重启了一次。

# kubectl get podsNAME READY STATUS RESTARTS AGEliveness-probe-exec 1/1 Running 1 24s

• 现在你已了解存活探针的工作原理,不妨调整上面的例子将其定义为就绪探针,以此了解就绪探针的工作原理。在下面例子中,我们在容器内执行命令(sleep 20; touch healthy; sleep 600),它先休眠20秒,创建一个文件,最后休眠600秒。由于初始延迟设置为15秒,第一次检查以15 秒延迟来执行。

apiVersion: v1kind: Podmetadata:labels:name: readiness-probe-execspec:containers:- name: readiness-probeimage: busyboxargs:- /bin/sh- -c- sleep 20;touch healthy;sleep 600readinessProbe:exec:command:- cat- healthyinitialDelaySeconds: 15periodSeconds: 5

• 要创建pod,将上述代码存储在以.yaml结尾的文件中,然后执行kubectl create命令,该命令将创建pod。

# kubectl create -f readiness-probe.yamlpod/readiness-probe-exec created

• 如果你在这里执行kubectl get events,会看到探针失败,因为文件不存在。

63s Normal Scheduled pod/readiness-probe-exec Successfully assigned default/readiness-probe-exec to controlplane62s Normal Pulling pod/readiness-probe-exec Pulling image "busybox"62s Normal Pulled pod/readiness-probe-exec Successfully pulled image "busybox" in 156.57701ms61s Normal Created pod/readiness-probe-exec Created container readiness-probe61s Normal Started pod/readiness-probe-exec Started container readiness-probe42s Warning Unhealthy pod/readiness-probe-exec Readiness probe failed: cat: can't open 'healthy': No such file or directoryIf you check the status of the container initially, it is not in a ready state.# kubectl get podsNAME READY STATUS RESTARTS AGEreadiness-probe-exec 0/1 Running 0 5s

• 但是如果你在20秒后检查它,它应该处于运行状态。

# kubectl get podsNAME READY STATUS RESTARTS AGE readiness-probe-exec 1/1 Running 0 27s

结论

任何分布式系统都需要检查健康,Kubernetes也不例外。使用健康检查为你的Kubernetes服务提供稳固的基础、更高的可靠性和更长的正常运行时间。

参考:https://www.kubernetes.org.cn/9833.html

标签:liveness,Kubernetes,exec,probe,探针,搞懂,pod
来源: https://www.cnblogs.com/cheyunhua/p/15945284.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有