k8s进阶-容器探测
admin
2024-05-03 17:52:55
0

前言

容器探测用于检测容器中的应用实例是否正常工作,通过向目前容器周期性发出不同方式的探针,以检测目标实例的健康状态,k8s环境下微服务应用的健康监控是必不可少的环节,本章节也将结合springboot健康检查插件来整合支持k8s的容器探测

探针类型

存活探针- LivenessProbe

kubelet 使用存活探针来检测应用实例当前是否处于正常运行状态,确定什么时候要重启容器。 例如,存活探针可以探测到应用死锁(应用程序在运行,但是无法继续执行后面的步骤)情况。重启探测失败状态的容器有助于提高应用的可用性

就绪探针- ReadinessProbe

kubelet 使用就绪探针可以知道容器何时准备好接受请求流量,当一个 Pod 内的所有容器都就绪时,才能认为该 Pod 就绪。 这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端,若 Pod 尚未就绪,会被从 Service 的负载均衡器中剔除

启动探针- StartupProbe

kubelet 使用启动探针来了解应用容器何时启动。 如果配置了这类探针,就可以控制容器在启动成功后再进行存活性[liveness]和就绪态[readiness]检查, 确保这些存活、就绪探针不会影响应用的启动。 启动探针可以用于对慢启动容器进行存活性检测,避免它们在启动运行之前就被杀掉

探针参数

探针有很多配置字段,可以使用这些字段精确地控制启动、存活和就绪检测的行为

  • initialDelaySeconds:容器启动后要等待多少秒后才启动启动、存活和就绪探针, 默认是 0 秒,最小值是 0
  • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒,最小值是 1
  • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒,最小值是 1
  • successThreshold:探针在失败后,被视为成功的最小连续成功数,默认值是 1。存活和启动探测的这个值必须是 1,最小值是 1
  • failureThreshold:当探测失败时,Kubernetes 的重试次数。 对于存活探测而言,放弃就意味着重新启动容器。 对就绪探测而言,放弃意味着 Pod 会被打上未就绪的标签。默认值是 3,最小值是 1

探测方式

Exec命令 - 以存活探针为例

创建文件exec-liveness.yaml

apiVersion: v1
kind: Pod
metadata:labels:app: livenessname: liveness-execnamespace: probe
spec:containers:- name: nginximage: nginx:latestargs: - /bin/sh- -c- touch /tmp/liveness; sleep 30; rm -f /tmp/liveness; sleep 300livenessProbe:exec:command:- cat- /tmp/livenessinitialDelaySeconds: 5periodSeconds: 5

在配置文件中,periodSeconds 字段指定了 kubelet 每 5 秒执行一次存活探测。initialDelaySeconds 指定 kubelet 在执行第一次探测前应该等待 5 秒。 kubelet 在容器内执行命令 cat /tmp/liveness 来进行探测, 如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的,如果这个命令返回非0值,kubelet 会杀死这个容器并重新启动它

在容器启动时,将执行如下命令:
/bin/sh -c "touch /tmp/liveness; sleep 30; rm -f /tmp/liveness; sleep 300"

容器生命的前 30 秒,/tmp/liveness 文件是存在的,即在容器启动后的 30 秒内,执行命令 cat /tmp/liveness 会返回成功,30 秒之后文件被删除,再次执行命令 cat /tmp/liveness 时就会返回失败,kubectl会对容器进行重启

创建Pod

$ kubectl apply -f ./exec-liveness.yaml

30秒内查看pod的状态

$ kubectl describe pod liveness-exec -n probe

输出结果显示pod创建成功

Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  38s   default-scheduler  Successfully assigned probe/liveness-exec to k8s-node1Normal  Pulling    37s   kubelet            Pulling image "nginx:latest"Normal  Pulled     22s   kubelet            Successfully pulled image "nginx:latest" in 15.416721868sNormal  Created    22s   kubelet            Created container nginxNormal  Started    22s   kubelet            Started container nginx

等到35秒再次查看pod的状态,显示liveness探测失败,Container nginx failed liveness probe, will be restarted\n Container nginx failed liveness probe, will be restarted,容器被重启

Events:Type     Reason     Age                  From               Message----     ------     ----                 ----               -------Normal   Scheduled  3m26s                default-scheduler  Successfully assigned probe/liveness-exec to k8s-node1Normal   Pulled     3m11s                kubelet            Successfully pulled image "nginx:latest" in 15.416721868sNormal   Pulled     104s                 kubelet            Successfully pulled image "nginx:latest" in 15.370383805sWarning  Unhealthy  60s (x6 over 2m40s)  kubelet            Liveness probe failed: cat: /tmp/healthy: No such file or directoryNormal   Killing    60s (x2 over 2m30s)  kubelet            Container nginx failed liveness probe, will be restartedNormal   Pulling    30s (x3 over 3m26s)  kubelet            Pulling image "nginx:latest"Normal   Created    14s (x3 over 3m11s)  kubelet            Created container nginxNormal   Started    14s (x3 over 3m11s)  kubelet            Started container nginxNormal   Pulled     14s                  kubelet            Successfully pulled image "nginx:latest" in 15.368988721s

此时查看pod状态,显示容器重启次数增加了1

$ kubectl get pod liveness-exec -n probe
--------------------------------------------------------
NAME            READY   STATUS             RESTARTS   AGE
liveness-exec   0/1     CrashLoopBackOff   1          1m

HttpGet - 以存活探针为例

创建文件http-liveness.yaml

apiVersion: v1
kind: Pod
metadata:labels:app: livenessname: liveness-httpnamespace: probe
spec:containers:- name: nginximage: nginx:latestlivenessProbe:httpGet:path: /port: 80scheme: HTTPhttpHeaders:- name: Acceptvalue: application/jsoninitialDelaySeconds: 5periodSeconds: 5

在配置文件中,periodSeconds 指定了 kubelet 应该每 5 秒执行一次存活探测,initialDelaySeconds 指定 kubelet 在容器启动后等待 5 秒再开始探测。kubelet 会向容器内运行的服务(host-默认为pod的ip,port为80)发送一个HTTP GET 请求来执行探测, 如果服务器上 "/" 路径下的处理程序返回成功,则 kubelet 认为容器是健康存活的,如果处理程序返回失败,则 kubelet 会杀死这个容器并将其重启

判断标准:返回大于或等于 200 并且小于 400 的任何代码都标示成功,其它返回代码都标示失败

创建pod

$ kubectl apply -f ./http-liveness.yaml

容器启动后,控测的地址http://podid:80/为nginx服务的首页,即正常返回200状态码,pod状态显示创建成功

$ kubectl describe pod -n probe
Events:Type    Reason     Age   From               Message----    ------     ----  ----               -------Normal  Scheduled  42s   default-scheduler  Successfully assigned probe/liveness-http to k8s-node1Normal  Pulling    42s   kubelet            Pulling image "nginx:latest"Normal  Pulled     26s   kubelet            Successfully pulled image "nginx:latest" in 16.461481089sNormal  Created    26s   kubelet            Created container nginxNormal  Started    26s   kubelet            Started container nginx-------------------------------------------------------------------
$ kubectl get pod -n probe
NAME            READY   STATUS    RESTARTS   AGE
liveness-http   1/1     Running   0          1m

接着修改yaml文件,指定path路径为 "/abc",脚本片断如下:

containers:- name: nginximage: nginx:latestlivenessProbe:httpGet:#修改路径为/abcpath: /abcport: 80scheme: HTTP

此时,kubelet访问的探测地址为http://podid:80/abc,因nginx服务不存在该路径地址,则返回404状态码,查看pod状态显示健康检查失败,Liveness probe failed: HTTP probe failed with statuscode: 404,kubelet 会杀死容器并再次重新启动容器

$ kubectl describe pod liveness-http -n probe
------------------------------------------------------------------
Events:Type     Reason     Age               From               Message----     ------     ----              ----               -------Normal   Scheduled  34s               default-scheduler  Successfully assigned probe/liveness-http to k8s-node1Normal   Pulled     19s               kubelet            Successfully pulled image "nginx:latest" in 15.467613921sNormal   Created    19s               kubelet            Created container nginxNormal   Started    18s               kubelet            Started container nginxNormal   Pulling    3s (x2 over 34s)  kubelet            Pulling image "nginx:latest"Warning  Unhealthy  3s (x3 over 13s)  kubelet            Liveness probe failed: HTTP probe failed with statuscode: 404Normal   Killing    3s                kubelet            Container nginx failed liveness probe, will be restarted

TcpSocket - 以就绪探针和存活探针为例

TCP 检测的配置和 HTTP 检测方式相近,只需要配置端口即可。如果能建立连接,这个容器就被看作是健康的,脚本片断如下:

 containers:- name: nginximage: nginx:latestreadinessProbe:tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 10livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20

gRPC - 以存活探针为例

在 Kubernetes 1.23 之前,gRPC 健康探测通常使用 grpc-health-probe 来实现。v1.24版本以后就可以使用内置gRPC探针,但必须先启用 GRPCContainerProbe 特性门控才能配置依赖于 gRPC 的检查机制。因gRPC探测容器存活的方式比较少见,这里暂不做详细描述,参考博客地址:https://kubernetes.io/blog/2018/10/01/health-checking-grpc-servers-on-kubernetes/

脚本片断如下:

 containers:- name: nginximage: nginx:latestlivenessProbe:grpc:port: 2379initialDelaySeconds: 10

集成SpringBoot Actuator

一、配置pom.xml,引入actuator模块

org.springframework.bootspring-boot-starter-actuator

二、配置application.properties,定义liveness和readiness分组

management.endpoint.health.probes.enabled=true
management.endpoint.health.group.liveness.include=livenessState,ping
management.endpoint.health.group.readiness.include=readinessState
#配置health Endpoints暴露在web环境下(即可通过url访问)
management.endpoints.web.exposure.include=health,info
#默认为/actuator
management.endpoints.web.basePath=/actuator

样例中liveness分组会执行LivenessStateHealthIndicator和PingHealthIndicator两个检查器,当两个检查器状态同时为UP时,liveness分组状态为UP,访问路径http://localhost:8080/actuator/health/liveness

响应:{"status":"UP","components":{"livenessState":{"status":"UP"},"ping":{"status":"UP"}}}

样例中readiness分组只执行ReadinessStateHealthIndicator检查器,访问路径http://localhost:8080/actuator/health/readiness

响应:{"status":"UP","components":{"readinessState":{"status":"UP"}}}

三、配置K8S容器检测 - 存活探针和就绪探针,yaml文件片断如下:

livenessProbe:failureThreshold: 3periodSeconds: 30successThreshold: 1timeoutSeconds: 6httpGet:path: /actuator/health/livenessport: 8080scheme: HTTP
readinessProbe:failureThreshold: 3periodSeconds: 15successThreshold: 3timeoutSeconds: 3httpGet:path: /actuator/health/readinessport: 8080scheme: HTTP

总结

1、存活探针不会等待就绪性探针成功
2、如果就绪态探针实现不正确,可能会导致容器中进程的数量不断上升
3、如果要在执行存活探针之前等待,可以使用 initialDelaySeconds startupProbe
4、针对 HTTP 或 TCP 探测,通过将启动探针 failureThreshold * periodSeconds 参数设置为足够长的时间来保护慢启动容器

(完)

相关内容

热门资讯

AI冲击银行就业!渣打宣布裁员... 人工智能加速渗透金融业,全球银行业就业格局正面临深刻重构。 据英国《金融时报》周二报道,渣打银行首席...
跨境电商圈常说的IP关联到底是... 在跨境电商和海外社媒运营的圈子里,有一个词被提起的频率几乎和“封号”一样高——IP关联。新手听到这个...
今日头条!金茂、金地纷纷下场,... 进入5月,继德通下场拿地之后,今天金茂、金地也纷纷在西安土地市场出手。 截至目前,今年二季度在西安土...
亮成本!5月来中小银行密集响应... 财联社5月19日讯(记者 彭科峰)在央行一季度货币政策执行报告明确发声“持续深化明示企业贷款综合融资...
泰国服装电商市场趋势洞察报告 今天分享的是:泰国服装电商市场趋势洞察报告 报告共计:14页 这份报告聚焦泰国服装电商市场,以Sho...
金饰克价年内大跌300元!从全... 2026年5月16日,国内黄金市场迎来标志性时刻:周生生、老凤祥、老庙黄金等主流品牌足金首饰价格集体...
信达证券股份有限公司 关于召开... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
卫星ETF(159218)连续... 近日,卫星产业链迎来重磅信号。马斯克表示,SpaceX今年或在火箭完全快速可复用性方面取得成功,这将...
国企举报前高管利用职务便利侵吞... 2013年,北京国润水清环境工程有限公司(以下简称“国润公司”)通过招商引资,与当地政府签订郑州市上...
原创 账... 2026年开年至今,印度能源进口账单持续疯狂飙升,彻底击穿了该国的经济防线,多重危机叠加形成致命反噬...
完成喜马拉雅收购,腾讯音乐全员... 转自:贝壳财经 新京报贝壳财经讯(记者韦英姿)5月18日,腾讯音乐发布公告称,根据并购协议的条款,收...
美股三大指数涨跌不一,美光、应... 美股三大指数收盘涨跌不一,纳指跌0.51%,标普500指数跌0.07%,道指涨0.32%。费城半导体...
A股午评:超2900只个股飘绿... 19日,A股三大指数低开,沪指翻红。截至午间收盘,沪指涨0.02%,深证成指跌0.78%,创业板指跌...
如何选择小红书推广服务?效果及... 在当今数字化营销的浪潮中,小红书作为一个极具影响力的社交平台,吸引了众多品牌和企业的关注。对于希望在...
人工智能概念股走弱,创业板人工... 人工智能概念股走弱,天孚通信跌超8%,新易盛跌超6%,中际旭创跌超4%。 受盘面影响,创业板人工智能...
大金重工(002487.SZ)... 览富财经网讯:5月18日,港交所官网显示,大金重工股份有限公司(大金重工)已递交聆讯后资料集,登陆香...
深演智能将在港上市:业绩下滑明... 来源|贝多商业&贝多财经 5月18日,北京深演智能科技股份有限公司(下称“深演智能”,HK:0272...
退税更省心、更省时、更省事,六... 离境退税政策2.0版“上线”。5月18日,商务部、财政部、国家税务总局等六部门发布《关于加力优化离境...
原创 全... 美国总喜欢卡别人脖子,挥舞制裁大棒,如今却面临被制裁的问题,尤其是在稀土领域。 在2025年4月,中...
芯片、存储概念股下挫!美光科技... 【导读】美股三大指数涨跌不一。芯片、存储概念股下挫,美光科技大跌近6% 中国基金报记者 伊万 美东时...