Arthas 是阿里巴巴开源的在线诊断工具,提供了 Dashboard
负载总览、Thread
线程占用、Stack
堆栈查看、Watch
性能观测等功能。
在实际的生产应用中,我们遇到以下几个问题:
- Arthas 控制台没有权限控制,一旦访问 IP 暴露,就有安全问题。
- Arthas 控制台需要提前知道 AgentId 才能访问,不适合 K8s 扩容管理。
基于上面的问题,笔者 fork 了官方最新的源码进行二次开发,并打包镜像到 Docker Hub,方便大家使用。
- Github 地址:传送门
- Docker Hub 地址:传送门
改造内容
部署教程
FatJar 部署
执行 mvn clean package
打包成一个 fat jar,参考如下命令启动编译后的控制台。
1
| java -Dserver.port=8080 -jar target/arthas-tunnel-server.jar
|
Docker 部署
本项目已发布稳定的镜像到 Docker Hub,您可以直接使用如下命令,完成部署。
1
| docker run -p 8080:8080 --name=arthas-tunnel-server -d shiyindaxiaojie/arthas-tunnel-server
|
Kubernetes 部署
建议使用 StatefulSet 部署,YAML 示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| apiVersion: apps/v1 kind: StatefulSet metadata: name: arthas-tunnel-server namespace: monitoring spec: podManagementPolicy: OrderedReady replicas: 1 serviceName: "" template: spec: affinity: {} containers: - env: - name: TZ value: Asia/Shanghai image: shiyindaxiaojie/arthas-tunnel-server:v3.6.7 imagePullPolicy: IfNotPresent name: cat-home resources: limits: cpu: 250m memory: 512Mi requests: cpu: 250m memory: 512Mi volumeMounts: - mountPath: /app/application.properties name: application readOnly: true subPath: application.properties volumes: - configMap: defaultMode: 420 items: - key: application.properties mode: 420 path: application.properties name: arthas-tunnel-server name: application
|
对应的 ConfigMap 如下,用于配置账号和权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| apiVersion: v1 kind: ConfigMap metadata: name: arthas-tunnel-server namespace: monitoring data: application.properties: | arthas.server.host=0.0.0.0 arthas.server.port=7777 arthas.enable-detail-pages=false
spring.cache.type=caffeine spring.cache.cache-names=inMemoryClusterCache spring.cache.caffeine.spec=maximumSize=3000,expireAfterAccess=3600s
spring.security.jwt.secret=base64码 spring.security.jwt.token-validity-in-seconds=604800 spring.security.users[0].name=admin spring.security.users[0].password=123456 spring.security.users[0].roles=ADMIN spring.security.users[1].name=user spring.security.users[1].password=123456 spring.security.users[1].roles=eden-*
|
应用集成
为了减少客户端集成的工作,推荐您使用 eden-architect 框架,只需要两步就可以完成 Arthas 的集成。
引入 Arthas 依赖
1 2 3 4
| <dependency> <groupId>io.github.shiyindaxiaojie</groupId> <artifactId>eden-arthas-spring-boot-starter</artifactId> </dependency>
|
开启 Arthas 配置
1 2 3 4 5 6 7 8 9 10
| spring: arthas: enabled: true
arthas: agent-id: ${spring.application.name}@${random.value} tunnel-server: ws://localhost:7777/ws session-timeout: 1800 telnet-port: 0 http-port: 0
|
启动您的项目,在控制台中查看到应用列表,就可以看到您的应用了。
当然,如果你不希望依赖 eden-architect,则可以参考相关代码实现自己的需求。