Kubernetes 部署 SpringBoot Admin + Eureka 监控微服务

目录[-]


系统环境

  • Kubernetes 版本:1.5.3
  • SpringBoot Admin 版本:2.1.6
  • SpringCloud 版本:Greenwich.SR2

参考地址

  • 示例 Github 地址:https://github.com/my-dlq/blog-example/tree/master/springboot-admin-demo

一、概念简介

1、背景

现在很多 SpringCloud 组件都在往 Kubernetes 中迁移,SpringBoot Admin 作为我们微服务监控经常使用的组件,也要将它迁移到 Kuberntes 环境下。

在之前写过 SpringBoot Admin 与 SpringCloud Kubernetes 组件结合,通过 API 方式发现服务列表,让 Admin 服务能服务发现。但是现在还是很多实际生产环境中,还是将 Eureka 注册中心部署到 Kubernetes 环境下作为注册中心,然后将全部服务注册到 Eureka,通过注册中心将服务间关系进行关联,使用 Admin + Eureka 方式来完成部署。

2、SpringBoot Admin 简介

SpringBoot Admin 是一个管理和监控 SpringBoot 应用程序的开源软件,每个应用都认为是一个客户端,它可用通过 HTTP 或者使用 Eureka 注册到 admin server 中,能收集这些客户端的监控指标信息,展示在页面上,并且还能动态更改日志级别。

3、SpringBoot Admin 功能

常见的功能如下:

  • 显示健康状况
  • 显示详细信息,例如
    • JVM和内存指标
    • micrometer.io指标
    • 数据源指标
    • 缓存指标
  • 显示构建信息编号
  • 关注并下载日志文件
  • 查看jvm系统和环境属性
  • 查看Spring Boot配置属性
  • 支持Spring Cloud的postable / env-和/ refresh-endpoint
  • 轻松的日志级管理
  • 与JMX-beans交互
  • 查看线程转储
  • 查看http跟踪
  • 查看auditevents
  • 查看http-endpoints
  • 查看计划任务
  • 查看和删除活动会话(使用spring-session)
  • 查看Flyway / Liquibase数据库迁移
  • 下载heapdump
  • 状态变更通知(通过电子邮件,Slack,Hipchat,……)
  • 状态更改的事件日志(非持久性)

二、示例项目

1、环境准备

由于 SpringBoot Admin 需要监控 SpringCloud 下的微服务,故而需要一个注册中心。现在生产环境下使用最多的还是 Eureka,所以我们需要提前部署 Eureka 注册中心,并且现在是 Kubernets 环境,如何在 Kubernetes 部署 Eureka 注册中心,在之前博博客中已经写过,这里不过多描述,这里已经存在的环境如下:

  • 在 Kubernetes 外部访问 Eureka 的地址: http://192.168.2.11:31011/eureka/
  • 在 Kuberenetes 内部访问 Eureka 的地址: http://eureka-0.eureka.mydlqcloud:8080/eureka/,http://eureka-1.eureka.mydlqcloud:8080/eureka/,http://eureka-2.eureka.mydlqcloud:8080/eureka/

2、Maven 引入相关依赖



    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
            
        
    


3、配置文件

在 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/

参数简介:

  • application config: SpringBoot 基础配置。
  • actuator config: SpringBoot 的 Actuator 端口,可以暴露监控指标信息。
  • eureka config: Eureka 地址,由于这里的 Eureka 是部署在 Kubernetes 中,且通过 NodePort 方式暴露端口,所以在程序外部测试时直接指定该端口连接到 Eureka 测试即可,后面将 SpringBoot Admin 部署到 Kubernets 中时候,会将此配置放置到变量当中,替换该 Eureka URL 地址。
  • log config: 日志配置信息,如果不设置 loggging.path 参数,那么 SpringBoot Admin UI 中不能查看到应用的日志信息。

4、启动类

启动类上需要额外加上俩个注解:

  • @EnableAdminServer: 启用 SpringBoot Amdin Server。
  • @EnableDiscoveryClient: 启用 SpringCloud 服务发现,这里会开启 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);
    }

}

三、打开 SpringBoot Admin UI 查看信息

输入地址 http://localhost:8080 打开 SpringBoot Admin UI 界面,查看是否能查看应用的监控信息。

可以看到 Eureka 显示为不正常状态,这是由于 Eureka 部署在 Kubernetes 内部,所以无法获取其信息,等接下来将 SpringBoot Admin 也部署到 Kubernets 环境中,状态就会变为正常。

四、Kubernetes 部署 SpringBoot Admin

由于我们是将 SpringBoot Admin 部署到 Kubernetes 环境下,所以我们这里将上面示例构建成 Docker 镜像,方便后续部署到 Kubernetes 环境下。

1、构建 Docker 镜像

(1)、执行 Maven 编译

首先执行 Maven 命令,将项目编译成一个可执行 JAR。

$ mvn clean install

(2)、准备 Dockerfile

创建构建 Docker 镜像需要的 Dockerfile 文件,放置到项目根目录中,将 Maven 编译的 JAR 复制到镜像内部,然后设置两个变量,分别是:

  • JAVA_OPTS: Java JVM 启动参数变量,这里需要在这里加一个时区参数。
  • APP_OPTS: Spring 容器启动参数变量,方便后续操作时能通过此变量配置 Spring 参数。

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 .

2、Kubernetes 部署示例应用

(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

3、测试部署的应用接口

将 SpringBoot Admin 部署到 Kuberntes 后,我们可以通过访问在部署文件中配置的 Service 的 NodePort 端口 31083 ,且 Kubernetes 集群地址为 192.168.2.11。所以输入地址:http://192.168.2.11:31083 访问 Admin UI 界面。

—END—

你可能感兴趣的:(Kubernetes 部署 SpringBoot Admin + Eureka 监控微服务)