Java应用监控

对于部署在ACK集群中的Java应用,您只需安装ARMS应用监控组件ack-onepilot,即可实现自动发现应用拓扑、自动生成3D拓扑、自动发现并监控接口、捕获异常事务和慢事务等监控功能,大幅提升线上问题诊断的效率。

背景信息

应用实时监控服务ARMS(Application Real-Time Monitoring Service)是一款阿里云应用性能管理(APM)类监控产品。对于部署在容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)中的Java应用,只需安装并授权ARMS应用监控组件ack-onepilot,无需修改任何代码,即可实现对Java应用的全方位监控。这使得您可以快速定位出错接口和慢接口、重现调用参数、检测内存泄漏、发现系统瓶颈,从而大幅提升线上问题诊断的效率。ARMS应用监控的详细信息请参见什么是应用监控

前提条件

  • 已创建命名空间。具体操作,请参见管理命名空间与配额。本文示例中的命名空间为arms-demo

  • 检查您的JDK版本。ARMS应用监控支持的JDK版本如下:

    • JDK 1.7.0+

      重要

      ARMS应用监控将于3.0.X探针版本终止支持Java 7,如果您还在使用Java 7,请尽快升级Java版本。更多信息,请参见【产品变更】ARMS应用监控终止对Java 7的支持

    • JDK 1.8.0_25+

      说明
      • Kubernetes集群应用部署建议:JDK 1.8.0_191+。

      • 如果JDK版本为1.8.0_25或者1.8.0_31,可能会出现无法安装探针的情况,请升级至1.8.X最新版本。

    • JDK 11.0.8+

    • JDK 17

  • 开通ARMS

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

重要

ACK旧版应用监控组件arms-pilot已不再维护,您可以安装升级后的ack-onepilot组件用于监控您的应用,ack-onepilot完全兼容arms-pilot,您无需修改应用配置即可无缝接入ack-onepilot。更多信息,请参见如何安装ack-onepilot和卸载arms-pilot

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,搜索关键字ack-onepilot

  4. ack-onepilot卡片上单击安装,并在弹出的页面中可以配置相关的参数,建议使用默认值,然后单击确定

    说明

    ack-onepilot组件默认支持1000个Pod规模,集群Pod每超过1000个,ack-onepilot资源对应的CPU请增加0.5核、内存请增加512MB。

    安装完成后,您可以在组件管理页面升级、配置或卸载ack-onepilot组件。

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

  • 如需监控ACK集群应用,但ACK集群中不存在addon.arms.token,请执行以下操作手动为集群授予ARMS资源的访问权限。如果已经存在addon.arms.token,则无需执行授权操作。

    说明

    当ACK集群中存在addon.arms.token时,ARMS能够自动完成免密授权过程。通常情况下,ACK托管集群默认配备了addon.arms.token。然而,对于一些较早创建的ACK托管集群来说,可能存在缺少addon.arms.token的情形。

    1. 检查addon.arms.token是否存在。

      查看集群是否存在addon.arms.token

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 保密字典

      3. 保密字典页面,选择命名空间kube-system,查看addon.arms.token是否存在。

    2. 如果addon.arms.token存在,无需执行后续授权操作。否则,请执行以下操作手动为集群授予ARMS资源的访问权限。

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

      3. 基本信息页签下,单击集群资源区域内的Worker RAM角色右侧的链接。

      4. 角色页面的权限管理页签上,单击新增授权

      5. 选择权限为AliyunARMSFullAccess,然后单击确定

  • 如需监控对接了ECI的ACK托管集群应用,请在云资源访问授权页面完成授权,然后重启ack-onepilot组件下的所有Pod。

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

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

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面右上角单击使用YAML创建资源

  4. 选择示例模板,并在模板(YAML格式)中将以下labels添加到spec.template.metadata层级下。

    labels:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"    #请将<your-deployment-name>替换为您的应用名称。
      armsSecAutoEnable: "on"    #如果需要接入应用安全,则需要配置此参数。
    说明

    YAML Example

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

    展开查看完整实示例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

后续步骤

完成上述步骤后,您就为部署在容器服务Kubernetes版中的应用开启了ARMS应用监控。在目标应用的操作列中单击ARMS控制台,将进入ARMS控制台的应用监控页面。更多信息,请参见应用总览image.png

常见问题