spring boot actuator和K8s容器健康检查
spring boot 的 actuator,提供了很多生产级特性,比如监控和度量spring boot应用程序。可用通过三种方式获取这些特性。一、通过REST端点获取actuator提供如下13个端点:一、通过远程shell获取一、通过JMX获取...
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自带的健康指示器:
健康指示器 | 建 | 报告内容 |
---|---|---|
ApplicationHealthIndicator | none | 永远为up |
DataSourceHealthIndicator | db | 如果数据库能连上,则内容是up和数据类型,否则为DOWN |
DiskSpaceHealthIndicator | diskSpace | 如果可用空间大于阈值,则内容为UP和可用磁盘空间,如果空间不足则为DOWN |
JmsHealthIndicator | jms | 如果能连上消息代理,则内容是up和JMS提供方的名称,否则为DOWN |
MailHealthIndicator | 如果能连上邮件服务器,则内容是up和邮件服务器主机和端口,否则为DOWN | |
MongoHealthIndicator | mongo | 如果能连上MongoDB服务器,则内容是up和MongoDB服务器版本,否则为DOWN |
RabbitHealthIndicator | rabbit | 如果能连上RabbitMQ服务器,则内容是up和版本号,否则为DOWN |
RedisHealthIndicator | redis | 如果能连上服务器,则内容是up和Redis服务器版本,否则为DOWN |
SolrHealthIndicator | solr | 如果能连上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)