本文为服务商介绍计算巢全托管服务-ACK部署方案中业务监控和报警的配置方案。
ACK部署方案中的托管版单租服务(每个用户独享集群)和托管版多租服务(多个用户共享集群)接入Prometheus的解决方案一致,都是通过配置ACK集群中的Prometheus的租户指标转发能力,实现用户侧和服务商侧均能看到服务实例的监控指标。(技术支持钉钉群:31045016300)
工作原理

- 计算巢采用了阿里云ARMS提供的Prometheus多租监控的方案。 
- 阿里云Prometheus服务内置了多租能力支持,在采集侧agent端会根据workload资源(支持Pod/Namespace级别)上特定的租户标签来区分租户指标,不同租户的指标会分发到租户对应的云服务实例中。 
- 存储侧天然支持多租隔离特征。接入的服务商需要在相应的租户workload资源上打上规定的“租户标签”即可。 
- 计算巢的全托管多租服务实例是以namespace来隔离各个租户的资源的,当对Namespace打上相应的租户标签,后端程序可实现租户的指标自动转发到租户对应的云服务实例中。 
- 另外通过设置服务商的RemoteWrite,可以把租户的监控数据再投递一份到服务商的账号下,即可实现服务商查看所有租户的监控数据,租户仅可查看自己的监控数据。 
操作步骤
步骤一:配置ACK集群的Prometheus组件
Prometheus本身不支持指标转发功能,阿里云托管的Prometheus进行额外的配置后,才能将与用户应用相关的监控指标转发给具体的用户。
托管版单租场景
在托管版单租场景中,计算巢将此配置过程封装为ROS模板的一个模块,您可直接在ROS模板中使用。
- 在创建服务时将此模板内容集成至ROS模板中,模板的示例及说明如下所示。 - 模板示例: - ClusterArmsConfig: Type: 'MODULE::ACS::ComputeNest::AckArmsConfig' Version: v1 Properties: ClusterId: Fn::If: - Condition: CreateACKCondition - Ref: ManagedKubernetesCluster - Ref: ClusterId WhetherSupplierNeedMetric: true AccessKeyID: LTAI**************** AccessKeySecret: yourAccessKeySecret SupplierAliuid: 15634578xxxxxx
- 参数说明: - WhetherSupplierNeedMetric:表示服务商是否需要收到租户的数据,如果服务商也需要收到租户的指标,则需要设置为- true。如果- WhetherSupplierNeedMetric为- true,则需要配置- AccessKeyID、- AccessKeySecret和- SupplierAliuid这三个属性,- SupplierAliuid为服务商的阿里uid,AccessKeyID和AccessKeySecret都为服务商的AK。重要- 您可以为AK设置如下权限,仅允许调用 - arms:GetPrometheusApiToken接口,用于监控场景下的数据采集或查询。此配置在满足监控需求的同时,遵循最小权限原则,有效降低安全风险。- { "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "arms:GetPrometheusApiToken" ], "Resource": "*" } ] }
- SyncServiceMonitor: 是否自动同步集群中的- ServiceMonitor。您可通过设置此选项来选择监听的- Service,具体操作,请参见通过ServiceMonitor创建服务发现。
- SyncPodMonitor:是否自动同步集群中的- PodMonitor。
 
 
- (可选)如果是通过ROS模板新建的ACK集群,需要在ROS模板的ACK资源中添加Addons参数,如下图所示。  
托管版多租场景
在托管版多租场景中,计算巢提供的服务ACK全托管多租场景-容器基础资源部署,您可以通过创建服务实例的方式,完成ACK集群的Prometheus配置。
您可以为AK设置如下权限,仅允许调用 arms:GetPrometheusApiToken 接口,用于监控场景下的数据采集或查询。此配置在满足监控需求的同时,遵循最小权限原则,有效降低安全风险。
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "arms:GetPrometheusApiToken"
      ],
      "Resource": "*"
    }
  ]
}步骤二:配置ROS模板
- 需要创建一个以服务实例ID为名称的命名空间,并给该命名空间打上租户标签。 说明- 其中 - tenant_userid、- tenant_clusterid、- tenant_token和- tenant_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能力,需要设置服务标识和监控大盘信息:
- 服务标识:表示服务在监控系统中的唯一标识,目前cn-mariadb这个产品标识用于测试,所有服务共享使用该产品标识。目前cn-mariadb已开通杭州和中国香港两个地域,并支持在这两个地域下测试。 说明- 服务上线需要使用专用服务标识的,请加入文章开头的技术支持群获取技术支持。 
- 监控大盘设置包括监控大盘标题和Grafana大盘链接,监控大盘信息与服务标识是对应关系,大盘链接为上述创建大盘的链接,大盘标题为上述配置的大盘的标题。 说明- 这里的配置目前需要一定的手工配置,请加入技术支持群获取支持。 
- 下是示例服务中使用 - cn-mariadb产品标识的配置信息。 
步骤五:配置告警
- 访问ARMS-Prometheus监控控制台,创建Prometheus告警规则模板。具体操作,请参见创建Prometheus告警规则模板。  
- 创建完成后,在控制台的网络请求中获取TemplateId,获取方式如下图所示。 重要- 只有在图中①处,通过筛选搜索才会出现②处的请求。  
- ROS模板中编排告警模板,通过ALIYUN::ARMS::ApplyAlertRuleTemplate资源将此告警模板应用到ACK集群中,即可实现在ACK集群中创建对应的告警规则,ROS模板示例如下所示。 - ROSTemplateFormatVersion: '2015-09-01' Description: en: ApplyAlertRule zh-cn: ApplyAlertRule Parameters: ClusterIds: AssociationPropertyMetadata: Parameter: Required: true Type: String Description: en: The ID of the Prometheus Instance. Description: en: The IDs list of Prometheus Instances. Default: Null MinLength: 1 Required: false MaxLength: 100 AssociationProperty: List[Parameter] Type: Json TemplateIds: AssociationPropertyMetadata: Parameter: Required: true Type: String Description: en: The ID of the Prometheus alert rule template. Description: en: The IDs list of Prometheus alert rule templates. Default: Null MinLength: 1 Required: false MaxLength: 100 AssociationProperty: List[Parameter] Type: Json Resources: ApplyAlertRuleTemplate: Type: ALIYUN::ARMS::ApplyAlertRuleTemplate Properties: ClusterIds: Ref: ClusterIds TemplateIds: Ref: TemplateIds
步骤六:查看监控
服务实例部署完成后,用户侧和服务商侧均能在服务实例详情页查看监控大盘。
- 用户侧:  
- 服务商侧: 