在目前的部署模式下,通常会将Spring Boot
项目部署在Kubernetes
容器中;
今天,我们就来细说一下,如何使用Spring Boot Admin
监控在Kubernetes
上运行的Spring Boot
应用程序。
kubernetes
下部署的架构往往是这样的:
服务employee-service
部署在命名空间a中,department-service
部署在命名空间b中,而organization-service
部署在命名空间c中,
Spring Boot Admin
也使用Spring Boot
启动,并默认部署在命名空间中。
此时,我们就可以通过kubernetes
的Api
对服务进行管理和监控。
PS:图是我抄的😜
启动Spring Boot Admin Server
引入相关依赖
在SBA中,已经集成了kubernetes
,如果需要通过kubernetes
来发现服务,我们还需要把kubernetes-client
包加入到项目中,SpringCloud
已经为我们提供了spring-cloud-starter-kubernetes-client
<?xml version="1.0" encoding="utf-8" ?>
<project>
<properties>
<spring-boot.version>2.6.1</spring-boot.version>
<spring-cloud.version>2021.0.0</spring-cloud.version>
<!-- SBA 的最新版本 实际情况 和 spring boot 的版本号应该一致,目前没有发现不兼容的情况 -->
<spring-boot-admin.version>2.5.5</spring-boot-admin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-dependencies</artifactId>
<version>${spring-boot-admin.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-cloud</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-server-ui</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client</artifactId>
</dependency>
</dependencies>
</project>
启动类配置
@EnableAdminServer
启用SBA Server
服务EnableDiscoveryClient
启用服务发现的能力EnableScheduling
启用定时任务,这个很关键,不然你会发现启动的服务,无法在SBA
中显示
@SpringBootApplication
@EnableAdminServer // 启用 SBA Server 服务
@EnableDiscoveryClient // 启用服务发现
@EnableScheduling // 启用定时器
public class OpsAdminCloudServerApplication {
public static void main(String[] args) {
SpringApplication.run(OpsAdminCloudServerApplication.class, args);
}
}
Spring Boot Admin Server 配置
既然我们使用kubernetes
来发现服务,那么我们就需要对kubernetes
的属性进行配置
spring.cloud.kubernetes.discovery.service-labels
通过Services
的meta
中匹配对应的标记,不满足的则会被排除spring.cloud.kubernetes.discovery.primary-port-name
当给NodePort
指定多个多个端口时,通过name
来确认使用哪个端口作为主端口spring.cloud.kubernetes.client.namespace
指定服务所在的命名空间spring.cloud.kubernetes.discovery.all-namespaces
当然,如果你不想指定命名空间,也可以设置该属性为true,程序会找到所有命名空间下满足service-labels
的实例spring.boot.admin.discovery.converter.management-context-path
如果实例的actuator
地址被修改,需要配置该属性,默认值/actuator
; 该配置为全局配置,假设每个服务都有自己的context-path
,需要编辑kubernetes
文件,metadata.labels
中配置management.context-path
spring.boot.admin.discovery.converter.health-endpoint-path
如果实例的health
地址被修改,需要配置该属性,默认值/health
; 该配置为全局配置,如果每个服务都有自己的健康检查,需要编辑kubernetes
文件,metadata.labels
中配置health.path
spring:
cloud:
kubernetes:
discovery:
service-labels: # 通过 Services 的 meta 中匹配对应的标记,不满足的则会被排除
spa-admin: enabled
primary-port-name: http # nodePort 指定多个多个端口时,通过name来确认使用哪个端口请求
client:
namespace: production # 指定命名空间
boot:
application:
name: spring-boot-admin-kubernetes # 服务名
admin:
context-path: admin # Spring Boot Admin 的 页面或 api 的路径前缀
discovery:
converter:
management-context-path: /actuator # 访问实例 的 Spring Boot actuator 的根路径
health-endpoint-path: /health # 访问实例 健康检查的地址
实例配置
编写kubernetes文件
- 在
metadata.labels
属性下添加spa-admin: enabled
,方便SPA
过滤实例,对应SPA
配置中的spring.cloud.kubernetes.discovery.service-labels
- 在
spec.ports
中配置端口信息,name
的值为http
,对应SPA
配置中的spring.cloud.kubernetes.discovery.primary-port-name
kind: Service
apiVersion: v1
metadata:
name: admin-user-server
namespace: production
labels:
name: sadmin-user-server
app: admin-user-server
version: production
spa-admin: enabled
spec:
type: NodePort
ports:
- protocol: TCP
name: http
targetPort: 8080
port: 8080
nodePort: 32000
selector:
app: admin-user-server
加入相关依赖
- 添加
spring-boot-starter-actuator
,给实例赋予actuator
能力 - 通过
spring-boot-maven-plugin
插件,可以为actuator
的info
接口提供更多的信息
<project >
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<build>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</build>
</project>
配置actuator
spring:
application:
name: admin-user-server
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
效果图
写在最后
码字不易,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激