本文讲述计算巢全托管服务-ACK部署方案中业务监控和报警的配置方案。
ACK部署方案中的托管版单租服务(每个用户独享集群)和托管版多租服务(多个用户共享集群)接入Prometheus的解决方案一致,都是通过配置ACK集群中的Prometheus的租户指标转发能力,实现用户侧和服务商侧均能看到服务实例的监控指标。(技术支持钉钉群:31045016300)
工作原理
计算巢采用了阿里云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
。如果WhetherSupplierNeedMetric
为true
,则需要配置AccessKeyID
、AccessKeySecret
和SupplierAliuid
这三个属性,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, 如下图所示:
步骤二:配置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
产品标识的配置信息。
步骤五:配置告警
服务商侧接入告警
服务商需要提前创建好告警规则模板,拿到报警规则模板TemplateId。
TemplateId只能从控制台的网络请求中获取
ROS模板中编排告警模板,通过ALIYUN::ARMS::ApplyAlertRuleTemplate资源将此告警模板应用到ACK集群中,即可实现在ACK集群中创建对应的告警规则。 模板示例。
步骤五:查看监控
服务实例部署完成后,用户侧和服务商侧均能在服务实例详情页查看监控大盘
用户侧:
服务商侧: