目录[-]
系统环境
参考地址
现在很多 SpringCloud 组件都在往 Kubernetes 中迁移,SpringBoot Admin 作为我们微服务监控经常使用的组件,也要将它迁移到 Kuberntes 环境下。
在之前写过 SpringBoot Admin 与 SpringCloud Kubernetes 组件结合,通过 API 方式发现服务列表,让 Admin 服务能服务发现。但是现在还是很多实际生产环境中,还是将 Eureka 注册中心部署到 Kubernetes 环境下作为注册中心,然后将全部服务注册到 Eureka,通过注册中心将服务间关系进行关联,使用 Admin + Eureka 方式来完成部署。
SpringBoot Admin 是一个管理和监控 SpringBoot 应用程序的开源软件,每个应用都认为是一个客户端,它可用通过 HTTP 或者使用 Eureka 注册到 admin server 中,能收集这些客户端的监控指标信息,展示在页面上,并且还能动态更改日志级别。
常见的功能如下:
由于 SpringBoot Admin 需要监控 SpringCloud 下的微服务,故而需要一个注册中心。现在生产环境下使用最多的还是 Eureka,所以我们需要提前部署 Eureka 注册中心,并且现在是 Kubernets 环境,如何在 Kubernetes 部署 Eureka 注册中心,在之前博博客中已经写过,这里不过多描述,这里已经存在的环境如下:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.8.RELEASE
club.mydlq
springboot-admin-demo
0.0.1
springboot-admin-demo
springboot admin demo project
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
de.codecentric
spring-boot-admin-starter-server
2.1.6
org.jolokia
jolokia-core
org.springframework.cloud
spring-cloud-dependencies
Greenwich.SR2
pom
import
org.springframework.boot
spring-boot-maven-plugin
在 SpringBoot 应用的 application.yaml 配置文件中,需要配置一些参数:
#application config
server:
port: 8080
spring:
application:
name: springboot-admin-demo
#actuator config
management:
server:
port: 8081
endpoint:
health:
show-details: always
endpoints:
web:
exposure:
include: "*"
#log config
logging:
path: /opt/logs/
#eureka config
eureka:
client:
service-url:
defaultZone: http://192.168.2.11:31011/eureka/
参数简介:
启动类上需要额外加上俩个注解:
package club.mydlq.demo;
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;
@SpringBootApplication
@EnableDiscoveryClient
@EnableAdminServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
输入地址 http://localhost:8080 打开 SpringBoot Admin UI 界面,查看是否能查看应用的监控信息。
可以看到 Eureka 显示为不正常状态,这是由于 Eureka 部署在 Kubernetes 内部,所以无法获取其信息,等接下来将 SpringBoot Admin 也部署到 Kubernets 环境中,状态就会变为正常。
由于我们是将 SpringBoot Admin 部署到 Kubernetes 环境下,所以我们这里将上面示例构建成 Docker 镜像,方便后续部署到 Kubernetes 环境下。
(1)、执行 Maven 编译
首先执行 Maven 命令,将项目编译成一个可执行 JAR。
$ mvn clean install
(2)、准备 Dockerfile
创建构建 Docker 镜像需要的 Dockerfile 文件,放置到项目根目录中,将 Maven 编译的 JAR 复制到镜像内部,然后设置两个变量,分别是:
Dockerfile:
FROM openjdk:8u222-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" ]
(3)、构建 Docker 镜像
执行 Docker Build 命令构建 Docker 镜像。
$ docker build -t mydlqclub/springboot-admin-server:0.0.1 .
(1)、创建 SpringBoot Admin 的 Kubernetes 部署文件
创建 SpringBoot Admin Server 在 Kubernetes 下的部署文件,在环境变量 APP_OPTS
中设置 eureka.client.serviceUrl.defaultZone
参数,指定为 Kubernetes 内部 Eureka 地址。
springboot-admin-server.yaml
apiVersion: v1
kind: Service
metadata:
name: springboot-admin-server
spec:
type: NodePort
ports:
- name: server
nodePort: 31083
port: 8080
targetPort: 8080
- name: management
nodePort: 31084
port: 8081
targetPort: 8081
selector:
app: springboot-admin-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-admin-server
labels:
app: springboot-admin-server
spec:
replicas: 1
selector:
matchLabels:
app: springboot-admin-server
template:
metadata:
name: springboot-admin-server
labels:
app: springboot-admin-server
spec:
restartPolicy: Always
containers:
- name: springboot-admin-server
image: mydlqclub/springboot-admin-server:0.0.1
#imagePullPolicy: Always
ports:
- containerPort: 8080
name: server
env:
#注意修改下面 apollo.meta 参数值中的 mydlqcloud 为你自己的部署 Apollo 的 Namespace 名称
- name: APP_OPTS
value: "
--eureka.client.serviceUrl.defaultZone=http://eureka-0.eureka.mydlqcloud:8080/eureka/,http://eureka-1.eureka.mydlqcloud:8080/eureka/,http://eureka-2.eureka.mydlqcloud:8080/eureka/
"
resources:
limits:
memory: 1024Mi
cpu: 1000m
requests:
memory: 1024Mi
cpu: 1000m
readinessProbe:
initialDelaySeconds: 20
periodSeconds: 5
timeoutSeconds: 10
failureThreshold: 5
httpGet:
path: /actuator/health
port: 8081
livenessProbe:
initialDelaySeconds: 60
periodSeconds: 5
timeoutSeconds: 5
failureThreshold: 3
httpGet:
path: /actuator/health
port: 8081
volumeMounts:
- name: log
mountPath: /opt/logs
volumes:
- name: log
hostPath:
type: DirectoryOrCreate
path: /data/apps/logs
(2)、在Kubernetes 中部署应用
-n:创建应用到指定的 Namespace 中。
$ kubectl apply -f springboot-admin-server.yaml -n mydlqcloud
将 SpringBoot Admin 部署到 Kuberntes 后,我们可以通过访问在部署文件中配置的 Service 的 NodePort 端口 31083 ,且 Kubernetes 集群地址为 192.168.2.11。所以输入地址:http://192.168.2.11:31083 访问 Admin UI 界面。
—END—