Docker系列(五):.Net Core实现k8s健康探测机制

       k8s通过liveness来探测微服务的存活性,判断什么时候该重启容器实现自愈。比如访问 Web 服务器时显示 500 内部错误,可能是系统超载,也可能是资源死锁,此时 httpd 进程并没有异常退出,在这种情况下重启容器可能是最直接最有效的解决方案。

       k8s通过readiness来探测微服务的什么时候准备就绪(例如初始化时,连接数据库,加载缓存数据等等,可能需要一段时间),然后将容器加入到server的负载均衡池中,对外提供服务。

       k8s默认健康检查机制:

              每个容器启动时都会执行一个进程,此进程由 Dockerfile 的 CMD 或 ENTRYPOINT 指定。如果进程退出时返回码非零,则认为容器发生故障,Kubernetes 就会根据 restartPolicy 重启容器。如果不特意配置,Kubernetes 将对两种探测采取相同的默认行为。

 

OK,那我们就来实现一下,新建.Net Core Api项目 k8s-healthcheck,新增Heathchecks控制器:

    [Route("/api/v1/heathchecks")]public class HeathchecksController : Controller{private readonly static DateTime _beginUtc = DateTime.Now;[HttpGet][Route("test")]public ActionResult<IEnumerable<string>> Test(){return new string[] { "value1", "value2" };}[HttpGet][ProducesResponseType((int)HttpStatusCode.OK)][ProducesResponseType((int)HttpStatusCode.ServiceUnavailable)][Route("liveness")]public async Task<IActionResult> Liveness(){return await Task.Run<IActionResult>(() =>{if(DateTime.UtcNow.Subtract(_beginUtc).TotalSeconds>60*10){Console.WriteLine("{0} HealthChecks.Api is dead start restarting...",DateTime.Now);return this.NotFound();}else{Console.WriteLine("{0} HealthChecks.Api is alive.",DateTime.Now);return this.Ok();}});}[HttpGet][ProducesResponseType((int)HttpStatusCode.OK)][ProducesResponseType((int)HttpStatusCode.ServiceUnavailable)][Route("readiness")]public async Task<IActionResult> Readiness(){return await Task.Run<IActionResult>(() =>{if(DateTime.UtcNow.Subtract(_beginUtc).TotalSeconds<30){Console.WriteLine("{0} HealthChecks.Api is not ready...",DateTime.Now);return this.NotFound();}else{Console.WriteLine("{0} HealthChecks is ready,start accepting traffic...", DateTime.Now);return this.Ok();}});}}

解释一下我们这里自定义的 liveness 和 readiness检查机制:

liveness:存活10分钟,如果当前时间超过服务启动时间10分钟,则探测失败,否则探测成功。Kubernetes 如果连续执行 3 次 Liveness 探测均失败,就会杀掉并重启容器。

readiness:准备就绪30秒,30秒后,如果连续 3 次 Readiness 探测均失败后,容器将被重置为不可用,不接收 service 转发的请求。

从上面可以看到,我们可以根据自身的需求来实现这两种机制,然后,提供给k8s进行探测。

        k8s默认是根据命令进行探测的,由于我们需要与微服务结合,所以需要在yml文件中指定为http方式(备注:k8s提供了三种container probes方式:command、TCP check、HTTP Get,其他的方式希望大家下去自己实践),k8s对于http方式探测成功的判断条件是请求的返回代码在 200-400 之间。

该项目的 deploy.yaml 内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:namespace: k8s-ecoysystem-appsname: k8s-healthchecklabels:app: k8s-healthcheck
spec:replicas: 3selector:matchLabels:app: k8s-healthchecktemplate:metadata:namespace: k8s-ecoysystem-appslabels:app: k8s-healthcheckspec:containers:- name: k8s-healthcheckimagePullPolicy: Alwaysimage: 1151322093/k8s-healthcheckports:- containerPort: 80readinessProbe:httpGet:path: /api/v1/heathchecks/readinessport: 80scheme: HTTP initialDelaySeconds: 30periodSeconds: 60 livenessProbe:httpGet:path: /api/v1/heathchecks/livenessport: 80scheme: HTTP initialDelaySeconds: 120periodSeconds: 60

运行:kubectl apply -f deploy.yaml,然后通过 kubectl get pod -n k8s-ecoysystem-apps查看当前运行的pod,可以看到创建开始是不可以的,Ready状态数量是0。

 

稍等等待一会发现都可以用了:

然后我们通过 kubectl describe pod k8s-healthcheck-5c85bdcb69-f9zk9 -n k8s-ecoysystem-apps 命令可以查看更具体的信息:

刚开始readiness返回404不可用状态,不过我们设置的是30秒检查一次,所以很快状态就消除了,通过dashboard界面我们也可以看到更直观的信息:

 

 

等待10分钟过后,Liveness检测将会返回失败,pod处于不可用状态:

 

 

 

继续等待一会,集群就会自愈完成,前面说过,Liveness检测3次失败就会删除pod,并重启,重启之后就一轮新的检测:

从上面图中可以看到集群已经重启过1次,继续等待一段时间,如图:

 

 Liveness 探测和 Readiness 探测是独立执行的,二者之间没有依赖,可以单独使用,也可以同时使用。用 Liveness 探测判断容器是否需要重启以实现自愈;用 Readiness 探测判断容器是否已经准备好对外提供服务

 

OK,大功告成!!

转载于:https://www.cnblogs.com/weiBlog/p/10056281.html

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

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

相关文章

编写java程序计算梯形面积_学习练习 java面向对象梯形面积

package com.hanqi;public class Ladder {double ShangDi;double XiaDi;double Gao;double MianJi;Ladder(double ShangDi, double XiaDi, double Gao){//使用参数来初始化属性//this 代表当前类this.ShangDi ShangDi;this.XiaDi XiaDi;this.Gao Gao;}//方法的命名&#xff…

02-再探MySQL数据库

一、数据类型 1、数值类型 a、整数类型 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT 作用&#xff1a;存储年龄&#xff0c;等级&#xff0c;id&#xff0c;各种号码等。 tinyint[(m)] [unsigned] [zerofill]小整数&#xff0c;数据类型用于保存一些范围的整数…

如何在WebLogic Server中创建MySQL数据源

使用应用程序服务器的一个很酷的事情是&#xff0c;它允许您在应用程序外部创建DataSource&#xff0c;并且可以与线程池和事务管理器等一起管理它。对于WebLogic Server&#xff0c;它附带了许多内置的JDBC驱动程序&#xff0c;例如Oracle数据库和MySQL等随时可用。 在这里&am…

js原生带缩略图的图片切换效果

js原生带缩略图的图片切换效果 本例中用到的 moveElement(elementID,final_x,final_y,interval)是来自《JavaScript DOM编程艺术&#xff08;中文第二版&#xff09;》一书第10章中有一段代码。&#xff08;可以直接baidu&#xff09; 左边是banner图&#xff0c;右边是缩略图…

linux 基础10-磁盘配额管理

1. 基本概念 1.1 概念&#xff1a; 在linux系统中&#xff0c;由于是多人多任务的使用环境&#xff0c;所以会有多人共同使用一个硬盘空间的情况&#xff0c;如果其中少数几个人大量使用了硬盘空间的话&#xff0c;势必会压缩其他使用者的使用空间&#xff0c;因此管理员应该适…

java 全半角转换_Java 全半角转换

* 全角转半角的 转换函数* return String*/public static final String full2HalfChange(String QJstr){StringBuffer outStrBuf new StringBuffer("");String Tstr "";byte[] b null;for (int i 0; i < QJstr.length(); i) {Tstr QJstr.substring…

第九章:内存管理

内存管理 引用计数&#xff1a;垃圾回收机制的依据 a.变量的值被引用&#xff0c;该值的引用计数 1b.变量的值被解绑&#xff0c;该值的引用计数 -1c.引用计数为0时就会被垃圾回收机制回收​ 引用计数会出现循环引用问题&#xff1a;相互引用无法释放 a.两个变量引用其值&#…

Centos系统通过tar.gz包安装MySQL5.7

环境准备&#xff1a; 操作系统&#xff1a; http://vault.centos.org/6.5/isos/x86_64/ 下载 CentOS-6.5-x86_64-bin-DVD1.iso vmware workstation下安装系统 MySQL安装包连接地址&#xff1a; https://downloads.mysql.com/archives/community/ 下载 mysql-5…

java web转码_javaweb后台转码

为什么需要转码?客户端向服务器发送请求的四种情况:1、URL方式直接访问;2、页面链接(属于get请求);3、表单get提交;4、表单post提交1.url(url和页面链接):各大浏览器、各个操作系统对URL的URI、QueryString编码都可能存在不同.tomcat对URI的解码操作是首先获取Connector的解码…

微信小程序实战篇:商品属性联动选择(案例)

本期的微信小程序实战篇来做一个电商网站经常用到的-商品属性联动选择的效果&#xff0c;素材参考了一点点奶茶。 效果演示&#xff1a; 商品属性联动.gif代码示例 1、commodity.xml <!-- <view class"title">属性值联动选择</view> --> <!--…

使用Mockito在Java中进行模拟入门

我们都编写了单元测试&#xff0c;但是有时我们面临的挑战是被测单元可能依赖于其他组件。 并且配置其他组件进行单元测试绝对是一个过大的选择。 相反&#xff0c;我们可以使用Mocks代替其他组件&#xff0c;并继续进行单元测试。 为了说明如何使用模拟&#xff0c;我有一个数…

2.12 Hivet中order by,sort by、distribute by和cluster by

https://cwiki.apache.org/confluence/display/Hive/LanguageManualSortBy一、order by对全局数据的排序&#xff0c;仅仅只有一个reduce&#xff1b;Hive中的order by跟传统的sql语言中的order by作用是一样的&#xff0c;会对查询的结果做一次全局排序&#xff0c; 所以说&am…

如何相互转换逗号分隔的字符串和List【转】

将逗号分隔的字符串转换为List 方法 1&#xff1a; 利用JDK的Arrays类 String str "a,b,c"; List<String> result Arrays.asList(str.split(",")); 方法 2&#xff1a; 利用Guava的Splitter String str "a, b, c"; List<String&g…

禁用F12和鼠标右键,防止查看控制台代码

虽然是个治标不治本的办法&#xff0c;还是挺有用的 在禁用同时&#xff0c;自身的代码健壮性也需要加强 // 屏蔽F12document.onkeydown function () {//f12键if (window.event && window.event.keyCode 123) {event.keyCode 0;event.returnValue false;}// enter…

java 文件解析异常_java中异常的解析

Java Exception&#xff1a;1、Error2、Runtime Exception 运行时异常3、Exception4、throw 用户自定义异常异常类分两大类型&#xff1a;Error类代表了编译和系统的错误&#xff0c;不允许捕获&#xff1b;Exception类代表了标准Java库方法所激发的异常。Exception类还包含运行…

Spring JMS:处理事务中的消息

1.引言 这篇文章将向您展示在使用JMS异步接收消息期间&#xff0c;使用者执行过程中的错误如何导致消息丢失。 然后&#xff0c;我将解释如何使用本地事务解决此问题。 您还将看到这种解决方案在某些情况下可能导致消息重复&#xff08;例如&#xff0c;当它将消息保存到数据库…

OS X EI Captain 下解决 There was a problem confirming the ssl certificate 问题

参考&#xff1a; Problem Confirming the SSL Certificate - OSX OS X EI Captain 下解决 There was a problem confirming the ssl certificate 问题 在安装 matplotlib 时&#xff0c;出现以下错误&#xff1a; python3 -mpip install matplotlibCollecting matplotlibCould…

Linux下Python编译安装

1.安装python3 1.1下载python源码包 网址&#xff1a;https://www.python.org/downloads/release/python-362/ 下载地址&#xff1a;https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz 1.1.1安装python前的库环境&#xff0c;非常重要 yum install gcc patch libffi-d…

call/apply以及this指向的理解

javascript是面向对象的语言&#xff0c;Function也是一种对象&#xff0c;有自己的属性和方法。call和apply就是js函数自带方法&#xff0c;挂在Fucntion.prototype上。一般调用某函数时&#xff0c;直接“函数名&#xff08;参数&#xff09;”的写法即可&#xff0c;函数内部…

Java排序算快速排序_Java排序算法 [快速排序]

package cn.com.dom4j.sort;public class QuickSort {/**快速排序在 Java中, 快速排序被用作基本数据类型的排序 (当然, 不只快速排序一种)快速排序是实践中的一种快速的排序算法, 在 C或对 Java基本类型的排序证特别有用.它的平均运行时间是 O(N logN), 该算法之所以特别快, 主…