文档

使用Webshell诊断应用

更新时间:

SAE容器提供了临时的应用运行环境,通常无需运维。为了方便定位和排查线上问题,您可以使用SAE控制台提供的简易版Webshell,查看并调试容器。SAE容器的基础镜像是面向应用运行时的且暂时状态的,因此您无需在镜像中启动SSH服务,仅需带有可执行的/bin/bash,同时建议您带上所需的运维工具以便排查。

使用限制

Webshell不支持Windows镜像。

应用的网络环境

SAE应用置于自建的VPC网络,并提供了命名空间功能,可以将中间件层面的服务调用进行逻辑隔离。命名空间与VPC内的vSwitch为绑定关系,一个命名空间仅能对应一个vSwitch,一个vSwitch可以对应多个命名空间,即VPC内的IP地址为局域网地址,不同VPC内的应用无法互相访问。命名空间主要用于中间件逻辑隔离,不同命名空间内的应用在中间件层面是隔离的,如服务发现和配置下发等。

说明

关于VPC的原理和产品介绍,请参见产品架构

鉴于VPC的产品特性和当前SAE的产品特性,容器无法直接触达VPC外的服务(OSS、镜像服务等阿里云产品除外)。在没有额外配置的情况下,您的容器单独运行在网络环境,因此您无法直接接触SAE应用容器。

容器无法触达公网的代码示例如下。

容器无法触达公网的代码示例

容器内如果需要访问公网服务,须购买NAT,并在VPC内配置vSwitch的SNAT规则。具体操作,请参见配置NAT网关使SAE应用能访问公网

SNAT规则通过配置SNAT条目,可以实现VPC内无公网IP的实例通过NAT网关绑定的EIP来访问公网,从而能够调用公网类产品,获取公网资源。更多信息,请参见公网类产品

构建镜像的方法

基于阿里云容器镜像服务,SAE集成了构建镜像和管理镜像的功能。用于构建的基础镜像为centos:7,并为您配置了语言与编码方式、时区和OpenJDK等运行环境。

容器存在的目的是为了让应用运行起来,SAE不可能以占用所有用户的运行资源为代价,集成过多的工具。因此,若您对容器内工具有更多需求,请自行构建镜像或者按需从OSS获取。更多信息,请参见制作Java镜像

查看Webshell

使用Webshell完成基本运维的操作步骤如下:

  1. 登录SAE控制台

  2. 在左侧导航栏,选择应用管理 > 应用列表,在顶部菜单栏选择地域,然后单击具体应用名称。

  3. 在应用基本信息页面,单击实例部署信息页签。

  4. 实例部署信息页签的默认分组区域,单击目标实例操作列的Webshell

    webshell

  5. 可选:打开Webshell后,您可以单击窗口右上角的bt_full_screen图标,全屏显示窗口。

  6. 按需在Webshell窗口执行命令,查看并调试您的容器。

    更多信息,请参见获取实例内部元数据诊断应用

获取实例内部元数据

您通过SAE成功部署应用后,即可获取实例的基本元数据,包括安全组ID、VPC ID和vSwitch ID。

实例元数据项

说明

/etc/podinfo/sgId

安全组ID元数据所在的路径。

/etc/podinfo/vpcId

VPC ID元数据所在的路径。

/etc/podinfo/vswitchId

vSwitch ID元数据所在的路径。

说明

如果有多个vSwitch,将以半角逗号(,)分隔开多个vSwitch ID。

您可以登录SAE控制台,在Webshell窗口执行以下命令,验证安全组ID、VPC ID和vSwitch ID的元数据信息。

  1. 执行以下命令,进入podinfo目录内。

    cd /etc/podinfo/
    说明

    如果执行该命令时显示can't cd to /etc/podinfo/报错,您可以选择重启实例或重新部署应用解决该问题。

  2. 执行以下命令,查看实例元数据信息的所有文件。

    ls

    预期输出。

    sgId  vpcId  vswitchId
  3. 按需执行以下命令,验证实例内部相应的元数据信息。

    • 获取安全组ID。

      cat sgId

      预期输出。

      sg-2ze4ddm2rqgenvcx****sh-4.2#
    • 获取VPC ID。

      cat vpcId

      预期输出。

      vpc-2zeqku2oevokwm66b****sh-4.2#
    • 获取vSwitch ID。

      cat vswitchId

      预期输出。

      vsw-2zewmy4ynhljytzhu****sh-4.2#

一键复制安装命令

您可以登录SAE控制台,在Webshell窗口按照以下步骤按需安装命令。

说明

在Webshell中安装的命令,会在下次容器重建后消失。对于常用的命令,建议您在制作镜像时提前安装。

  1. 单击Webshell窗口右上角的bt_copy_code图标。

  2. 在弹出的一键复制安装命令对话框内,按需选择以下安装组件,预览命令并单击复制

    • 安装openssh:OpenSSH是SSH(Secure Shell)协议的免费开源实现,OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据。您可以通过安装OpenSSH,借助远程调试的能力实现SSH远程登录以及SFTP、SCP上传下载文件的功能,进而方便您临时调试SAE的某个应用实例。

    • 安装net-tools(netstat)netstat命令用于监控网络状态,可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。

    • 安装iproute(ss):Socket Statistics(ss)命令用于获取Socket统计信息,虽然与netstat命令获取的内容类似,但是ss命令能够快速显示更详细的有关TCP和连接状态的信息。

  3. 在Webshell窗口粘贴已复制的命令并回车执行。

诊断应用

通过常规检查诊断应用

诊断SAE应用包括常规检查和上传下载搜集的日志两种方式。其中,常规检查方法众多。以Java应用为例,有进程检查、线程以及JVM的健康状态检查。操作示例如下。

  • 执行以下命令,检查应用的Java进程是否存在。

    ps -ef | grep java
    说明

    容器内通常使用主进程启动应用,如果应用被停止,则容器也会退出,SAE自动将退出的容器重新启动,防止业务中断。

    • 如果进程不存在,请执行dmesg | grep -i kill命令检查OOM日志。

    • 如果日志存在,表示应用的进程被停止,需要检查工作目录下hs_err_pid{PID}.log日志文件,并定位具体原因。

  • Java类型应用在线分析还可以使用阿里巴巴开源软件Arthas,建议在测试镜像中集成Arthas工具进行常规诊断。Arthas能够实时查看Java类加载情况,方便观察方法出参、入参和环境变量等。

    1. 连接公网。

      具体操作,请参见配置NAT网关使SAE应用能访问公网

    2. 执行以下命令,下载Arthas。

      sudo wget https://alibaba.github.io/arthas/arthas-boot.jar
    3. 执行以下命令,运行Arthas。

      sudo java -jar arthas-boot.jar

通过日志上传下载诊断应用

如果常规检查不能满足您的需求,推荐您将容器内收集到的日志上传到云端,并下载到本地进行分析。

  • 文件不超过10 MB:您可以直接使用Webshell内置的功能。具体操作,请参见使用Webshell实现文件上传下载

  • 文件超过10 MB:您可以使用阿里云OSS服务。OSS服务连通阿里云下所有网络环境,因此您可以使用该服务进行日志上传下载,具体操作步骤如下。

  1. 在容器内部安装OSS命令行工具。具体操作,请参见安装OSS命令行工具

    本文中以64位CentOS系统的用户为例,在没有打通公网的情况下您可以选择在本地下载,然后将这个文件上传到OSS,然后获取OSS的VPC内网地址并下载文件。

    1. 执行以下命令,下载ossutil。

      sudo wget http://gosspublic.alicdn.com/ossutil/1.5.0/ossutil64
    2. 执行以下命令,修改文件执行权限。

      sudo chmod 755 ossutil64
  2. 配置所需的OSS命令行工具,并附上当前地域VPC内的Endpoint,填写用于接收上传文件的账号的AccessKey,查看已经创建的Bucket,检查您的OSS服务是否可用。

    说明
    • 请确保您的阿里云账号(不必是当前账号,任意开通阿里云OSS服务的账号均可)已开通OSS服务。

    • 创建Bucket。具体操作,请参见控制台创建存储空间

    1. 执行以下命令,创建配置文件,用于存储OSS访问信息。

      按照提示配置您的AccessKey、Endpoint信息,无需填写STS Token。

      ./ossutil64 config  
    2. 执行以下命令,列举所有Bucket。

      检查账号是否可用,如果报错则配置错误。

      ./ossutil64 ls

      输出示例如下:

      CreationTime                                 Region    StorageClass    BucketName
      2021-12-08 18:53:46 +0800 CST       oss-cn-hangzhou        Standard    oss://test-bucket
    3. 执行以下命令,创建一个用于上传的模拟日志文件sae-app.log

      echo "Hello" > sae-app.log
    4. 执行以下命令,上传日志文件至指定的Bucket。

      ./ossutil64 cp sae-app.log {bucket-address}                                       

      示例代码如下:

      ./ossutil64 cp sae-app.log oss://test-bucket
  3. 结果验证。

    • 方式一:执行以下命令,查看已上传的示例文件。

      ./ossutil64 ls oss://test-bucket

      输出示例如下:

      LastModifiedTime                   Size(B)  StorageClass   ETAG                                  ObjectName
      2021-12-08 19:26:18 +0800 CST            6      Standard   09F7E02F1290BE211DA707A266F1****      oss://cri-55md3gmii09m****-chart/sae-app.log
      Object Number is: 1
      0.047758(s) elapsed
    • 方式二:从OSS管理控制台或其他工具中找到您的日志文件,下载到本地,并使用您熟悉的工具进行分析。