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

相关推荐
brzhang5 小时前
读懂 MiniMax Agent 的设计逻辑,然后我复刻了一个MiniMax Agent
前端·后端·架构
草明5 小时前
Go 的 IO 多路复用
开发语言·后端·golang
蓝-萧5 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
故事不长丨5 小时前
【Java SpringBoot+Vue 实现视频文件上传与存储】
java·javascript·spring boot·vscode·后端·vue·intellij-idea
9ilk6 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 前置技术
分布式·后端·中间件·rabbitmq
鬼火儿7 小时前
Golang笔记——Interface类型
java·后端
三十_A7 小时前
【无标题】
前端·后端·node.js
蓝-萧7 小时前
Redis——Windows安装
java·后端
王元_SmallA8 小时前
【玩转全栈】----Django基本配置和介绍
java·后端