如何在实际项目中集成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支持多租户和会话记录功能,可以根据需要配置权限控制,并对诊断操作进行审计,满足企业级安全合规要求。

相关推荐
蚂蚁背大象10 小时前
Rust 所有权系统是为了解决什么问题
后端·rust
子玖11 小时前
go实现通过ip解析城市
后端·go
Java不加班11 小时前
Java 后端定时任务实现方案与工程化指南
后端
心在飞扬12 小时前
RAG 进阶检索学习笔记
后端
Moment12 小时前
想要长期陪伴你的助理?先从部署一个 OpenClaw 开始 😍😍😍
前端·后端·github
Das1_12 小时前
【Golang 数据结构】Slice 底层机制
后端·go
得物技术12 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
古时的风筝12 小时前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享12 小时前
340. Java Stream API - 理解并行流的额外开销
前端·后端