本篇内容介绍了“Kubernetes怎么判断什么时候重启容器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在设计关键任务、高可用应用程序时,弹性是要考虑的最重要因素之一。
当应用程序可以快速从故障中恢复时,它便具有弹性。
云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中。为了确保Kubernetes托管的应用程序高可用,在设计集群时需要遵循一些特定的模式,其中有“健康探测模式”。应用高可观察性原则(HOP)可确保您的应用程序收到的每个请求都能及时找到响应。
高可观察性原则是基于容器的应用程序设计原则之一。微服务体系要求每个服务不关心(也不应该关心)被调用方如何处理请求。
HOP原则要求每个服务必须公开几个API端点,其意义在于揭示服务健康状态,Kubernetes调用这些端点,决定下一步的路由和负载平衡。
“设计良好的云原生程序应将日志事件记录到STDERR和STDOUT,由logstash、Fluent等日志摄取服务将这些日志运送到集中式监控(例如Prometheus)和日志聚合系统(例如ELK)。下图说明了云原生应用程序如何遵守健康状况探测模式和高可观察性原则。
我之前写过ASP.NetCore + Docker健康检查的原创:[web程序暴露http健康检查端点,平台轮询探测],Kubernetes针对不同场合细化了探针,更为强大的是给出对应决策。
使用[存活探针]判断什么时候重启容器。
使用存活探针检查应用本身是否无响应、死锁, 有时候重启容器常常能解决此类问题。
我们以kubernetes官方demo为例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 指示kubectl等待5s才执行首次探测
periodSeconds: 5 # 间隔5秒轮询
这个探针会体现到kubectl get pod
的RESTARTS
列
使用[就绪探针]判断容器是否就绪,是否可以接受流量。
Pod内所有容器ready,则该Pod被认为ready,当pod没有ready,将会从服务负载均衡中移除。
“有些时候,应用程序临时不可用(加载大量数据或者依赖外部服务),这个时候,重启这个Pod无济于事,但你也不希望请求被发送到该Pod
下面的应用强依赖mongodb,我们针对这些依赖项设置了readiness探针
services.AddHealthChecks()
.AddCheck<MongoHealthCheck>(nameof(MongoHealthCheck), tags: new[] { "readyz" });
// ----------------------
app.UseHealthChecks("/readyz", new HealthCheckOptions
{
Predicate = (check) => check.Tags.Contains("readyz")
});
以下代码探测Mongodb的连通性
sealed class MongoHealthCheck : IHealthCheck
{
private readonly IMongoDatabase _defaultMongoDatabase;
public MongoHealthCheck(IDefaultMongoDatabaseProvider defaultMongoDatabaseProvider)
{
_defaultMongoDatabase = defaultMongoDatabaseProvider.GetDatabase();
}
public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
var doc = await _defaultMongoDatabase.RunCommandAsync(
new BsonDocumentCommand<BsonDocument>(
new BsonDocument() {
{ "ping", "1" }
}),
cancellationToken: cancellationToken);
var ok = doc["ok"].ToBoolean();
if (ok)
{
return HealthCheckResult.Healthy("OK");
}
return HealthCheckResult.Unhealthy("NotOK");
}
}
对于依赖项的探测,探测周期和超时时间可以设置的稍长一点
readinessProbe:
httpGet:
path: /readyz
port: 80
initialDelaySeconds: 5
periodSeconds: 60 # 60s探测一次
timeoutSeconds: 30 # 每次探测30s超时,与应用建立与依赖项的连接超时时间一致
failureThreshold: 3 # 连续3次探测失败,该Pod会被标记为`Unready`
使用[启动探针]判断容器应用是否已经启动。如果配置了这个探针,则该探针成功之前将会禁用存活和就绪探针。
强烈建议根据应用结构合理设置探针参数,避免不切实际的认定失败导致的频繁重启或 Unready。
“Kubernetes怎么判断什么时候重启容器”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。