全托管服務(wù)監(jiān)控報(bào)警配置-ACK部署方案
本文講述計(jì)算巢全托管服務(wù)-ACK部署方案中業(yè)務(wù)監(jiān)控和報(bào)警的配置方案。
ACK部署方案中的托管版單租服務(wù)(每個(gè)用戶獨(dú)享集群)和托管版多租服務(wù)(多個(gè)用戶共享集群)接入Prometheus的解決方案一致,都是通過(guò)配置ACK集群中的Prometheus的租戶指標(biāo)轉(zhuǎn)發(fā)能力,實(shí)現(xiàn)用戶側(cè)和服務(wù)商側(cè)均能看到服務(wù)實(shí)例的監(jiān)控指標(biāo)。(技術(shù)支持釘釘群:31045016300)
工作原理
計(jì)算巢采用了阿里云ARMS提供的Prometheus多租監(jiān)控的方案。
阿里云Prometheus服務(wù)內(nèi)置了多租能力支持,在采集側(cè)agent端會(huì)根據(jù)workload資源(支持Pod/Namespace級(jí)別)上特定的租戶標(biāo)簽來(lái)區(qū)分租戶指標(biāo),不同租戶的指標(biāo)會(huì)分發(fā)到租戶對(duì)應(yīng)的云服務(wù)實(shí)例中。
存儲(chǔ)側(cè)天然支持多租隔離特征。接入的服務(wù)商需要在相應(yīng)的租戶workload資源上打上規(guī)定的“租戶標(biāo)簽”即可。
計(jì)算巢的全托管多租服務(wù)實(shí)例是以namespace來(lái)隔離各個(gè)租戶的資源的,當(dāng)對(duì)Namespace打上相應(yīng)的租戶標(biāo)簽,后端程序可實(shí)現(xiàn)租戶的指標(biāo)自動(dòng)轉(zhuǎn)發(fā)到租戶對(duì)應(yīng)的云服務(wù)實(shí)例中。
另外通過(guò)設(shè)置服務(wù)商的RemoteWrite,可以把租戶的監(jiān)控?cái)?shù)據(jù)再投遞一份到服務(wù)商的賬號(hào)下,即可實(shí)現(xiàn)服務(wù)商查看所有租戶的監(jiān)控?cái)?shù)據(jù),租戶僅可查看自己的監(jiān)控?cái)?shù)據(jù)。
操作步驟
步驟一:配置ACK集群的Prometheus組件
Prometheus本身不支持指標(biāo)轉(zhuǎn)發(fā)功能,阿里云托管的Prometheus進(jìn)行額外的配置后,才能將與用戶應(yīng)用相關(guān)的監(jiān)控指標(biāo)轉(zhuǎn)發(fā)給具體的用戶。計(jì)算巢將此配置過(guò)程封裝成了ROS的一個(gè)模塊,您可直接在ROS模板中使用,
以下是該模塊的使用示例及說(shuō)明。
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
:表示服務(wù)商是否需要收到租戶的數(shù)據(jù),如果服務(wù)商也需要收到租戶的指標(biāo),則需要設(shè)置為true
。如果WhetherSupplierNeedMetric
為true
,則需要配置AccessKeyID
、AccessKeySecret
和SupplierAliuid
這三個(gè)屬性,SupplierAliuid
為服務(wù)商的阿里uid,AccessKeyID和AccessKeySecret都為服務(wù)商的AK。重要可以設(shè)置此AK的權(quán)限如下,滿足監(jiān)控需求的同時(shí)也滿足最小權(quán)限授予原則,避免安全問(wèn)題
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "arms:GetPrometheusApiToken" ], "Resource": "*" } ] }
SyncServiceMonitor: 是否自動(dòng)同步集群中的ServiceMonitor。您可通過(guò)設(shè)置此選項(xiàng)來(lái)選擇監(jiān)聽(tīng)的Service。可參考此配置文檔:通過(guò)ServiceMonitor創(chuàng)建服務(wù)發(fā)現(xiàn)
SyncPodMonitor:是否自動(dòng)同步集群中的PodMonitor。
因?yàn)槊總€(gè)ACK集群的Prometheus組件需要配置一次,所以
托管版多租場(chǎng)景中,可以通過(guò)創(chuàng)建ACK全托管多租場(chǎng)景-容器基礎(chǔ)資源部署這個(gè)服務(wù)的服務(wù)實(shí)例來(lái)完成ACK集群的Prometheus配置。
托管版單租場(chǎng)景中,需要在ROS模板中引用上述模塊,確保每個(gè)新建的ACK集群都配置好Prometheus組件。
說(shuō)明這個(gè)步驟的前提是ACK集群中已經(jīng)安裝好Prometheus組件,如果是通過(guò)ROS模板新建的ACK集群,需要在模板中添加Addons, 如下圖所示:
步驟二:配置ROS模板
需要?jiǎng)?chuàng)建一個(gè)以服務(wù)實(shí)例ID為名稱的命名空間,并給該命名空間打上租戶標(biāo)簽。
說(shuō)明其中
tenant_userid
、tenant_clusterid
、tenant_token
和tenant_cloudproductcode
為租戶標(biāo)簽的key
,模板中只需填寫(xiě)固定的占位符即可。該命名空間的名稱設(shè)置為{{ serviceInstanceId }}這個(gè)占位符,表示以創(chuàng)建出來(lái)的服務(wù)實(shí)例的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
重要服務(wù)商的應(yīng)用要部署在上述創(chuàng)建的命名空間下,才能實(shí)現(xiàn)應(yīng)用的監(jiān)控指標(biāo)分發(fā)到租戶。
如果是托管單租場(chǎng)景,ROS模板中要引用上述
AckArmsConfig
模塊,為每個(gè)新創(chuàng)建的ACK集群配置Prometheus。如果是自定義監(jiān)控指標(biāo),可以通過(guò)HTTP端口透出或者Exporter暴露,但暴露指標(biāo)的Service也必須以{{ serviceInstanceId }}命名, 且定義一個(gè)ServiceMonitor用于服務(wù)發(fā)現(xiàn),以下是通過(guò)mysqld-exporter采集MySQL監(jiān)控指標(biāo)時(shí)對(duì)應(yīng)的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大盤
目前一個(gè)服務(wù)實(shí)例只支持展示一個(gè)大盤,如果服務(wù)商有多個(gè)大盤,需要將多個(gè)大盤組合成一個(gè)大盤,大盤需要滿足一個(gè)規(guī)則:
設(shè)置大盤的一個(gè)固定變量為Namespace
,且大盤通過(guò)Namespace這個(gè)全局變量篩選各個(gè)應(yīng)用的監(jiān)控指標(biāo)。在阿里云托管版的Grafana上創(chuàng)建此大盤,得到此大盤的鏈接。
步驟四:配置產(chǎn)品標(biāo)識(shí)和對(duì)應(yīng)的大盤鏈接
托管版多租服務(wù)使用計(jì)算巢提供的Prometheus能力,需要設(shè)置服務(wù)標(biāo)識(shí)和監(jiān)控大盤信息:
服務(wù)標(biāo)識(shí):表示服務(wù)在監(jiān)控系統(tǒng)中的唯一標(biāo)識(shí),目前cn-mariadb這個(gè)產(chǎn)品標(biāo)識(shí)用于測(cè)試,所有服務(wù)共享使用該產(chǎn)品標(biāo)識(shí)。目前cn-mariadb已開(kāi)通杭州和中國(guó)香港兩個(gè)地域,并支持在這兩個(gè)地域下測(cè)試。
說(shuō)明服務(wù)上線需要使用專用服務(wù)標(biāo)識(shí)的,請(qǐng)加入文章開(kāi)頭的技術(shù)支持群獲取技術(shù)支持。
監(jiān)控大盤設(shè)置包括監(jiān)控大盤標(biāo)題和Grafana大盤鏈接,監(jiān)控大盤信息與服務(wù)標(biāo)識(shí)是對(duì)應(yīng)關(guān)系,大盤鏈接為上述創(chuàng)建大盤的鏈接,大盤標(biāo)題為上述配置的大盤的標(biāo)題。
說(shuō)明這里的配置目前需要一定的手工配置,請(qǐng)加入技術(shù)支持群獲取支持。
以下是示例服務(wù)中使用cn-mariadb
產(chǎn)品標(biāo)識(shí)的配置信息。
步驟五:配置告警
服務(wù)商側(cè)接入告警
服務(wù)商需要提前創(chuàng)建好告警規(guī)則模板,拿到報(bào)警規(guī)則模板TemplateId。
TemplateId只能從控制臺(tái)的網(wǎng)絡(luò)請(qǐng)求中獲取
ROS模板中編排告警模板,通過(guò)ALIYUN::ARMS::ApplyAlertRuleTemplate資源將此告警模板應(yīng)用到ACK集群中,即可實(shí)現(xiàn)在ACK集群中創(chuàng)建對(duì)應(yīng)的告警規(guī)則。 模板示例。
步驟五:查看監(jiān)控
服務(wù)實(shí)例部署完成后,用戶側(cè)和服務(wù)商側(cè)均能在服務(wù)實(shí)例詳情頁(yè)查看監(jiān)控大盤
用戶側(cè):
服務(wù)商側(cè):