spring boot actuator和K8s容器健康检查

spring boot actuator

spring boot 的 actuator,提供了很多生产级特性,比如监控和度量spring boot应用程序。
可用通过三种方式获取这些特性。

一、通过REST端点获取

actuator提供如下13个端点:

http方法路径描述
GET/autoconfig提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
GET/configprops描述配置属性(包含默认值)如何注入bean
GET/beans描述应用程序上下文里全部的Bean,以及它们的关系
GET/dump获取线程活动的快照
GET/env获取全部环境属性
GET/env/{name}根据名称获取特定的环境属性值
GET/health报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
GET/info获取应用程序的定制信息,这些信息由info打头的属性提供
GET/mappings描述全部的URL路径,以及它们和控制器(包含Actuator断点)的映射关系
GET/metrics报告各种应用程序度量信息,比如内存用量和http请求次数
GET/metrics/{name}报告指定名称的应用程序度量值
GET/shutdown关闭应用程序,要求endpoints.shutdown.enabled设置为true
GET/trace提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

要启动Actuator的端点,只需要在项目中引入Actuator的起步依赖即可,添加完成后自动生效。
对于maven项目,引入的依赖是这样的:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

/health 说明:
/health 端点所提供的所有信息都是由一个或多个健康指示器提供。
spring boot自带的健康指示器:

健康指示器报告内容
ApplicationHealthIndicatornone永远为up
DataSourceHealthIndicatordb如果数据库能连上,则内容是up和数据类型,否则为DOWN
DiskSpaceHealthIndicatordiskSpace如果可用空间大于阈值,则内容为UP和可用磁盘空间,如果空间不足则为DOWN
JmsHealthIndicatorjms如果能连上消息代理,则内容是up和JMS提供方的名称,否则为DOWN
MailHealthIndicatormail如果能连上邮件服务器,则内容是up和邮件服务器主机和端口,否则为DOWN
MongoHealthIndicatormongo如果能连上MongoDB服务器,则内容是up和MongoDB服务器版本,否则为DOWN
RabbitHealthIndicatorrabbit如果能连上RabbitMQ服务器,则内容是up和版本号,否则为DOWN
RedisHealthIndicatorredis如果能连上服务器,则内容是up和Redis服务器版本,否则为DOWN
SolrHealthIndicatorsolr如果能连上solr服务器,则内容是up,否则为DOWN

这些健康指示器会按需自动配置,举例来说,如果ClassPath里有javax.sql.DataSource,则会自动配置DataSourceHealthIndicator。
ApplicationHealthIndicator和DiskSpaceHealthIndicator则会一直配置。
在pom文件中,添加完起步依赖后,应用程序的ClassPah里就有了

二、通过远程shell获取

另一种深入运行中应用程序内部的方式是使用远程shell。spring boot集成了CRaSH,一种能嵌入任意java应用程序的shell。
可添加如下依赖启用:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-remote-shell</artifactId>
</dependency>

添加了远程shell依赖后,就可以构建并运行应用程序了。在启动的时候,可以看到要写进日志的一行密码。这行密码所在的行大概是这样的:
Using default security password: *********
与这个密码搭配使用的用户名是user。密码本身是随机生成的,每次运行应用程序都会有所变化。
可以通过ssh工具连接shell,其监听的端口为2000。
例:ssh user@ip -p 2000,输入日志里打印的密码就好。
spring boot提供的CRaSH shell 命令:autoconfig、beans、metrics,这三个命令和rest端点可以比照看,效果基本一致。
另外可以用endpoint list命令获取端点的列表,展示的都是端点Bean名称,然后使用endpoint invoke命令,传入不带Endpoint后缀的Bean名称。

三、通过JMX获取

不常用,略过。

以上三种方式,只是执行形式不同,端点均为rest方式展示那些端点。

四、启用和禁用端点的方法:

## 禁用所有端点
endpoints.enabled=false
## 启用metrics端点
endpoints.metrics.enabled=true

五、自定义和安全

1、可添加自定义的度量信息
2、可插入自定义的健康指示器
3、安全方面可以使用spring security来保证
以上不展开叙述。

K8s容器健康检查

kubernetes提供了两种探针(Probe,支持exec、tcp和http方式)来探测容器的状态:
LivenessProbe:用于判断容器是否健康,告诉kubelet一个容器什么时候处于不健康的状态。如果LivenessProbe探针探测到容器不健康,则kubelet将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,那么kubelet认为该容器的LivenessProbe探针返回的值永远是“Success”;
ReadinessProbe:用于判断容器是否启动完成且准备接收请求。如果ReadinessProbe探针探测到失败,则pod的状态将被修改。Endpoint Controller将从Service的Endpoint中删除包含该容器所在Pod的IP地址的Endpoint条目。

LivenessProbe包含如下三种实现方式:
ExecAction:在容器内部执行一个命令,如果该命令的退出状态码为0,则表明容器健康;
TCPSocketAction:通过容器的IP地址和端口号执行TCP检查,如果端口能被访问,则表明容器健康;
HTTPGetAction:通过容器的IP地址和端口号及路径调用HTTP GET方法,如果响应的状态码大于等于200且小于400,则认为容器状态健康

LivenessProbe配置例子:

livenessProbe:
  httpGet:
    path: "/health"
    port: 1234
  initialDelaySeconds: 60        // 60s后启动第一次探测
  periodSeconds: 10              //  每隔10s启动一次探测
  timeoutSeconds: 3               // 超时时间3s
  successThreshold: 1             // 成功1次即表示容器健康
  failureThreshold: 5             // 连续5次失败,则判定容器不健康,默认3次

HTTPGetAction方式和/health端点常搭配一起使用,注意/health提供多项健康指示器,当有一项为down时,其状态码为503,因此LivenessProbe探针会判定容器不健康,从而重启容器。
注意:如果只需要端口通,就表示容器健康,可以使用TCPSocketAction。
例,请求方法:

[root@localhost ~]$curl -i 'http://ip:port/health'
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值