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

前提条件

背景信息

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

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

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,选择市场 > 应用市场
  3. 应用市场页面单击应用目录页签,然后搜索并选中ack-onepilot
  4. ack-onepilot页面,单击一键部署
  5. 创建面板中,选择集群和命名空间,然后单击下一步
  6. 参数配置页面,设置相应参数,然后单击确定

步骤二:为容器服务Kubernetes版授权

如果ACK集群存在ARMS Addon Token时,ARMS会进行免密授权。如果ACK集群中不存在ARMS Addon Token,需要手动为ACK集群授予ARMS资源的访问权限。

说明 Kubernetes托管版集群默认存在ARMS Addon Token,但对于部分早期创建的Kubernetes托管版集群,可能会存在没有ARMS Addon Token的情况,对于Kubernetes托管版集群,建议首先检查ARMS Addon Token是否存在。
  1. 使用阿里云账号登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在控制台左侧导航栏中,选择配置管理 > 保密字典
  5. 在顶部选择命名空间为kube-system,查看addon.arms.token是否存在。
    说明 如果ACK集群中不存在ARMS Addon Token,需根据后续步骤进行手动授权。
  6. 集群信息页面中,单击集群资源页签,然后单击Worker RAM角色右侧的链接KubernetesWorkerRole-****
  7. 在RAM控制台的RAM角色管理页面上,单击权限管理页签上的权限策略名称k8sWorkerRolePolicy-****
  8. 策略内容页签上单击修改策略内容
  9. 脚本编辑页签中添加以下内容,然后单击下一步:编辑基本信息
    {
       "Action": "arms:*",
       "Resource": "*",
       "Effect": "Allow"
    }
    celve
  10. 确认策略内容无误后,单击确定

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

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

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

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

    apiVersion: v1
    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控制台的应用监控页面。ARMS应用监控具备以下能力:

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

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

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

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