亚马逊AWS官方博客

在EKS中使用Apache Skywalking实现应用性能监控

概述

微服务架构和容器服务越来越受欢迎,但分布式结构对系统运维带来了巨大挑战,运维人员很难发现应用系统性能瓶颈的发生点和出现故障的位置。本文中介绍的Apache Skywalking是一款开源软件,用来收集、分析、统计和可视化分布式系统的调用链信息,应用比较广泛,性能比较突出。下面将介绍在EKS上部署Skywalking OAP和UI应用,部署基于Skywalking Java Agent的Springboot示例应用,并进行端到端的演示和功能介绍。

整体实验的架构图如下:

架构图说明:

1.部署EKS集群。新建EKS集群参考https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html

2.在EKS集群中,部署Skywalking Kubernetes,包含Skywalking OAP和UI两个Kubernetes Deployment和Service,其中Skywalking OAP负责接收 Agent 发送的trace和log数据;UI是展示OAP数据的门户。部署参考:https://github.com/apache/skywalking-kubernetes

3.在EKS集群中,部署包含Skywalking Java Agent的Springboot程序。需创建IAM role for service account,授予S3读权限,用于访问S3的功能演示。参考:https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html

4.在S3创建bucket,并且上传一个测试文件。

5.在Opensearch中,新建domain。

详细步骤说明

1.新建Opensearch Domain

在演示中,采用如下的参考配置:

Network: VPC access

Security Group: 打开80端口,VPC内部IP能访问Opensearch Domain

Fine-grained access control: Disabled

Domain level access policy: Public Access

Require HTTPS for all traffic to the domain: Disabled

Node-to-node encryption: Disabled

新建domain成功后,可以用下面的命令测试domain是否工作正常,其中vpc-xxx.us-east-1.es.amazonaws.com是新建domain的DNS域名。

curl -v http://vpc-xxx.us-east-1.es.amazonaws.com/_cluster/health

2.部署Skywalking Kubernetes

1)安装helm和kubectl

2)部署helm应用

kubectl create namespace skywalking
helm repo add skywalking https://apache.jfrog.io/artifactory/skywalking-helm
helm install skywalking skywalking/skywalking -n skywalking \
  --set oap.image.tag=8.8.1 \
  --set oap.storageType=elasticsearch \
  --set ui.image.tag=8.8.1 \
  --set oap.replicas=1 \
  --set elasticsearch.enabled=false \
  --set elasticsearch.config.host=vpc-xxx.us-east-1.es.amazonaws.com \
  --set elasticsearch.config.port.http=80 \
  --set elasticsearch.config.user="" \
  --set elasticsearch.config.password=""                                

说明:其中elasticsearch.config.host是上一步创建的Opensearch domain的DNS域名。

部署成功后,将返回下面的信息:

NAME: skywalking

LAST DEPLOYED: Tue Apr  5 00:09:31 2022

NAMESPACE: skywalking

STATUS: deployed

通过kubectl get pod -n skywalking命令,查看Skywalking pod是否工作正常,如下显示:

通过kubectl get service -n skywalking命令,获得Skywalking services信息,如下显示:

通过kubectl port-forward svc/skywalking-ui -n skywalking 8080:80命令,可以在浏览器中访问http://127.0.0.1:8080,从而访问skywalking-ui应用。

3.部署Springboot程序

1)Springboot程序示例代码说明

Springboot程序将上传Skywalking日志,和读取S3文件的metadata,参考代码如下:

@RestController

public class TestController {

private static final Logger logger = LoggerFactory.getLogger(TestController.class);

@RequestMapping("/")

public String index() {

logger.warn("message:{}", "hello log1");

logger.warn("message:{}", "hello log2");

return "Springboot Skywalking";

}

@RequestMapping("/aws_s3")

public String aws_s3() {

S3Client s3client = S3Client.builder().region(Region.US_EAST_1).build();

HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()

.bucket(s3BucketName)

.key(s3Key)

.build();

HeadObjectResponse headObjectResponse = s3client.headObject(headObjectRequest);

return "Springboot Skywalking AWS S3:"+headObjectResponse;

}

}

2)Springboot配置说明

在pom.xml文件中,添加Skywalking日志处理的功能依赖。

<dependency>

<groupId>org.apache.skywalking</groupId>

<artifactId>apm-toolkit-logback-1.x</artifactId>

<version>8.9.0</version>

</dependency>

在pom.xml文件中,添加访问S3的依赖。

<dependencyManagement>

<dependencies>

<!-- AWS SDK JAVA 2.x -->

<dependency>

<groupId>software.amazon.awssdk</groupId>

<artifactId>bom</artifactId>

<version>2.17.117</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

<dependencies>

<dependency>

<groupId>software.amazon.awssdk</groupId>

<artifactId>s3</artifactId>

</dependency>

<dependency>

<groupId>software.amazon.awssdk</groupId>

<artifactId>sts</artifactId>

</dependency>

</dependencies>

在resources/application.yml文件中,添加logging的配置项

logging:

config: classpath:logback-spring.xml

在resources目录下,新建文件logback-spring.xml,添加下面的配置,其中%tid是Skywalking traceid。

<!-- 日志发到skywalking oap -->

<appender name="skywalking-oap-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">

<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">

<pattern>%d %p (%file:%line\)- [%tid] %m%n</pattern>

</layout>

</encoder>

</appender>

<root level="INFO">

<appender-ref ref=" skywalking-oap-log " />

</root>

3)下载Skywalking Java Agent

下载地址为https://skywalking.apache.org/downloads/

4)生成Docker image和部署Kubernetes APP(springboot-skywalking)

将Springboot程序和Skywalking Java Agent打包成Docker image,image的启动命令为:

java -javaagent:/home/skywalking-agent/skywalking-agent.jar -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap.skywalking.svc.cluster.local:11800 -DSW_AGENT_NAME=springboot-skywalking -jar springboot-skywalking.jar

其中SW_AGENT_COLLECTOR_BACKEND_SERVICES是上一步部署的Skywalking OAP的地址和端口;SW_AGENT_NAME是在Skywalking UI中显示的服务名。

5)访问springboot-skywalking应用

通过kubectl port-forward svc/springboot-skywalking 8888:80命令,可以在浏览器中访问http://127.0.0.1:8888/,从而访问springboot-skywalking应用。

在浏览器中,分别打开http://127.0.0.1:8888/http://127.0.0.1:8888/aws_s3

在浏览器中,打开http://127.0.0.1:8080/,查看Skywalking UI的信息。

查看trace信息:

  • 点击右上角的“View Logs”,可以看到这次请求的日志

  • 双击请求S3的条目,可以看到请求的具体信息。

查看整体服务的Topology信息:

4.异常排查

当springboot-skywalking APP没有访问S3授权,再次访问http://127.0.0.1:8888/aws_s3时,可以看到在Skywalking UI中,Trace信息有异常显示。

点击<S3文件>,查看详细信息,看到403的异常代码。

Skywalking Java Agent参数设置介绍

在Java Agent目录中,config/agent.config是Skywalking Java Agent的配置文件,下面列举常用的参数说明:

  • 参数sample_n_per_3_secs,可以设置每3秒上传trace的数量,默认是-1,无限制。当系统请求量大时,设置这个参数,可以减少上传的trace数量,从而减少整体系统的压力。
  • 参数ignore_suffix,忽略指定后缀请求的trace
  • 参数service_name,在Skywalking UI中显示的服务名
  • 参数backend_service,指定Skywalking OAP系统的地址和端口
  • 参数dir,指定保存Java Agent自身日志的路径
  • 参数file_name,指定保存Java Agent自身日志的文件名
  • 参数level,设置输出日志的级别

结论

在这篇文章中,介绍了在EKS中如何部署Skywalking OAP和UI服务,部署Opensearch托管服务作为Skywalking的存储,部署包含Skywalking Java Agent的Springboot示例程序和配置文件,并进行了端到端的功能演示,包含查看异常Trace信息,也介绍了Skywalking  Java Agent的部分参数说明。

参考资料

  • https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html
  • https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html
  • https://github.com/apache/skywalking-kubernetes
  • https://skywalking.apache.org/
  • https://skywalking.apache.org/downloads/
  • https://skywalking.apache.org/docs/main/latest/readme/
  • https://skywalking.apache.org/docs/main/latest/en/ui/readme/
  • https://skywalking.apache.org/docs/skywalking-java/latest/readme/
  • https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/supported-list/
  • https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/configurations/

本篇作者

薛召兵

AWS解决方案架构师,负责帮助客户进行上云架构的设计和咨询。同时致力于AWS容器服务、媒体服务和机器学习服务在国内和全球商业客户的应用和推广,推进企业服务迁移上云进程。有10年以上的软件开发、售前技术支持、系统架构设计等经验。