[10.14 上海 WorkShop] 通过 ARMS 实现应用监控

应用实时监控服务 ARMS(Application Real-Time Monitoring Service)是一款阿里云应用性能管理(APM)类监控产品。只要为部署在容器服务 Kubernetes 版中的 Java/PHP 应用安装 ARMS 应用监控组件,您无需修改任何代码,就能借助 ARMS 对应用进行全方位监控,实现自动发现应用拓扑、自动发现并监控接口、捕获异常事务和慢事务等功能,以便您更快速地定位出错接口和慢接口、重现调用参数、检测内存泄漏、发现系统瓶颈,从而大幅提升线上问题诊断问题的效率。ARMS 应用监控的详细信息请参见应用监控概述

前提条件


操作步骤


步骤一:安装 ARMS 应用监控组件

首先需要安装 ARMS 应用监控组件 ack-arms-pilot。

  1. 登录容器服务 Kubernetes 版控制台
  2. 在左侧导航栏选择市场 > 应用目录,在右侧选中 ack-arms-pilot
  3. 应用目录 - ack-arms-pilot 页面上,在右侧的创建面板中选择前提条件中创建的集群和命名空间,并单击创建

步骤二:为容器服务授予访问权限

为容器服务 Kubernetes 版授予 ARMS 资源的访问权限。

  1. 使用主账号登录容器服务 Kubernetes 版控制台
  2. 在左侧导航栏选择集群 > 集群,在目标集群右侧操作列单击管理

    [10.14 上海 WorkShop] 通过 ARMS 实现应用监控

  3. 在目标集群的基本信息页面上,单击集群资源区域的 Worker RAM 角色链接。

    [10.14 上海 WorkShop] 通过 ARMS 实现应用监控

  4. 在 RAM 访问控制控制台的 RAM 角色管理页面上,单击权限管理页签上的目标权限策略名称链接。
  5. 策略内容页签上单击修改策略内容,并在右侧的修改策略内容面板将以下内容添加到策略内容中,最后单击确认

    {
                            "Action": "arms:*",
                            "Resource": "*",
                            "Effect": "Allow"
                            }

    [10.14 上海 WorkShop] 通过 ARMS 实现应用监控

步骤三:为 Java 应用开启 ARMS 应用监控

以下步骤分别对应创建新应用和已有应用这两种情况。

如需在创建新应用的同时开启 ARMS 应用监控,请按以下步骤操作。

  1. 在容器服务管理控制台左侧导航栏选择应用 > 无状态
  2. 无状态(Deployment)页面右上角单击使用模板创建
  3. 使用模板创建页面上选择集群命名空间示例模板,并在模板(YAML 格式)中将以下 annotations 添加到 spec > template > metadata 层级下。

    说明: 请将 <your-deployment-name> 替换为您的应用名称。

    annotations:
                            armsPilotAutoEnable: "on"
                            armsPilotCreateAppName: "<your-deployment-name>"                                

    [10.14 上海 WorkShop] 通过 ARMS 实现应用监控

创建一个无状态(Deployment)应用并开启 ARMS 应用监控的完整 YAML 示例模板如下:

注意:如果您的环境无法访问公网,请将镜像地址替换为 vpc 地址,如:

registry.cn-hangzhou.aliyuncs.com/containerdemo/arms-springboot-demo:v0.1 修改:

registry-vpc.cn-hangzhou.aliyuncs.com/containerdemo/arms-springboot-demo:v0.1

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:
      annotations:
        armsPilotAutoEnable: "on"
        armsPilotCreateAppName: "arms-k8s-demo"
      labels:
        app: arms-springboot-demo
    spec:
      containers:
        - resources:
            limits:
              cpu: 0.5
          image: registry.cn-hangzhou.aliyuncs.com/containerdemo/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:
      annotations:
        armsPilotAutoEnable: "on"
        armsPilotCreateAppName: "arms-k8s-demo-subcomponent"
      labels:
        app: arms-springboot-demo-subcomponent
    spec:
      containers:
        - resources:
            limits:
              cpu: 0.5
          image: registry.cn-hangzhou.aliyuncs.com/containerdemo/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/containerdemo/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 应用监控,请按以下步骤操作。

  1. 在容器服务管理控制台左侧导航栏选择应用 > 无状态应用 > 有状态
  2. 无状态(Deployment)有状态(StatefulSet)页面上,选择集群命名空间,并在目标应用右侧操作列中选择更多 > 查看 Yaml
  3. 编辑 YAML 对话框中将以下 annotations 添加到 spec > template > metadata 层级下,并单击更新

    说明: 请将 <your-deployment-name> 替换为您的应用名称。

    annotations:
                            armsPilotAutoEnable: "on"
                            armsPilotCreateAppName: "<your-deployment-name>"                                

后续步骤


完成上述步骤后,您就为部署在容器服务 Kubernetes 版中的应用开启了 ARMS 应用监控。在目标应用的操作列中单击 ARMS 控制台,将进入 ARMS 控制台的应用监控页面。ARMS 应用监控具备以下能力:

  1. 展示应用总体性能关键指标,自动发现应用拓扑。
  2. 3D 拓扑图能立体展示应用、服务和主机的健康状况,以及应用的上下游依赖关系,帮助您快速定位诱发故障的服务、被故障影响的应用和关联的主机等,全方位地诊断故障根源,从而快速排除故障。
  3. 捕获异常事务和慢事务,获取接口的慢 SQL、MQ 堆积分析报表或者异常分类报表,对错、慢等常见问题进行更细致的分析。
  4. 自动发现和监控应用代码中常见的 Web 框架和 RPC 框架,并自动统计 Web 接口和 RPC 接口的调用量、响应时间、错误数等指标。
上一篇:[10.14 Workshop] 容器 DevSecOps 全链路体验


下一篇:对protostuff和java序列化的小测试