您只需安装ARMS应用监控组件(探针)ack-onepilot,即可监控部署在容器服务Kubernetes版中的Java应用,并查看应用拓扑、接口调用、异常事务和慢事务等相关监控数据。本文介绍如何为容器服务Kubernetes版Java应用安装探针。

前提条件

  • 创建Kubernetes集群。您可按需选择创建Kubernetes专有版集群创建Kubernetes托管版集群创建ASK集群
  • 如果需监控ACK集群应用,请将Helm升级至v3版本。具体操作,请参见【组件升级】Helm V2 Tiller升级公告
  • 创建命名空间,具体操作,请参见管理命名空间与配额。本文示例中的命名空间名称为arms-demo
  • 检查您的JDK版本。ARMS应用监控支持的JDK版本如下:
    • JDK 1.7.0+
    • 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
    说明 JDK 1.8及以下版本、JDK 11和JDK 17版本对应的探针安装包不同,请根据不同的JDK版本下载对应的探针安装包或调整应用监控组件ack-onepilot的配置。

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

重要 ACK旧版应用监控组件arms-pilot已不再维护,您可以安装升级后的ack-onepilot组件用于监控您的应用,ack-onepilot完全兼容arms-pilot,您无需修改应用配置即可无缝接入ack-onepilot。更多信息,请参见如何安装ack-onepilot和卸载arms-pilot
  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角色右侧的链接。
    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"    #如果应用的JDK版本是JDK 11,则需要配置此参数。
      one-agent.jdk.version: "OpenJDK17"    #如果应用的JDK版本是JDK 17,则需要配置此参数。
      armsSecAutoEnable: "on"    #如果需要接入应用安全,则需要配置此参数。
    说明
    YAML Example

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

    展开查看完整示例YAML文件(Java)
    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 
    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。

为集群下指定应用卸载探针

  1. 容器服务Kubernetes版控制台左侧导航栏单击集群,在集群列表页面上的目标集群右侧操作列单击应用管理
  2. 无状态页面目标应用右侧选择更多 > 查看Yaml
  3. 编辑YAML对话框中删除上文安装探针步骤三中添加的labels,然后单击更新
    labels:
      armsPilotAutoEnable: "on"
      armsPilotCreateAppName: "<your-deployment-name>"    #请将<your-deployment-name>替换为您的应用名称。
      one-agent.jdk.version: "OpenJDK11"    #如果应用的JDK版本是JDK 11,则需要配置此参数。
      one-agent.jdk.version: "OpenJDK17"    #如果应用的JDK版本是JDK 17,则需要配置此参数。
      armsSecAutoEnable: "on"    #如果需要接入应用安全,则需要配置此参数。
  4. 重启Pod。

常见问题

如何更改应用名称

如需更改应用名称,您需要修改Deployment内的armsPilotCreateAppName参数。具体操作,请参见部署在容器服务K8s集群中的Java应用如何更改应用名称

为什么Agent安装失败?

可能原因:目标集群中不存在ARMS Addon Token。

解决方案:查看集群是否存在ARMS Addon Token并为集群授予ARMS资源的访问权限。具体操作,请参见容器服务K8s集群中的应用安装Agent失败怎么处理?

如何跨区域上报数据?

在容器集群arms-pilot Namespace下的Deployment中添加ARMS_REPORT_REGION环境变量,值为ARMS所支持的RegionId(例如cn-hangzhou、cn-beijing),然后重启现有应用。更多信息,请参见ACK集群如何跨区域上报数据?