乐趣区

如何利用 Webshell 诊断 EDAS Serverless 应用

本文主要介绍 Serverless 应用的网络环境以及 Serverless 应用容器内的环境,了解背景知识以及基本的运维知识后可以利用 Webshell 完成基本的运维需求。
Webshell 简介
用户可以通过阿里云控制台直接获取 ECS 的 Shell,从而完成自己的运维需求。如果 ECS 内开启了 SSH 服务,且 ECS 存在弹性公网 IP,那么用户也可以在本地通过 SSH 服务获取 ECS 的 Shell 完成运维需求。
由于 EDAS Serverless 特殊的架构以及网络环境,用户暂时无法直接从本地通过 SSH 服务获取应用容器的 Shell。在 Serverless 场景中,容器是一个暂态的、供应用运行的环境,一般来说不需要进入运维。为了方便用户进行线上问题定位排查,EDAS 在控制台提供了一个简单的 Webshell,供用户查看调试自己的容器。

EDAS 默认给出的 Jar War 类型应用的容器基础镜像主要是面向应用运行时,不带有冗余的排查工具,因此对运维人员可能不够友好。对于用户自身的镜像,不需要镜像中启动 SSH 服务,只需要带有可执行的 /bin/bash 即可。用户自己的镜像可以带上必须的运维工具方便排查。目前 Webshell 不支持 Windows 镜像。

EDAS 应用节点的网络环境
EDAS 应用节点处于用户自己购买的阿里云 VPC 内。在 EDAS 中,还额外提供了一层中间件服务调用隔离的手段:EDAS 命名空间。EDAS 命名空间与 VPC 内的 VSWITCH 是绑定关系,一个 EDAS 命名空间对应一个 VSWITCH,一个 VSWITCH 可以对应多个 EDAS 命名空间。VPC 的原理以及基本的产品情况可以在阿里云 VPC 官方文档了解。简单来讲,VPC 内的 IP 地址为局域网地址,不同 VPC 内的 2 层以上数据包无法路由到目的地。EDAS 命名空间主要做中间件逻辑隔离,不同命名空间内的应用在中间件层面是隔离的,如服务发现以及配置下发等。
由于 VPC 的产品特性以及当前的 EDAS Serverless 的产品特性,容器无法直接触达 VPC 外的服务(阿里云产品除外,如 OSS、镜像服务等)。在没有额外配置的情况下,你的容器运行在网络“孤岛”环境。
了解了基本的网络情况,现在可以明白为什么用户无法直接触达自己的容器了。

容器内需要访问公网服务,可以通过购买 NAT,并配置 VPC 内 VSWITCH 的 SNAT 规则即可,详见阿里云 Serverless 文档。SNAT 规则可以让 VPC 内地址访问公网地址,从而使用公网暴露的服务,获取到公网的资源。
EDAS 构建的镜像的方案
基于阿里云容器镜像服务,EDAS 集成了为用户构建以及管理镜像的功能。用于构建的基础镜像为 centos:7,在此基础上为用户配置好了时区、语言与编码方式、Open JDK 运行环境。容器存在的目的是为了让应用运行起来,EDAS 不可能以占用所有用户运行时资源为代价,集成过多的工具,对于容器内工具有需求的用户,建议自行构建镜像,或者按需从 OSS 拉取。
常见的分析手段
线上容器的运维一般是不必要的。如果你确定需要进入容器进行运维,请务必了解你的操作对线上业务的风险:对于单点应用,你的行为可能导致容器 OOM,从而导致分钟级别的业务中断,而对于多点部署的业务,上述现象可能造成业务秒级中断。
诊断 EDAS 应用一般从这几个方面入手:常规检查,上传搜集的日志。
常规检查
常规检查的方法比较多,以 Java 应用为例,一般是检查进程、线程以及 JVM 的健康状态。

首先执行命令 ps -ef | grep java 检查你的 Java 进程是否还存在。这里必须特别说明的是,容器内一般需要使用主进程启动你的应用,这样一旦你的应用被 kill 掉,容器也会退出,EDAS 会将退出的容器重新启动,防止业务中断。
如果进程不见了,可以执行命令 dmesg | grep -i kill 查看 OOM 相关日志。如果存在日志,那么说明你的应用进程被 kill 掉了,接着检查工作目录下 hs_err_pid{PID}.log 日志文件,定位具体的原因。
Java 类型应用的在线分析可以使用阿里巴巴开源软件 Arthas 解决,建议在测试镜像中集成 Arthas 工具进行常规诊断。Arthas 可以很方便地实时查看类加载情况,观察方法出入参,环境变量等。

# 接入 arthas,需求打通公网
wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
对于网络层的诊断,在了解上述 EDAS 应用节点网络情况的前提下,一般可以通过 curl -v {host/ip} {port} 检查域名解析以及连通性,通过 tcpdump 抓包观察分析网络调用情况。
日志上传解决方案
受限于容器内工具的匮乏,比较推荐的方案是将容器内搜集到的日志上传到云端,然后下载到本地进行分析。目前,EDAS 暂时没有提供容器内日志的下载功能,这里给出一种基于阿里云 OSS 服务的解决方案。OSS 打通了阿里云生态几乎所有的网络环境,你几乎可以在任何网络环境下上传以及下载 OSS 上的文件。
首先在容器内部安装 OSS 命令行工具。
以 64 位 centos 系统,root 下
没有打通公网的情况下可以选择在本地下载,然后将这个文件上传到 oss,然后取 oss 的 vpc 内地址进行下载
wget http://gosspublic.alicdn.com/…chmod 755 ossutil64

* 然后配置你的 OSS 命令行工具,附上当前 region VPC 内的 [endpoint](https://help.aliyun.com/document_detail/31837.html?spm=a2c4g.11186623.2.20.38791594MQjBrb#concept-zt4-cvy-5db)(VPC 内的上传不要求打通公网,也不消耗公网带宽流量,更加经济),填写用于接收上传文件的账号的 [AK/SK](https://help.aliyun.com/document_detail/53045.html?spm=a2c4g.11186623.2.21.23a51594iRgF9H#concept-53045-zh),然后查看已经创建的 Bucket,来检查你的 OSS 服务是否可用。

请先确保账号(不必是当前账号,任意开通阿里云 oss 服务的账号均可)已开通 OSS 服务
按照提示配置你的 AK SK endpoint 信息,ststoken 不需要填写
./ossutil64 config
检查账号是否可用,如果报错则配置错误,如果没有 bucket,则建议前往 oss 控制台创建,命令行工具也支持创建
./ossutil64 ls
这里创建一个模拟的日志文件,用于上传
echo “Hello” > edas-app.log./ossutil64 cp edas-app.log {bucket-address,例如:oss://test-bucket,可以从上述命令 ”./ossutil64 ls” 中查看}

* 从 OSS 控制台或其他工具中找到你的日志文件,下载到本地,并使用你熟悉的工具进行分析。

本文作者:** 落语 **(阿里云智能中间件技术开发工程师,负责分布式应用服务 EDAS 的开发和维护。)

<hr>
本文作者:中间件小哥

[阅读原文](https://yq.aliyun.com/articles/695033?utm_content=g_1000048862)

退出移动版