如何在实际项目中集成Arthas Tunnel Server实现Kubernetes集群的远程诊断?

在Kubernetes集群中集成Arthas Tunnel Server,可以让你像使用本地工具一样远程诊断任意Pod中的Java应用,无需频繁进行端口转发或进入容器内部。下面这张图清晰地展示了实现这一目标的完整工作流程。

flowchart TD A[开始集成Arthas Tunnel Server] --> B[搭建Tunnel Server] B --> B1[创建Deployment
与Service] B1 --> B2[配置服务访问] B --> C[配置应用客户端] C --> C1[添加POM依赖] C1 --> C2[配置连接信息
agent-id, tunnel-server等] B2 --> D[远程诊断连接] C2 --> D D --> E[访问Tunnel Server Web控制台] E --> F[选择目标应用实例] F --> G[开始远程诊断]

下面是具体的操作步骤。

🔧 搭建 Arthas Tunnel Server

首先,你需要在Kubernetes集群中部署Arthas Tunnel Server服务,作为所有诊断连接的中枢。

  1. 创建Deployment:使用以下的YAML配置文件来部署Tunnel Server。关键点在于同时暴露7777端口(用于Arthas客户端连接)和8080端口(用于访问Web控制台)。

    yaml 复制代码
    # arthas-tunnel-server-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: arthas-tunnel-server
      namespace: default  # 可根据需要指定命名空间
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: arthas-tunnel-server
      template:
        metadata:
          labels:
            app: arthas-tunnel-server
        spec:
          containers:
          - name: server
            image: '你的镜像仓库/arthas-tunnel-server:3.7.2'  # 使用官方或自建镜像
            args:
              - '--arthas.enable-detail-pages=true'  # 启用详细页面
            ports:
            - name: tunnel-port
              containerPort: 7777  # Arthas客户端连接端口
              protocol: TCP
            - name: web-console-port
              containerPort: 8080  # Web控制台端口
              protocol: TCP

    使用 kubectl apply -f arthas-tunnel-server-deployment.yaml 完成部署。

  2. 创建Service:为了让Tunnel Server能被其他Pod(你的Java应用)和外部网络访问,需要创建一个Service,类型通常为NodePortLoadBalancer

    yaml 复制代码
    # arthas-tunnel-server-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: arthas-tunnel-server-service
      namespace: default
    spec:
      type: NodePort  # 或 LoadBalancer,根据你的集群环境选择
      selector:
        app: arthas-tunnel-server
      ports:
      - name: tunnel
        port: 7777      # Service的端口
        targetPort: 7777 # 对应Pod的端口
        nodePort: 31449  # 如果是NodePort,可指定或随机
      - name: web
        port: 8080
        targetPort: 8080
        nodePort: 31999

    应用这个配置后,记下Service的ClusterIP或外部可访问的地址,稍后配置应用时会用到。

📱 配置应用客户端

接下来,需要让你的Spring Boot应用(即被诊断的目标)能够主动连接到Tunnel Server。

  1. 添加依赖:在应用的pom.xml中引入Arthas Spring Boot Starter。

    xml 复制代码
    <dependency>
        <groupId>com.taobao.arthas</groupId>
        <artifactId>arthas-spring-boot-starter</artifactId>
        <version>3.7.2</version> <!-- 建议使用最新稳定版本 -->
    </dependency>
  2. 配置连接信息:在应用的配置文件(如application.yml)中指定Tunnel Server的地址和当前实例的标识。这对于在多个实例中准确找到要诊断的那个至关重要。

    yaml 复制代码
    arthas:
      agent-id: ${HOSTNAME:${spring.application.name}}  # 建议使用Pod主机名,确保唯一性
      tunnel-server: ws://arthas-tunnel-server-service:7777/ws  # Tunnel Server服务地址
      app-name: ${spring.application.name}  # 应用名,用于在控制台分组展示
      telnet-port: -1   # 禁用Pod内本地telnet端口,增强安全性
      http-port: -1     # 禁用Pod内本地HTTP端口,增强安全性

    关键配置说明: ◦ agent-id:强烈建议使用HOSTNAME(即Pod名称),因为它在K8s环境中是唯一的,便于在控制台精确识别。

    tunnel-server:这里使用了Kubernetes Service的DNS名称(arthas-tunnel-server-service)和端口,这样应用在集群内就可以通过服务发现直接连接Tunnel Server。

🖥️ 进行远程诊断

完成部署和配置后,就可以开始使用了。

  1. 访问Web控制台:通过之前Service暴露的端口(例如http://<节点IP>:31999)访问Arthas Tunnel Server的Web界面。
  2. 选择目标实例:在控制台中,你会看到所有已注册的应用名称(app-name)及其对应的实例(agent-id)。选择你想要诊断的具体实例。
  3. 开始诊断:连接成功后,你就可以在一个类似于本地终端的界面中,使用所有熟悉的Arthas命令(如dashboardwatchtrace等)来诊断远程Pod中的Java应用了。

💡 进阶技巧与最佳实践

• 网络策略与安全:在生产环境中,务必通过Kubernetes的NetworkPolicy对Tunnel Server的端口(7777, 8080)访问进行限制,仅允许必要的客户端Pod或管理端IP段访问,以保障安全。

• 高可用部署:对于关键业务,可以考虑将Tunnel Server部署多个副本,并配置前置的负载均衡器,以提高可用性。

• 权限与审计:Tunnel Server支持多租户和会话记录功能,可以根据需要配置权限控制,并对诊断操作进行审计,满足企业级安全合规要求。

相关推荐
_UMR_16 小时前
springboot集成Jasypt实现配置文件启动时自动解密-ENC
java·spring boot·后端
程序员小假16 小时前
我们来说说 Cookie、Session、Token、JWT
java·后端
短剑重铸之日16 小时前
《SpringBoot4.0初识》第一篇:前瞻与思想
java·开发语言·后端·spring·springboot4.0
it_czz17 小时前
LangSmith vs LangFlow vs LangGraph Studio 可视化配置方案对比
后端
蓝色王者17 小时前
springboot 2.6.13 整合flowable6.8.1
java·spring boot·后端
花哥码天下17 小时前
apifox登录后设置token到环境变量
java·后端
hashiqimiya18 小时前
springboot事务触发滚动与不滚蛋
java·spring boot·后端
TeamDev19 小时前
基于 Angular UI 的 C# 桌面应用
前端·后端·angular.js
PPPHUANG19 小时前
一次 CompletableFuture 误用,如何耗尽 IO 线程池并拖垮整个系统
java·后端·代码规范