在Kubernetes集群中集成Arthas Tunnel Server,可以让你像使用本地工具一样远程诊断任意Pod中的Java应用,无需频繁进行端口转发或进入容器内部。下面这张图清晰地展示了实现这一目标的完整工作流程。
与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服务,作为所有诊断连接的中枢。
-
创建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完成部署。 -
创建Service:为了让Tunnel Server能被其他Pod(你的Java应用)和外部网络访问,需要创建一个Service,类型通常为
NodePort或LoadBalancer。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。
-
添加依赖:在应用的
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> -
配置连接信息:在应用的配置文件(如
application.yml)中指定Tunnel Server的地址和当前实例的标识。这对于在多个实例中准确找到要诊断的那个至关重要。yamlarthas: 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。
🖥️ 进行远程诊断
完成部署和配置后,就可以开始使用了。
- 访问Web控制台:通过之前Service暴露的端口(例如
http://<节点IP>:31999)访问Arthas Tunnel Server的Web界面。 - 选择目标实例:在控制台中,你会看到所有已注册的应用名称(
app-name)及其对应的实例(agent-id)。选择你想要诊断的具体实例。 - 开始诊断:连接成功后,你就可以在一个类似于本地终端的界面中,使用所有熟悉的Arthas命令(如
dashboard、watch、trace等)来诊断远程Pod中的Java应用了。
💡 进阶技巧与最佳实践
• 网络策略与安全:在生产环境中,务必通过Kubernetes的NetworkPolicy对Tunnel Server的端口(7777, 8080)访问进行限制,仅允许必要的客户端Pod或管理端IP段访问,以保障安全。
• 高可用部署:对于关键业务,可以考虑将Tunnel Server部署多个副本,并配置前置的负载均衡器,以提高可用性。
• 权限与审计:Tunnel Server支持多租户和会话记录功能,可以根据需要配置权限控制,并对诊断操作进行审计,满足企业级安全合规要求。