作者:古琦、千陆、彦鸿
随着 Kubernetes 、Serverless 等云原生技术引领研发、运维模式变革。应用架构从单体架构逐步演进为分布式、微服务化应用,随着业务的发展,多语言、多框架、多协议的微服务在企业内部越来越多,微服务的复杂度越来越高,如何通过可观测来快速发现、定位微服务的问题,对于运维人员、开发人员都非常重要。
如何得知应用当前的运行架构、上下游依赖是否正常、流量是否正常这些都是可观测上重要的产品能力,随着微服务类型的增多,不同的语言、不同的框架、不同的如何进行埋点、不同的协议如何处理、是否对性能有影响,这些都影响了微服务可观测能力的建设。为了满足全场景、端到端的应用监控需求,应用实时监控服务 ARMS 推出应用监控 eBPF 版,通过 eBPF 技术完善整个应用监控的体系,接下来将重点介绍应用监控 eBPF 版。
随着公司业务的发展,微服务数量变的越来越多,在不同业务中也会使用一些特定语言来编写应用,导致常用的应用可观测无法满足这种复杂场景,同时非 Java 的语言大部分需要使用 SDK 的方式接入监控,大大降低了研发人员的工作效率,因此应用监控 eBPF 版主要用于解决多语言场景下的应用可观测问题,提供无侵入的、语言无关的可观测能力,同时针对 go 语言的微服务,我们后续将提供一些特定的监控能力,如 GC 监控、内存 Dump、Profiling 等能力。
eBPF 技术是一种在 Linux 内核中运行沙盒程序,而无需更改任何源代码或加载任何内核模块,有以下特性:
eBPF Agent 在 Kubernetes 环境下是 以Daemonset 方式部署在每个节点上,在用户态通过 Load eBPF 的程序到内核中运行,采集到数据后发送到用户态进行数据处理,然后形成不同类型的指标。
eBPF 在可观测领域具备三个最重要的优势:
**为Kubernetes 集群安装以下监控组件即可将集群接入应用监控 eBPF 版:
说明:应用监控 eBPF 版的指标类数据依赖 Prometheus 监控,因此您需要先安装 Prometheus 监控组件。
安装前,需先检查目标集群是否存在 ARMS Addon Token,否则会出现权限不足的报错。若存在 ARMS Addon Token,ARMS 会进行免密授权,组件安装完成后,即可使用应用监控 eBPF 版;若不存在 ARMS Addon Token,则需要手动添加 ARMS 和链路追踪权限策略。查看 ARMS Addon Token 和手动添加权限策略方法如下:
查看集群是否存在 ARMS Addon Token。
手动添加权限策略。
说明:Kubernetes 托管版集群:对于部分 Kubernetes 托管版集群,可能存在没有 ARMS Addon Token 的情况,因此,对于 Kubernetes 托管版集群,建议首先检查 ARMS Addon Token 是否存在。若不存在,仍需进行手动授权。
Kubernetes 专有版集群:默认不支持 ARMS Addon Token,需进行手动授权。
ACK 控制台将会自动安装 Prometheus 监控组件。
说明:命名空间默认为 arms-prom。
说明:命名空间默认为 arms-prom。
labels:
armseBPFAutoEnable: "on"
armseBPFCreateAppName: "" //请将替换为您的应用名称。
创建一个无状态(Deployment)应用并开启 ARMS 应用监控 eBPF 版的完整 YAML 示例模板如下:
apiVersion: v1
kind: Namespace
metadata:
name: arms-demo
---
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: arms-springboot-demo
namespace: arms-demo
labels:
app: arms-springboot-demo
spec:
replicas: 2
selector:
matchLabels:
app: arms-springboot-demo
template:
metadata:
labels:
app: arms-springboot-demo
armseBPFAutoEnable: "on"
armseBPFCreateAppName: "arms-k8s-demo"
spec:
containers:
- resources:
limits:
cpu: 0.5
image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-springboot-demo:v0.1
imagePullPolicy: Always
name: arms-springboot-demo
env:
- name: SELF_INVOKE_SWITCH
value: "true"
- name: COMPONENT_HOST
value: "arms-demo-component"
- name: COMPONENT_PORT
value: "6666"
- name: MYSQL_SERVICE_HOST
value: "arms-demo-mysql"
- name: MYSQL_SERVICE_PORT
value: "3306"
---
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: arms-springboot-demo-subcomponent
namespace: arms-demo
labels:
app: arms-springboot-demo-subcomponent
spec:
replicas: 2
selector:
matchLabels:
app: arms-springboot-demo-subcomponent
template:
metadata:
labels:
app: arms-springboot-demo-subcomponent
armseBPFAutoEnable: "on"
armseBPFCreateAppName: "arms-k8s-demo-subcomponent"
spec:
containers:
- resources:
limits:
cpu: 0.5
image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-springboot-demo:v0.1
imagePullPolicy: Always
name: arms-springboot-demo-subcomponent
env:
- name: SELF_INVOKE_SWITCH
value: "false"
- name: MYSQL_SERVICE_HOST
value: "arms-demo-mysql"
- name: MYSQL_SERVICE_PORT
value: "3306"
---
apiVersion: v1
kind: Service
metadata:
labels:
name: arms-demo-component
name: arms-demo-component
namespace: arms-demo
spec:
ports:
# the port that this service should serve on
- name: arms-demo-component-svc
port: 6666
targetPort: 8888
# label keys and values that must match in order to receive traffic for this service
selector:
app: arms-springboot-demo-subcomponent
---
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: arms-demo-mysql
namespace: arms-demo
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- resources:
limits:
cpu: 0.5
image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-demo-mysql:v0.1
name: mysql
ports:
- containerPort: 3306
name: mysql
---
apiVersion: v1
kind: Service
metadata:
labels:
name: mysql
name: arms-demo-mysql
namespace: arms-demo
spec:
ports:
# the port that this service should serve on
- name: arms-mysql-svc
port: 3306
targetPort: 3306
# label keys and values that must match in order to receive traffic for this service
selector:
app: mysql
--
ARMS 应用监控为 Java 服务提供无侵入的可观测能力,针对 Java 应用我们推荐大家接入 ARMS 应用监控,应用监控 eBPF 版因为其无侵入性,因此其提供语言无关的可观测能力,当前应用监控 eBPF 版只支持 Http 协议,其他协议陆续支持中,我们可以根据自身场景需要进行选型。
如果您在使用应用监控 eBPF 版中有任何问题,请联系答疑钉钉群(群号:35568145)获取帮助。
相关链接:
[1] 开通和升级 ARMS
https://help.aliyun.com/zh/arms/getting-started/activate-arms#concept-65257-zh
[2] 创建 Kubernetes 专有版集群
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-dedicated-cluster#task-skz-qwk-qfb
[3] 创建 Kubernetes 托管版集群
https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/create-an-ack-managed-cluster-2#task-skz-qwk-qfb
[4] 应用监控 eBPF 版运行环境要求和限制
https://help.aliyun.com/zh/arms/application-monitoring-ebpf/getting-started/untitled-document-1698028648754
[5] 容器服务管理控制台
https://account.aliyun.com/login/login.htm?oauth_callback=https%3A%2F%2Fcs.console.aliyun.com%2F
点击此处,立即开通 ARMS 应用监控 eBPF 版。