对于部署在容器服务Kubernetes版中的Java应用,您可以使用应用实时监控服务ARMS对其进行监控,实现自动发现应用拓扑、自动生成3D拓扑、自动发现并监控接口、捕获异常事务和慢事务,大幅提升线上问题诊断的效率。

前提条件

背景信息

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

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

  1. 登录容器服务管理控制台
  2. 在左侧导航栏选择市场 > 应用市场,在右侧应用目录页签通过关键字搜索ack-onepilot,然后单击目标卡片。
  3. ack-onepilot页面上,单击右上角的一键部署
  4. 创建面板中选择安装组件的集群、命名空间,并输入组件发布名称,然后单击下一步
  5. 单击确定

步骤二:授予ARMS资源的访问权限

  • 如果需监控ASK(容器服务Serverless版)或对接了ECI的集群应用,请在云资源访问授权页面完成授权,然后重启ack-onepilot组件下的所有Pod。
  • 如果需监控ACK集群应用,但ACK集群中不存在ARMS Addon Token,请执行以下操作手动为集群授予ARMS资源的访问权限。
    说明

    查看是否存在ARMS Addon Token的操作,请参见查看集群是否存在ARMS Addon Token

    集群存在ARMS Addon Token时,ARMS会进行免密授权。Kubernetes托管版集群默认存在ARMS Addon Token,但对于部分早期创建的Kubernetes托管版集群,可能会存在没有ARMS Addon Token的情况,因此,对于Kubernetes托管版集群,建议首先检查ARMS Addon Token是否存在。若不存在,需进行手动授权。

    1. 登录容器服务管理控制台
    2. 在左侧导航栏选择集群,在集群列表页面,单击目标集群名称或其右侧操作列的详情
    3. 在目标集群的集群信息页面上单击集群资源页签,然后单击Worker RAM角色右侧的链接。Worker RAM Link
    4. 在访问控制RAM控制台的RAM角色管理页面上,单击权限管理页签上的权限策略名称。
    5. 策略内容页签上单击修改策略内容
    6. 脚本编辑页签中添加以下内容,然后单击下一步
      {
         "Action": "arms:*",
         "Resource": "*",
         "Effect": "Allow"
      }
      Modify RAM Authorization
    7. 确认策略内容无误后,单击确定

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

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

  1. 容器服务Kubernetes版控制台左侧导航栏单击集群,在集群列表页面上的目标集群右侧操作列单击应用管理
  2. 无状态页面右上角单击使用YAML创建资源
  3. 选择示例模板,并在模板(YAML格式)中将以下labels添加到spec.template.metadata层级下。
    labels:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"    //请将<your-deployment-name>替换为您的应用名称。
      one-agent.jdk.version: "OpenJDK11"
      armsSecAutoEnable: "on"    //如果需要接入应用安全,则需要配置此参数。
    说明
    YAML Example

    创建一个无状态(Deployment)应用并开启ARMS应用监控的完整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
            armsPilotAutoEnable: "on"
            armsPilotCreateAppName: "arms-k8s-demo"
            one-agent.jdk.version: "OpenJDK11"
        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
            armsPilotAutoEnable: "on"
            armsPilotCreateAppName: "arms-k8s-demo-subcomponent"
            one-agent.jdk.version: "OpenJDK11"
        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控制台按钮。

ARMS Console Button

卸载探针

  1. 登录容器服务管理控制台
  2. 在左侧导航栏单击集群,在集群列表页面上的目标集群右侧操作列单击应用管理
  3. 在左侧导航栏选择应用 > Helm
  4. Helm页面,ARMS Agent对应的发布名称ack-onepilot右侧操作列,单击删除
  5. 删除应用对话框单击确定
  6. 重启您的业务Pod。

后续步骤

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

1. 展示应用总体性能关键指标,自动发现应用拓扑。

2. 3D拓扑图能立体展示应用、服务和主机的健康状况,以及应用的上下游依赖关系,帮助您快速定位诱发故障的服务、被故障影响的应用和关联的主机等,全方位地诊断故障根源,从而快速排除故障。

3. 捕获异常事务和慢事务,获取接口的慢SQL、MQ堆积分析报表或者异常分类报表,对错、慢等常见问题进行更细致的分析。

4. 自动发现和监控应用代码中常见的Web框架和RPC框架,并自动统计Web接口和RPC接口的调用量、响应时间、错误数等指标。