在设计关键任务、高可用应用程序时,弹性是要考虑的最重要因素之一。

当应用程序可以快速从故障中恢复时,它便具有弹性。

云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中。为了确保Kubernetes托管的应用程序高可用,在设计集群时需要遵循一些特定的模式,其中有“健康探测模式”。应用高可观察性原则(HOP)可确保您的应用程序收到的每个请求都能及时找到响应。

The High Observability Principle (HOP)

高可观察性原则是基于容器的应用程序设计原则之一。微服务体系要求每个服务不关心(也不应该关心)被调用方如何处理请求。

HOP原则要求每个服务必须公开几个API端点,其意义在于揭示服务健康状态,Kubernetes调用这些端点,决定下一步的路由和负载平衡

设计良好的云原生程序应将日志事件记录到STDERR和STDOUT,由logstash、Fluent等日志摄取服务将这些日志运送到集中式监控(例如Prometheus)和日志聚合系统(例如ELK)。下图说明了云原生应用程序如何遵守健康状况探测模式和高可观察性原则。

How to Apply Health Probe Pattern in Kubernetes?

我之前写过ASP.NetCore + Docker健康检查的原创:[web程序暴露http健康检查端点,平台轮询探测],Kubernetes针对不同场合细化了探针,更为强大的是给出对应决策。

Liveness Probes

使用[存活探针]判断什么时候重启容器。

使用存活探针检查容器本身是否无响应、死锁, 有时候重启容器常常能解决此类问题。

我们以kubernetes官方demo为例:

apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/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秒轮询
  • 在第5秒kubectl开始首次liveness探测
  • 在30秒进行的每次探测均成功
  • 30s之后容器内文件被删除,之后间隔5s的探测会失败,根据liveness默认配置连续3次失败就会放弃探测,放弃探测意味着重启容器,故容器会在第45s重启
  • 重启之后又开始以上流程, 故可以看到此探针以重启的决策尝试修复应用问题。

这个探针会体现到kubectl get podRESTARTS

Readiness Probes

使用[就绪探针]判断容器是否就绪,是否可以接受流量。

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`

Startup Probes

使用[启动探针]判断容器应用是否已经启动。如果配置了这个探针,则该探针成功之前将会禁用存活和就绪探针。

配置探针

  • initialDelaySeconds:容器启动,探针延后工作,默认是0s
  • periodSeconds 探针探测周期,默认10s
  • timeoutSeconds: 探针工作的超时时间,默认1s
  • successThreshold: 连续几次探测成功,该探针被认为是成功的,默认1次
  • failureThreshold: 连续几次探测失败,该探针被认为最终失败,对于livenes探针最终失败意味着重启,对于readiness探针意味着该pod Unready, 默认3次。

强烈建议根据应用结构合理设置探针参数,避免不切实际的认定失败导致的频繁重启或 Unready。

结论:

Kubernetes生态这么庞大,为啥单独拎出k8s探针, 是因为k8s探针是与应用程序结构密切相关的机制。

就使用方式看:

存活探针:用于快速判断应用进程是否无响应,尝试重启修复;

就绪探针:判断应用及依赖项是否就绪,是否可以分配流量,如果不能就标记Unready,从负载均衡器中移除该Pod

Kubernetes存活、就绪探针可以极大地提高服务的健壮性和弹性,并提供出色的最终用户体验。

Kubernetes 存活、就绪探针的更多相关文章

  1. 【七】Kubernetes 探针介绍 - 存活、就绪探针案例测试

    一.探针概述 探针是有 kubelet 对容器执行的定期诊断,并不是由 Master 节点发起的探测,而是由每一个 Node 所在的 kubelet 进行探测,这样可以减轻 Master 节点系统负载 ...

  2. kubernetes的存活探针和就绪探针

    1.存活探针 使用Kubernetes的一个主要好处是,可以给Kubernetes-个容器列表来由其保持容器在集群中的运行.可以通过让Kubernetes创建pod资源,为其选择一个工作节点并在该节点 ...

  3. kubernets之就绪探针

    一 介绍就绪探针 1.1  开始介绍就绪探针之前,让我们来提问几个问题?第一,在sevice这章我们了解到, 当流量从Ingress被转发到服务,然后服务从其维护当Endponits 里面列表查找到任 ...

  4. 掌握SpringBoot-2.3的容器探针:基础篇

    欢迎访问我的GitHub 地址:https://github.com/zq2599/blog_demos 内容:原创文章分类汇总,及配套源码,涉及Java.Docker.K8S.DevOPS等 关于& ...

  5. k8s 探针 exec多个判断条件条件 多个检测条件

    背景 1,之前我们的yaml文件里面有就绪探针. 2,探针是检测一个文件是否生成,生成了说明服务正常. 3,现在要加一个检测,也是一个文件是否存在并且不为空. 4,只有两个条件同时满足了 服务才算正常 ...

  6. Kubernetes Pod中容器的Liveness、Readiness和Startup探针

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 探针的作用 在Kubernetes的容器生命周期管理中,有三种探针,首先要知道,这探针是属于容器的,而不是Pod: 存 ...

  7. k8s 存活探针,滚动更新

    文章原文 存活探针 Kubelet使用liveness probe(存活探针)来确定何时重启容器.例如,当应用程序处于运行状态但无法做进一步操作,liveness探针将捕获到deadlock,重启处于 ...

  8. 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器?

    探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 探针配置失误,线上容器应用异常死锁后,kubernetes集群未及时响应自愈重启容器? 线上多个服务应用陷入了死 ...

  9. Kubernetes探针原理详解

    前言: 分布式系统和微服务体系结构的挑战之一是自动检测不正常的应用程序,并将请求(request)重新路由到其他可用系统,恢复损坏的组件.健康检查是应对该挑战的一种可靠方法.使用 Kubernetes ...

随机推荐

  1. NIO(一):Buffer缓冲区

    一.NIO与IO: IO:  一般泛指进行input/output操作(读写操作),Java IO其核心是字符流(inputstream/outputstream)和字节流(reader/writer ...

  2. CenterNet文献调研记录

    心仪院校导师任务之一,文献调研记录. 本文部分思路参考: 1. Anchor-Free 2. https://zhuanlan.zhihu.com/p/66048276 3. https://blog ...

  3. 响应式Web设计与CSS(上)

    1.一个例子 响应式Web设计最核心的一点,就是可以适配不同视口大小的流式布局. 1.1 简单上手 <div class="row"> <header class ...

  4. C#LeetCode刷题之#532-数组中的K-diff数对(K-diff Pairs in an Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3716 访问. 给定一个整数数组和一个整数 k, 你需要在数组里找 ...

  5. C#LeetCode刷题之#867-转置矩阵(Transpose Matrix)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3756 访问. 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的 ...

  6. C#LeetCode刷题之#747-至少是其他数字两倍的最大数( Largest Number At Least Twice of Others)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3746 访问. 在一个给定的数组nums中,总是存在一个最大元素 ...

  7. PowerJob 的自实现高可用方案,妙妙妙!

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. 碎碎念 高可用放到今天已经不是一个新颖的词汇了,怎 ...

  8. 用ps实现提高照片的清晰度

    首先通过ctrl+j 拷贝一份 然后选择滤镜-->其他-->高反差包留 选择叠加,就可以达到效果了,实在不行,多弄几层图层

  9. IntelliJ IDEA中如何再次调出springboot的依赖窗口

    原文链接:https://blog.csdn.net/qq_38138069/article/details/102528587 IDEA中如何再次调出springboot的依赖窗口,随时可以根据喜好 ...

  10. 关于Java中for循环的i++和++i区别

    我们应该都知道i++和++i的区别是: ++i是先执行 i = i +1 再使用 i 的值,而 i++ 是先使用 i 的值再执行 i = i + 1: for循环的执行顺序如下: for(a;b;c) ...