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

前提条件

背景信息

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

安装 ARMS 应用监控组件

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

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

为容器服务 Kubernetes 版授权

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

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

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

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

    Modify RAM Authorization

为 Java 应用开启 ARMS 应用监控

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

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

  1. 在容器服务管理控制台左侧导航栏选择应用 > 无状态
  2. 无状态(Deployment)页面右上角单击使用模板创建
  3. 使用模板创建页面上选择集群命名空间示例模板,并在模板(YAML 格式)中将以下 annotations 添加到 spec > template > metadata 层级下。
    说明 请将 <your-deployment-name> 替换为您的应用名称。
    annotations:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"                                

    YAML Example

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

    apiVersion: v1
    kind: Namespace
    metadata:
      name: arms-demo
    ---
    apiVersion: apps/v1beta1 # 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/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/v1beta1 # 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/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/v1beta1 # 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 应用监控,请按以下步骤操作。

  1. 在容器服务管理控制台左侧导航栏选择应用 > 无状态应用 > 有状态
  2. 无状态(Deployment)有状态(StatefulSet)页面上,选择集群命名空间,并在目标应用右侧操作列中选择更多 > 查看 Yaml
    View YAML
  3. 编辑 YAML 对话框中将以下 annotations 添加到 spec > template > metadata 层级下,并单击更新
    说明 请将 <your-deployment-name> 替换为您的应用名称。
    annotations:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"                                

为 PHP 应用开启 ARMS 应用监控

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

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

  1. 在容器服务管理控制台左侧导航栏选择应用 > 无状态
  2. 无状态(Deployment)页面右上角单击 使用模板创建
  3. 使用模板创建页面上选择 集群命名空间示例模板,并在 模板(YAML 格式)中将以下 annotations 添加到 spec > template > metadata 层级下。
    说明 请将 <your-deployment-name> 替换为您的应用名称。
    annotations:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"
      armsAppType: PHP                                
  4. (本步骤仅限首次安装时)请修改 arms-pilot 安装的同名命名空间下的 ConfigMap arms-php.ini,该文件内容为 php.ini 默认配置。
    说明 注意修改 extension=/usr/local/arms/arms-php-agent/arms-7.2.soarms-7.2.so 中的 7.2 为您的 PHP 版本,可使用的值为 5.4/5.5/5.6/7.0/7.1/7.2。
  5. 挂载 arms-php.ini ConfigMap 项到 php.ini 文件 spec > template > spec > containers 下,将 mountPath 设置为您的 php.ini 文件路径。
    volumeMounts:
            - name: php-ini
              mountPath: /etc/php/7.2/fpm/php.ini
              subPath: php.ini
    volumes:
          - name: php-ini
            configMap:
              name: arms-php.ini

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

    apiVersion: v1
    kind: Namespace
    metadata:
      name: arms-php-demo
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql-deployment
      namespace: arms-php-demo
      labels:
        app: mysql
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - image: mysql:5.7
            name: mysql
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-secret
                  key: password
            ports:
            - containerPort: 3306
              name: mysql
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-secret
      namespace: arms-php-demo
    type: Opaque
    data:
      # root base64
      username: cm9vdA==
      # 123456 base64
      password: MTIzNDU2
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-service
      namespace: arms-php-demo
      labels:
        app: mysql
    spec:
      ports:
        - port: 3306
          targetPort: 3306
      selector:
        app: mysql
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: nginx-config
        namespace: arms-php-demo
    data:
        default.conf: |
            server {
                listen       80;
                server_name  localhost;
    
                location / {
                            try_files $uri $uri/ /index.php?$query_string;
                    }
    
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                    root   /usr/share/nginx/html;
                }
    
                location ~ \.php$ {
                    fastcgi_pass   localhost:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  /var/www/html/public/$fastcgi_script_name;
                    include        fastcgi_params;
                }
    
            }
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: arms-php-demo
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: php-server
      type: LoadBalancer
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: php-deployment
      namespace: arms-php-demo
      labels:
        name: php-server
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: php-server
      template:
        metadata:
          labels:
            app: php-server
          annotations:
            armsPilotAutoEnable: "on"
            armsPilotCreateAppName: PHP-ACSK8S-DEMO-3
            armsAppType: PHP
        spec:
          containers:
          - name: nginx-php
            image: nginx:stable
            ports:
            - containerPort: 80
            volumeMounts:
            - name: nginx-conf
              mountPath: /etc/nginx/conf.d/
          - name: php-server
            image: registry.cn-hangzhou.aliyuncs.com/arms-docker-repo/arms-php-demo:v1
            imagePullPolicy: Always
            ports:
            - containerPort: 9000
            env:
              - name: DB_HOST
                value: mysql-service
            volumeMounts:
            - name: php-ini
              mountPath: /etc/php/7.2/fpm/php.ini
              subPath: php.ini
          volumes:
          - name: php-ini
            configMap:
              name: arms-php.ini
          - name: nginx-conf
            configMap:
              name: nginx-config
    

如需为现有应用开启 ARMS 应用监控,请按以下步骤操作。

  1. 在容器服务管理控制台左侧导航栏选择应用 > 无状态应用 > 有状态
  2. 无状态(Deployment)有状态(StatefulSet)页面上,选择 集群命名空间,并在目标应用右侧 操作列中选择更多 > 查看 Yaml
  3. 编辑 YAML 对话框中将以下 annotations 添加到 spec > template > metadata 层级下,并单击 更新
    说明 请将 <your-deployment-name> 替换为您的应用名称。
    annotations:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"
      armsAppType: PHP                                
  4. 挂载 arms-php.ini ConfigMap 项到 php.ini 文件 spec > template > spec > containers 下,将 mountPath 设置为您的 php.ini 文件路径。
    volumeMounts:
            - name: php-ini
              mountPath: /etc/php/7.2/fpm/php.ini
              subPath: php.ini
    volumes:
          - name: php-ini
            configMap:
              name: arms-php.ini

执行结果

无状态(Deployment)有状态(StatefulSet)页面上,目标应用的操作列将出现 ARMS 控制台按钮。


ARMS Console Button
说明操作列没有出现 ARMS 控制台,请检查您是否已授权容器服务访问 ARMS 资源。

后续步骤

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

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

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

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

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