如何利用Prometheus Operator實(shí)現(xiàn)自定義指標(biāo)監(jiān)控,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比全州網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式全州網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋全州地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴。
在過去的文章中,我們花了相當(dāng)大的篇幅來(lái)聊關(guān)于監(jiān)控的話題。這是因?yàn)楫?dāng)你正在管理Kubernetes集群時(shí),一切都會(huì)以極快的速度發(fā)生變化。因此有一個(gè)工具來(lái)監(jiān)控集群的健康狀態(tài)和資源指標(biāo)極為重要。
在Rancher 2.5中,我們引入了基于Prometheus Operator的新版監(jiān)控,它可以提供Prometheus以及相關(guān)監(jiān)控組件的原生Kubernetes部署和管理。Prometheus Operator可以讓你監(jiān)控集群節(jié)點(diǎn)、Kubernetes組件和應(yīng)用程序工作負(fù)載的狀態(tài)和進(jìn)程。同時(shí),它還能夠通過Prometheus收集的指標(biāo)來(lái)定義告警并且創(chuàng)建自定義儀表盤,通過Grafana可以輕松地可視化收集到的指標(biāo)。
新版本的監(jiān)控也采用prometheus-adapter,開發(fā)人員可以利用其基于自定義指標(biāo)和HPA擴(kuò)展他們的工作負(fù)載。
我們將探索如何利用Prometheus Operator來(lái)抓取自定義指標(biāo)并利用這些指標(biāo)進(jìn)行高級(jí)工作負(fù)載管理。
在Rancher 2.5中安裝Prometheus極為簡(jiǎn)單。僅需訪問Cluster Explorer -> Apps并安裝rancher-monitoring即可。
你需要了解以下默認(rèn)設(shè)置:
prometheus-adapter
將會(huì)作為chart安裝的一部分啟用
ServiceMonitorNamespaceSelector
留為空,允許 Prometheus 在所有命名空間中收集 ServiceMonitors
安裝完成后,我們可以從Cluster Explorer訪問監(jiān)控組件。
現(xiàn)在讓我們部署一個(gè)從應(yīng)用層暴露自定義指標(biāo)的示例工作負(fù)載。該工作負(fù)載暴露了一個(gè)簡(jiǎn)單的應(yīng)用程序,該應(yīng)用程序已經(jīng)使用Prometheus client_golang庫(kù)進(jìn)行了檢測(cè),并在/metric
端點(diǎn)上提供了一些自定義指標(biāo)。
它有兩個(gè)指標(biāo):
http_requests_total
http_request_duration_seconds
以下manifest部署了工作負(fù)載、相關(guān)服務(wù)以及訪問該工作負(fù)載的ingress:
apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/name: prometheus-example-app name: prometheus-example-app spec: replicas: 1 selector: matchLabels: app.kubernetes.io/name: prometheus-example-app template: metadata: labels: app.kubernetes.io/name: prometheus-example-app spec: containers: - name: prometheus-example-app image: gmehta3/demo-app:metrics ports: - name: web containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: prometheus-example-app labels: app.kubernetes.io/name: prometheus-example-app spec: selector: app.kubernetes.io/name: prometheus-example-app ports: - protocol: TCP port: 8080 targetPort: 8080 name: web --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: prometheus-example-app spec: rules: - host: hpa.demo http: paths: - path: / backend: serviceName: prometheus-example-app servicePort: 8080
ServiceMonitor是一個(gè)自定義資源定義(CRD),可以讓我們聲明性地定義如何監(jiān)控一組動(dòng)態(tài)服務(wù)。
你可以訪問以下鏈接查看完整的ServiceMonitor規(guī)范:
https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#servicemonitor
現(xiàn)在,我們來(lái)部署ServiceMonitor,Prometheus用它來(lái)收集組成prometheus-example-app Kubernetes服務(wù)的pod。
kind: ServiceMonitor metadata: name: prometheus-example-app spec: selector: matchLabels: app.kubernetes.io/name: prometheus-example-app endpoints: - port: web
如你所見,現(xiàn)在用戶可以在Rancher監(jiān)控中瀏覽ServiceMonitor。
不久之后,新的service monitor和服務(wù)相關(guān)聯(lián)的pod應(yīng)該會(huì)反映在Prometheus服務(wù)發(fā)現(xiàn)中。
我們也能夠在Prometheus中看到指標(biāo)。
在Rancher 2.5中,監(jiān)控可以讓用戶將Grafana儀表盤存儲(chǔ)為cattle-dashboards
命名空間中的ConfigMaps。
用戶或集群管理員現(xiàn)在可以在這一命名空間中添加更多的儀表盤以擴(kuò)展Grafana的自定義儀表盤。
Dashboard ConfigMap Example
apiVersion: v1 kind: ConfigMap metadata: name: prometheus-example-app-dashboard namespace: cattle-dashboards labels: grafana_dashboard: "1" data: prometheus-example-app.json: | { "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 0, "links": [], "panels": [ { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "fieldConfig": { "defaults": { "custom": {} }, "overrides": [] }, "fill": 1, "fillGradient": 0, "gridPos": { "h": 9, "w": 12, "x": 0, "y": 0 }, "hiddenSeries": false, "id": 2, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "rate(http_requests_total{code=\"200\",service=\"prometheus-example-app\"}[5m])", "instant": false, "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "http_requests_total_200", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "", "fieldConfig": { "defaults": { "custom": {} }, "overrides": [] }, "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 9 }, "hiddenSeries": false, "id": 4, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "percentage": false, "pluginVersion": "7.1.5", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "rate(http_requests_total{code!=\"200\",service=\"prometheus-example-app\"}[5m])", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "http_requests_total_not_200", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } } ], "schemaVersion": 26, "style": "dark", "tags": [], "templating": { "list": [] }, "time": { "from": "now-15m", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ] }, "timezone": "", "title": "prometheus example app", "version": 1 }
現(xiàn)在,用戶應(yīng)該能夠在Grafana中訪問prometheus example app的儀表盤。
這一部分假設(shè)你已經(jīng)將prometheus-adapter
作為監(jiān)控的一部分安裝完畢了。實(shí)際上,在默認(rèn)情況下,監(jiān)控安裝程序會(huì)安裝prometheus-adapter。
用戶現(xiàn)在可以創(chuàng)建一個(gè)HPA spec,如下所示:
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: prometheus-example-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: prometheus-example-app minReplicas: 1 maxReplicas: 5 metrics: - type: Object object: describedObject: kind: Service name: prometheus-example-app metric: name: http_requests target: averageValue: "5" type: AverageValue
你可以查看以下鏈接獲取關(guān)于HPA的更多信息:
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
我們將使用自定義的http_requests_total指標(biāo)來(lái)執(zhí)行pod自動(dòng)伸縮。
現(xiàn)在我們可以生成一個(gè)樣本負(fù)載來(lái)查看HPA的運(yùn)行情況。我可以使用hey
進(jìn)行同樣的操作。
hey -c 10 -n 5000 http://hpa.demo
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。