我们以kubernetes官方demo为例:
apiVersion:v1kind:Podmetadata: labels: test:liveness name:liveness-execspec: containers: - name:liveness image:busybox args: -/bin/sh --c -touch/tmp/healthy;sleep30;rm-rf/tmp/healthy;sleep600 livenessProbe: exec: command: -cat -/tmp/healthy initialDelaySeconds:5# 指示kubectl等待5s才执行首次探测 periodSeconds:5# 间隔5秒轮询
在第5秒kubectl开始首次liveness探测
在30秒进行的每次探测均成功
30s之后容器内文件被删除,之后间隔5s的探测会失败,根据liveness默认配置连续3次失败就会放弃探测,放弃探测意味着重启容器,故容器会在第45s重启
重启之后又开始以上流程, 故可以看到此探针以重启的决策尝试修复应用问题。
本次探针导致的容器重启会体现到kubectl get pod的RESTARTS列
Readiness Probes
使用[就绪探针]判断容器是否就绪,是否可以接受流量。
Pod内所有容器ready,则该Pod被认为ready,当pod没有ready,将会从服务负载均衡中移除。
有些时候,应用程序临时不可用(加载大量数据或者依赖外部服务),这个时候,重启这个Pod无济于事,同时你也不希望请求被发送到该Pod
下面的应用强依赖mongodb,我们针对这些依赖项设置了readiness探针
services.AddHealthChecks() .AddCheck(nameof(MongoHealthCheck),tags:new[] {"readyz"});// ----------------------app.UseHealthChecks("/readyz",newHealthCheckOptions{ Predicate =(check) =>check.Tags.Contains("readyz")});
以下是探测Mongodb的连通性
sealedclassMongoHealthCheck:IHealthCheck{privatereadonlyIMongoDatabase _defaultMongoDatabase;publicMongoHealthCheck(IDefaultMongoDatabaseProvider defaultMongoDatabaseProvider){ _defaultMongoDatabase = defaultMongoDatabaseProvider.GetDatabase(); }publicasyncTaskCheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken =default){vardoc =await_defaultMongoDatabase.RunCommandAsync(newBsonDocumentCommand(newBsonDocument() { {"ping","1"} }), cancellationToken: cancellationToken);varok = doc["ok"].ToBoolean();if(ok) {returnHealthCheckResult.Healthy("OK"); }returnHealthCheckResult.Unhealthy("NotOK"); } }
对于依赖项的探测,探测周期和超时时间可以设置的稍长一点
readinessProbe: httpGet: path:/readyz port:80 initialDelaySeconds:5 periodSeconds:60# 60s探测一次 timeoutSeconds:30# 每次探测30s超时,与应用建立与依赖项的连接超时时间一致 failureThreshold:3# 连续3次探测失败,该Pod会被标记为`Unready`
Startup Probes
使用[启动探针]判断容器应用是否已经启动。如果配置了这个探针,则该探针成功之前将会禁用存活和就绪探针。
配置探针
initialDelaySeconds:容器启动,探针延后工作,默认是0s
periodSeconds 探针探测周期,默认10s
timeoutSeconds: 探针工作的超时时间,默认1s
successThreshold: 连续几次探测成功,该探针被认为是成功的,默认1次
failureThreshold: 连续几次探测失败,该探针被认为最终失败,对于livenes探针最终失败意味着重启,对于readiness探针意味着该pod Unready, 默认3次。
深圳网站优化www.zg886.cn