欢迎关注我的个人博客,关注最新动态: http://www.mydlq.club
系统环境:
背景:
Spring Boot Admin 是一个开源社区项目,用于管理和监控 SpringBoot 应用程序,展示Spring Boot Admin Client 的 Actuator 端点上的一些监控信息。这里要在 Kubernetes 中部署 SpringBoot Admin,由于 Kubernetes 自带服务发现,所以去掉注册中心等,这里需要和 SpringCloud Kubernetes 完成 Kubernetes 下的服务发现。这里将演示 SpringBoot Admin 与 SpringCloud Kubernetes 配合完成监控 Kubernetes 中的 SpringBoot 应用。
Spring Boot Admin 是一个开源社区项目,用于管理和监控 SpringBoot 应用程序,展示Spring Boot Admin Client 的 Actuator 端点上的一些监控信息。
它为应用程序提供以下功能:
Spring Cloud Kubernetes 提供 Kubernetes 环境下服务发现的 Spring Cloud 通用接口实现。主要目的是促进在 Kubernetes 中运行的 Spring Cloud 和 Spring Boot 应用程序的集成。
这里我们主要用 SpringCloud Kubernetes 来为 SpringBoot Admin 提供 Kubernetes 环境下的服务发现。
创建 SpringBoot Admin 应用,且引入 SpringCloud Kubernetes 作为服务发现。
在 Maven 中引入 “spring-boot-admin-starter-server” 与 “spring-cloud-kubernetes-discovery” 依赖。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.6.RELEASEversion>
<relativePath/>
parent>
<groupId>club.mydlqgroupId>
<artifactId>springboot-admin-k8sartifactId>
<version>0.0.2version>
<name>springboot-admin-k8sname>
<description>demodescription>
<properties>
<java.version>1.8java.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-serverartifactId>
<version>2.1.5version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-kubernetes-discoveryartifactId>
<version>1.0.2.RELEASEversion>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
加上两个参数:
server:
port: 8080
management:
server:
port: 8081 #---指定监控数据端口为8081,避免和 server.port 一致产生风险
endpoints:
web:
exposure:
include: "*"
spring:
application:
name: springboot-admin-k8s
cloud:
kubernetes:
discovery:
primaryPortName: management #---按设要监控 Service 的端口名称
serviceLabels:
admin: enabled #---设置要监控 Service 的 Label 标签
需要加上四个注解:
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableDiscoveryClient
@EnableAdminServer
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
将上面创建的 SpringBoot Admin 应用编译成 Docker 镜像。
$ mvn clean package
FROM openjdk:8u212-b04-jre-slim
VOLUME /tmp
ADD target/*.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
ENV APP_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS" ]
这里使用的是 docker 官方仓库,将其推送到仓库,方便后续 Kubernetes 操作。
$ docker build -t mydlqclub/springboot-admin-k8s:0.0.1 .
将 SpringBoot Admin 应用部署到 Kubernetes 中,这里提前设置 Kubernetes 部署的 yaml 文件,然后执行 Kubectl 命令将其启动。
springboot-admin-rbac.yaml
由于 SpringBoot Admin 需要服务发现,所以创意一个 ServiceAccount。注意提前修改角色所属的“namespace”
apiVersion: v1
kind: ServiceAccount
metadata:
name: springboot-admin-k8s
namespace: mydlqcloud
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: springboot-admin-k8s
subjects:
- kind: ServiceAccount
name: springboot-admin-k8s
namespace: mydlqcloud
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
springboot-admin-k8s.yaml
注意下面的 Service 注释说明,必须设置对应 Label 和 Port 名称,SpringBoot Admin 会发现带有这些名称的 Service 和 Port。
apiVersion: v1
kind: Service
metadata:
name: springboot-admin-k8s
labels:
app: springboot-admin-k8s
admin: enabled #---设置此标签,表示此应用被 Springboot Admin 服务发现
annotations:
spec:
type: NodePort #---通过NodePort方式暴露端口,方便外界访问
ports:
- name: server #---服务端口名,用于访问监控 UI
nodePort: 30080
port: 8080
targetPort: 8080
- name: management #---指定监控端口名,表示此应用被 Springboot Admin 服务发现
nodePort: 30081
port: 8081
targetPort: 8081
selector:
app: springboot-admin-k8s
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-admin-k8s
labels:
app: springboot-admin-k8s
spec:
replicas: 1
selector:
matchLabels:
app: springboot-admin-k8s
template:
metadata:
labels:
app: springboot-admin-k8s
spec:
serviceAccountName: springboot-admin-k8s
containers:
- name: springboot-admin-k8s
image: mydlqclub/springboot-admin-k8s:0.0.1
imagePullPolicy: Always
ports:
- containerPort: 8080
name: server
- containerPort: 8081
name: management
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 500m
memory: 256Mi
利用 Kubectl 命令执行 yaml 文件,创建角色和应用部署对象。
创建 SpringBoot Admin RBAC
$ kubectl apply -f springboot-admin-rbac.yaml -n mydlqcloud
创建 SpringBoot Admin Deployment
$ kubectl apply -f springboot-admin-k8s.yaml -n mydlqcloud
利用 Kubectl 命令查看 Kubernetes 中启动的应用,可以看到 SpringBoot Admin 已经成功启动。
$ kubectl get pods -n mydlqcloud
NAME READY STATUS RESTARTS AGE
springboot-admin-k8s-54c668b5ff-b9snz 1/1 Running 0 1m
输入 Kubernetes 集群地址和 SpringBoot Admin Service 的 NodePort 端口,http://ClusterIP:30080 访问 Admin 服务,本人地址为:http://192.168.2.11:30080,打开后看到 Admin 的 UI 界面如下:
上面的监控的只有一条信息,即 SpringBoot Admin 本身,为了测试其它 SpringBoot 应用,这里我们启用一个 示例 “Hello-World” 项目。
创建一个测试用例的 SpringBoot 应用,具体的代码比较简单所以不再展示,需要注意的是 application 配置文件中设置 Actuator 的 “management” 端口,方便监控。
server:
port: 8080
management:
server:
port: 8081 #---指定监控数据端口为8081
endpoints:
web:
exposure:
include: "*"
然后配置 Kubernetes 中的应用 yaml 文件
springboot-helloworld.yaml
apiVersion: v1
kind: Service
metadata:
name: springboot-helloworld
labels:
app: springboot-helloworld
admin: enabled #---设置此标签,表示此应用被 Springboot Admin 服务发现
annotations:
spec:
type: ClusterIP
ports:
- name: server
port: 8080
targetPort: 8080
- name: management #---指定监控端口名,表示此应用被 Springboot Admin 服务发现
port: 8081
targetPort: 8081
selector:
app: springboot-helloworld
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-helloworld
labels:
app: springboot-helloworld
spec:
replicas: 2 #---设置副本数为2
selector:
matchLabels:
app: springboot-helloworld
template:
metadata:
labels:
app: springboot-helloworld
spec:
containers:
- name: springboot-helloworld
image: mydlqclub/springboot-helloworld:0.0.1
imagePullPolicy: Always
ports:
- containerPort: 8080
name: server
- containerPort: 8081
name: management
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 500m
memory: 256Mi
在 Kubernetes 创建应用
$ kubectl apply -f springboot-helloworld.yaml -n mydlqcloud
在此访问 SpringBoot Admin 页面,可以看到已经监控到新增应用信息,且正确的监控到此应用有两个副本。
欢迎关注我的个人博客,关注最新动态: http://www.mydlq.club