全托管服务监控报警配置-ACK部署方案

本文讲述计算巢全托管服务-ACK部署方案中业务监控和报警的配置方案。

说明

ACK部署方案中的托管版单租服务(每个用户独享集群)和托管版多租服务(多个用户共享集群)接入Prometheus的解决方案一致,都是通过配置ACK集群中的Prometheus的租户指标转发能力,实现用户侧和服务商侧均能看到服务实例的监控指标。(技术支持钉钉群:31045016300)

工作原理

image

  • 计算巢采用了阿里云ARMS提供的Prometheus多租监控的方案。

  • 阿里云Prometheus服务内置了多租能力支持,在采集侧agent端会根据workload资源(支持Pod/Namespace级别)上特定的租户标签来区分租户指标,不同租户的指标会分发到租户对应的云服务实例中。

  • 存储侧天然支持多租隔离特征。接入的服务商需要在相应的租户workload资源上打上规定的“租户标签”即可。

  • 计算巢的全托管多租服务实例是以namespace来隔离各个租户的资源的,当对Namespace打上相应的租户标签,后端程序可实现租户的指标自动转发到租户对应的云服务实例中。

  • 另外通过设置服务商的RemoteWrite,可以把租户的监控数据再投递一份到服务商的账号下,即可实现服务商查看所有租户的监控数据,租户仅可查看自己的监控数据。

操作步骤

步骤一:配置ACK集群的Prometheus组件

Prometheus本身不支持指标转发功能,阿里云托管的Prometheus进行额外的配置后,才能将与用户应用相关的监控指标转发给具体的用户。计算巢将此配置过程封装成了ROS的一个模块,您可直接在ROS模板中使用,

以下是该模块的使用示例及说明。

ClusterArmsConfig:
  Type: 'MODULE::ACS::ComputeNest::AckArmsConfig'
  Version: v1
  Properties:
    ClusterId:
      Fn::If:
        - Condition: CreateACKCondition
        - Ref: ManagedKubernetesCluster
        - Ref: ClusterId
    WhetherSupplierNeedMetric: true
    AccessKeyID: LTAIxxx
    AccessKeySecret: 7Cxxx
    SupplierAliuid: 15634578xxxxxx
  • WhetherSupplierNeedMetric:表示服务商是否需要收到租户的数据,如果服务商也需要收到租户的指标,则需要设置为true。如果WhetherSupplierNeedMetrictrue,则需要配置AccessKeyIDAccessKeySecretSupplierAliuid这三个属性,SupplierAliuid为服务商的阿里uid,AccessKeyID和AccessKeySecret都为服务商的AK。

    重要

    可以设置此AK的权限如下,满足监控需求的同时也满足最小权限授予原则,避免安全问题

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "arms:GetPrometheusApiToken"
          ],
          "Resource": "*"
        }
      ]
    }
  • SyncServiceMonitor: 是否自动同步集群中的ServiceMonitor。您可通过设置此选项来选择监听的Service。可参考此配置文档:通过ServiceMonitor创建服务发现

  • SyncPodMonitor:是否自动同步集群中的PodMonitor。

因为每个ACK集群的Prometheus组件需要配置一次,所以

  • 托管版多租场景中,可以通过创建ACK全托管多租场景-容器基础资源部署这个服务的服务实例来完成ACK集群的Prometheus配置

  • 托管版单租场景中,需要在ROS模板中引用上述模块,确保每个新建的ACK集群都配置好Prometheus组件。

    说明

    这个步骤的前提是ACK集群中已经安装好Prometheus组件,如果是通过ROS模板新建的ACK集群,需要在模板中添加Addons, 如下图所示:image

步骤二:配置ROS模板

  • 需要创建一个以服务实例ID为名称的命名空间,并给该命名空间打上租户标签。

    说明

    其中tenant_useridtenant_clusteridtenant_tokentenant_cloudproductcode为租户标签的key,模板中只需填写固定的占位符即可。该命名空间的名称设置为{{ serviceInstanceId }}这个占位符,表示以创建出来的服务实例的serviceInstanceId命名。

    ClusterNameSpaceApplication:
        Type: ALIYUN::CS::ClusterApplication
        Properties:
          YamlContent:
            Fn::Sub:
              - |
                apiVersion: v1
                kind: Namespace
                metadata:
                  name: '${Name}'
                  labels:
                    tenant_userid: '{{ aliUid }}'
                    tenant_clusterid: '{{ tenantClusterId }}'
                    tenant_token: '{{ tenantToken }}'
                    tenant_cloudproductcode: '{{ tenantCloudProductCode }}'
              - Name: '{{ serviceInstanceId }}'
          ClusterId:
            Fn::If:
              - Condition: CreateACKCondition
              - Ref: ManagedKubernetesCluster
              - Ref: ClusterId
    重要

    服务商的应用要部署在上述创建的命名空间下,才能实现应用的监控指标分发到租户。

  • 如果是托管单租场景,ROS模板中要引用上述AckArmsConfig模块,为每个新创建的ACK集群配置Prometheus。

  • 如果是自定义监控指标,可以通过HTTP端口透出或者Exporter暴露,但暴露指标的Service也必须以{{ serviceInstanceId }}命名, 且定义一个ServiceMonitor用于服务发现,以下是通过mysqld-exporter采集MySQL监控指标时对应的Service和ServiceMonitor的示例。

apiVersion: v1
kind: Service
metadata:
  name: {{ serviceInstanceId }}
  labels:
    io.mysql.service: {{ serviceInstanceId }}
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
      name: mysql
    - protocol: TCP
      port: 9104
      targetPort: 9104
      name: mysql-exporter
  type: LoadBalancer
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: prometheus-service-monitor
  annotations:
    arms.prometheus.io/discovery: 'true'
  labels:
    prometheus-service-monitor: prometheus-service-monitor
spec:
  selector:
    matchLabels:
      io.mysql.service: {{ serviceInstanceId }}
  namespaceSelector:
    matchNames:
      - {{ serviceInstanceId }}
  endpoints:
    - port: mysql-exporter
      scheme: http
      path: /metrics
      interval: 10s
      scrapeTimeout: 10s

步骤三:配置Grafana大盘

目前一个服务实例只支持展示一个大盘,如果服务商有多个大盘,需要将多个大盘组合成一个大盘,大盘需要满足一个规则:

设置大盘的一个固定变量为Namespace,且大盘通过Namespace这个全局变量筛选各个应用的监控指标。在阿里云托管版的Grafana上创建此大盘,得到此大盘的链接。

步骤四:配置产品标识和对应的大盘链接

托管版多租服务使用计算巢提供的Prometheus能力,需要设置服务标识和监控大盘信息:

  1. 服务标识:表示服务在监控系统中的唯一标识,目前cn-mariadb这个产品标识用于测试,所有服务共享使用该产品标识。目前cn-mariadb已开通杭州和中国香港两个地域,并支持在这两个地域下测试。

    说明

    服务上线需要使用专用服务标识的,请加入文章开头的技术支持群获取技术支持

  2. 监控大盘设置包括监控大盘标题和Grafana大盘链接,监控大盘信息与服务标识是对应关系,大盘链接为上述创建大盘的链接,大盘标题为上述配置的大盘的标题。

    说明

    这里的配置目前需要一定的手工配置,请加入技术支持群获取支持

以下是示例服务中使用cn-mariadb产品标识的配置信息。image

步骤五:配置告警

服务商侧接入告警

  • 服务商需要提前创建好告警规则模板,拿到报警规则模板TemplateId。

说明

TemplateId只能从控制台的网络请求中获取image

  • ROS模板中编排告警模板,通过ALIYUN::ARMS::ApplyAlertRuleTemplate资源将此告警模板应用到ACK集群中,即可实现在ACK集群中创建对应的告警规则。 模板示例

步骤五:查看监控

服务实例部署完成后,用户侧和服务商侧均能在服务实例详情页查看监控大盘

  • 用户侧:image

  • 服务商侧:image