Kubernetes Liveness and Readiness Probes

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

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

云原生应用程序通常设计为使用微服务架构,其中每个组件都位于容器中。为了确保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: livenessname: liveness-exec
spec:containers:- name: livenessimage: busyboxargs:- /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600livenessProbe:exec:command:- cat- /tmp/healthyinitialDelaySeconds: 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: /readyzport: 80initialDelaySeconds: 5periodSeconds: 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存活、就绪探针可以极大地提高服务的健壮性和弹性,并提供出色的最终用户体验。

干货周边也很重要

  1.   硬核技能k8s初体验

  2.  Docker-HealthCheck指令探测ASP.NET Core容器健康状态

如果本文对你有帮助,

不妨来个分享、点赞、在看三连

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「offer来了」2种递进学习思维,24道计网题目,保姆级巩固你的计网知识体系

「面试专栏」前端面试之计算机网络篇⚾序言&#x1f3d0;一、基础知识环节1、专栏学习2、书籍学习⚽二、思维导图环节&#x1f3b3;三、OSI七层模型1、OSI模型是什么&#xff1f;2、OSI七层模型遵循原则&#x1f3cf;四、TCP与UDP1、TCP与UDP的区别2、TCP/UDP的优缺点&#xff…

leetcode236. 二叉树的最近公共祖先

一:题目 二:上码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:/**思路:1.这里我们需要的是从底向上开…

进击吧! Blazor !第二期 页面制作

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

「软件项目管理」一文详解软件项目管理概述

一文详解软件项目管理概述&#x1f6b5;前言&#x1f93d;一、项目与软件项目1、项目的定义2、项目的特征3、项目与日常运作举例&#xff08;1&#xff09;判断哪些活动是项目&#xff08;2&#xff09;举例结果&#xff08;3&#xff09;项目与日常运作区别总结4、软件项目的特…

初识ABP vNext(9):ABP模块化开发-文件管理

点击上方蓝字"小黑在哪里"关注我吧创建模块模块开发应用服务运行模块单元测试模块使用前言在之前的章节中介绍过ABP扩展实体&#xff0c;当时在用户表扩展了用户头像字段&#xff0c;用户头像就涉及到文件上传和文件存储。文件上传是很多系统都会涉及到的一个基础功能…

「offer来了」浏览器原理被问懵?5大知识板块巩固你的http知识体系(3.6w字)

「面试专栏」前端面试之浏览器原理篇&#x1f3d4;️序言&#x1f304;一、http和https协议&#xff08;一&#xff09;http和https之间的关系&#x1f9ed;1、http和https是什么&#xff1f;2、http和https的区别&#xff08;二&#xff09;http协议&#x1f9ed;1、http1.0、…

使用Azure DevOps Pipeline实现.Net Core程序的CD

上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI。这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD。实现本次目标我们除了Azure DevOps外还需要&#xff1a;一台安装了Docker的主机一个 Docker Hub 账号上一次我们的CI实现了&#xff1a;发布>编…

TCP四次挥手(详解)

一:TCP四次挥手 1:图示 二:TCP四次挥手的过程 所谓的四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放&#xff0c;另一方被动释放。挥手之前主动释放连接的客户端结束ESTABLISHED阶段。随后开始“四次挥手”&#xff1a; a:首先客户端想要释放连接&#xff0c…

「软件项目管理」项目初始——项目确立与生存期模型

「软件项目管理」项目初始阶段——项目确立与生存期模型&#x1f6f0;️序言Preface&#x1f680;一、项目评估1、评估内容2、净利润与投资回报率3、举例阐述&#x1fa90;二、项目立项1、立项流程2、Make or Buy决策3、Make or Buy决策实例&#x1f6f8;三、项目招投标1、项目…

双城生活,一种相对无奈且幸福的选择

这是头哥侃码的第215篇原创我小时候经常被人问到一个问题&#xff1a;“你喜欢夏天还是冬天&#xff1f;”“夏天啊&#xff01;因为夏天可以有两个月的暑假&#xff0c;而且还可以玩水&#xff0c;还有清凉的盐水棒冰、短裤和凉拖&#xff0c;还可以在空调间里打游戏&#xff…

leetcode450. 删除二叉搜索树中的节点(详解)

一:题目 二:上码 1.确定递归函数和参数 TreeNode* deleteNode(TreeNode* root, int key) 这里的返回参数 我们也用一个指针接住&#xff0c;反正我们最终是返回的整棵树&#xff08;如果没找到那就是空&#xff09; 2.确定递归函数的终止条件 if(root NULL) return root; 3.确…

「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识

「面试专栏」前端面试之操作系统篇&#x1f3b9;序言&#x1f3b8;一、思维导图&#x1f3ba;二、常见面试题1、进程和线程以及它们的区别2、进程间通信的几种方式&#xff08;1&#xff09;管道(pipe)及命名管道(named pipe)&#xff08;2&#xff09;信号(signal)&#xff08…

推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架

JHRS一个新学WPF的IT老鸟&#xff0c;肝了2个月做了这么一个WPF企业级开发框架&#xff0c;站长clone学习&#xff0c;觉得甚是不错。这是一个使用了Prism搭建的插件式框架&#xff0c;封装了DataGrid的使用&#xff0c;使整个框架子模块简单易学、易扩展&#xff0c;特别是作者…

「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系

「面试专栏」前端面试之vuejs篇&#x1f5bc;️序言&#x1f399;️一、vue2.x基础知识预备&#x1f4fb;二、vue2.x基础知识常见面试题1、请说出vue.cli项目中src目录每个文件夹和文件的用法&#xff1f;2、vue.cli中怎样使用自定义的组件&#xff1f;有遇到过哪些问题&#x…

.NET Core 下使用 Apollo 配置中心

“Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且具备规范的权限、流程治理等特性&#xff0c;适用于微服务配置管理场景。服务…

「offer来了」从基础配置到高级配置,16大知识点带你巩固webpack知识体系

「面试专栏」前端面试之Webpack篇&#x1f9e9;序言&#x1f3a8;一、基础知识学习&#x1f3b2;二、常见面试题汇总&#x1f3af;三、构建和打包1、前端代码如何进行构建和打包&#xff1f;2、前端为何要进行打包和构建&#xff1f;3、webpack原理&#x1f3b0;四、模块相关1、…

进击吧!Blazor!第一期回顾

Blazor 是一个 Web UI 框架&#xff0c;可通过 WebAssembly 在任意浏览器中运行 .Net 。Blazor 旨在简化快速的单页面 .Net 浏览器应用的构建过程&#xff0c;它虽然使用了诸如 CSS 和 HTML 之类的 Web 技术&#xff0c;但它使用 C&#xff03;语言和 Razor 语法代替 JavaScrip…

《五分钟商学院》个人篇学习总结(下)

【商业知识】| 作者 / Edison Zhou这是EdisonTalk的第286篇原创内容商业篇聚焦的是我们与外部的关系&#xff0c;管理篇聚焦的是我们与内部的关系&#xff0c;而个人篇聚焦的则是我们与自己的关系。与自己斗&#xff0c;其乐无穷&#xff0c;本文是个人篇的下半部分学习总结。上…

「软件项目管理」软件项目范围计划——需求管理与任务分解

软件项目范围计划——需求管理与任务分解序言一、软件需求定义及层次1、定义2、层次二、软件需求管理过程1、管理过程2、需求获取3、需求分析4、需求规格编写5、需求验证6、需求变更&#xff08;1&#xff09;需求变更管理的主要工作&#xff08;2&#xff09;需求变更控制流程…

leetcode106. 从中序与后序遍历序列构造二叉树

一:题目 二:思路 例子:中序[9,3,15,20,7];后序[9,15,7,20,3] 1.我们先选取后续的最后的结点3&#xff08;其是根节点&#xff09; 2.我们在中序序列中用上一步求出的根节点3并记录其在中序数组中的位置rootin,然后我们就可以 求出 左子树的结点个数&#xff08;rootin - leftin…