微服務(wù)監(jiān)控 - Prometheus

原文:https://makeoptim.com/service-mesh/prometheus

正如互聯(lián)網(wǎng)架構(gòu)演進(jìn)所講的,微服務(wù)給我們帶來許多好處,但同時也帶來許多問題,微服務(wù)的監(jiān)控便是其中之一。

在微服務(wù)系統(tǒng)中,我們需要時刻了解系統(tǒng)和服務(wù)的各種運(yùn)行指標(biāo),更需要在出現(xiàn)問題的時候警報通知我們。因此,監(jiān)控系統(tǒng)對于微服務(wù)來說是必不可少的。

Prometheus

image

目前為止,市面上最為流行的監(jiān)控工具是 Prometheus。Prometheus 最初是 SoundCloud 構(gòu)建的開源系統(tǒng)監(jiān)視和警報工具包 。自 2012 年成立以來,許多公司和組織都采用了 Prometheus,該項目擁有非?;钴S的開發(fā)人員和用戶社區(qū)?,F(xiàn)在,它是一個獨立的開源項目,并且獨立于任何公司進(jìn)行維護(hù)。為了強(qiáng)調(diào)這一點并闡明項目的治理結(jié)構(gòu),Prometheus 在 2016 年加入了 Cloud Native Computing Foundation,這是繼 Kubernetes 之后的第二個托管項目。

特點

Prometheus 相較于其他監(jiān)控工具具有如下特點:

  • 多維數(shù)據(jù):Prometheus 是個時間序列數(shù)據(jù)庫,支持由指標(biāo)名稱和鍵值對標(biāo)識的時間序列數(shù)據(jù)的多維數(shù)據(jù)模型。
  • 強(qiáng)大的查詢:PromQL 允許對收集的時間序列數(shù)據(jù)進(jìn)行切片和切塊,以生成臨時圖形,表格和警報。
  • 出色的可視化:Prometheus 具有多種用于可視化數(shù)據(jù)的模式:內(nèi)置表達(dá)式瀏覽器,Grafana 集成和控制臺模板語言。
  • 高效存儲:Prometheus 以有效的自定義格式將時間序列存儲在內(nèi)存中和本地磁盤上。通過功能性分片和聯(lián)合來實現(xiàn)縮放。
  • 部署簡單:每個服務(wù)器在可靠性方面都是獨立的,僅依賴于本地存儲。用 Go 語言編寫的所有二進(jìn)制文件都是靜態(tài)鏈接的,易于部署。
  • 精確警報:警報是基于 Prometheus 靈活的 PromQL 定義的,并維護(hù)尺寸信息。警報管理器處理通知和沉默。
  • 提供了許多客戶端庫:客戶端庫可輕松檢測服務(wù)。已經(jīng)支持十多種語言,并且也很容易實現(xiàn)自定義庫。
  • 提供許多集成:現(xiàn)有的 Exporters 允許將第三方數(shù)據(jù)橋接到 Prometheus 中。比如:系統(tǒng)統(tǒng)計信息、Docker、HAProxy、StatsD 和 JMX 指標(biāo)。
  • 支持通過服務(wù)發(fā)現(xiàn)或靜態(tài)配置發(fā)現(xiàn)目標(biāo)
  • 通過 HTTP 的服務(wù)拉取時間序列數(shù)據(jù)
  • 支持推送的方式來添加時間序列數(shù)據(jù):這點在一些生命周期很短的服務(wù)中非常有用,比如:定時任務(wù)中,每個任務(wù)都很短,可能等不及拉取的時間,任務(wù)的 Pod 就已經(jīng) Completed 了,這個時候就可以使用推送的方式。

組件

Prometheus 生態(tài)系統(tǒng)包含多個組件,其中許多是可選的:

  • Prometheus Server:用于抓取指標(biāo)、存儲時間序列數(shù)據(jù)
  • Client Librarys:客戶端庫
  • Pushgateway:支持短期工作的推送網(wǎng)關(guān),以推送的方式將指標(biāo)數(shù)據(jù)推送到該網(wǎng)關(guān)
  • exporters:暴露指標(biāo)讓任務(wù)來抓
  • alertmanager:處理報警的報警組件
  • 各種支持工具

大多數(shù) Prometheus 組件都是用 Go 編寫的,因此易于構(gòu)建和部署為靜態(tài)二進(jìn)制文件。

架構(gòu)

image

Prometheus 根據(jù)配置文件中設(shè)置的時間,直接或者通過中間的 Pushgateway 網(wǎng)關(guān)獲取指標(biāo)數(shù)據(jù),在本地存儲所有的獲取的指標(biāo)數(shù)據(jù),并對這些數(shù)據(jù)進(jìn)行一些規(guī)則整理,用來生成一些聚合數(shù)據(jù)或者報警信息,Grafana 或者其他工具用來可視化這些數(shù)據(jù)。

部署

為了熟悉 Prometheus 的詳細(xì)工作流程,我們先在開發(fā)環(huán)境上搭建 Prometheus 和 Grafana,然后使用它們采集和展示一些指標(biāo)。

ConfigMap

Prometheus 通過配置文件 prometheus.yml 啟動。

#  prometheus.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: observability
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      scrape_timeout: 15s
    rule_files:
      # - "first.rules"
      # - "second.rules"
    scrape_configs:
    - job_name: 'prometheus'
      static_configs:
      - targets: ['localhost:9090']

基本的配置文件包括以下三個模塊:

  • global:全局配置
    • scrape_interval:抓取指標(biāo)的頻率,默認(rèn)是 15s。
    • scrape_timeout:評估規(guī)則的頻率,這里也設(shè)置為 15s。prometheus 使用規(guī)則產(chǎn)生新的時間序列數(shù)據(jù)或者產(chǎn)生警報。
  • rule_files:規(guī)則的位置,prometheus 根據(jù)這個配置加載規(guī)則,用于生成新的時間序列數(shù)據(jù)或者報警信息,當(dāng)前我們沒有配置任何規(guī)則。
  • scrape_configs:配置監(jiān)控的資源。
    • job:prometheus 通過 HTTP 的方式采集 target 的指標(biāo)。target 需要為 prometheus 暴露 /metrics 接口。特殊地,prometheus 也暴露了對它本身的監(jiān)控接口。所以,在默認(rèn)的配置里有一個單獨的 job,叫做 prometheus,它通過 URL:http://localhost:9090/metrics 采集 prometheus 本身的時間序列數(shù)據(jù) (包含狀態(tài)和性能)。如果還有其他的資源需要監(jiān)控的話,直接配置在該模塊下面就可以了。

Deployment

接下來,我們準(zhǔn)備 Prometheus 的 Deployment 文件。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: observability
  labels:
    app: prometheus
spec:
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      serviceAccountName: prometheus
      containers:
        - image: prom/prometheus:v2.19.0
          name: prometheus
          command:
            - "/bin/prometheus"
          args:
            - "--config.file=/etc/prometheus/prometheus.yml"
            - "--storage.tsdb.path=/prometheus"
            - "--storage.tsdb.retention=24h"
            - "--web.enable-admin-api" # 控制對admin HTTP API的訪問,其中包括刪除時間序列等功能
            - "--web.enable-lifecycle" # 支持熱更新,直接執(zhí)行l(wèi)ocalhost:9090/-/reload立即生效
          ports:
            - containerPort: 9090
              protocol: TCP
              name: http
          volumeMounts:
            - mountPath: "/prometheus"
              subPath: prometheus
              name: data
            - mountPath: "/etc/prometheus"
              name: config-volume
          resources:
            requests:
              memory: "1Gi"
              cpu: "100m"
            limits:
              memory: "2Gi"
              cpu: "200m"
      securityContext:
        runAsUser: 0
      volumes:
        - name: data
          emptyDir: {}
        - configMap:
            name: prometheus-config
          name: config-volume

rbac

因為 prometheus 需要訪問 Kubernetes 的相關(guān)信息,所以還需要配置 rbac 認(rèn)證。

# rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: observability
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
  - apiGroups:
      - ""
    resources:
      - nodes
      - services
      - endpoints
      - pods
      - nodes/proxy
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - configmaps
      - nodes/metrics
    verbs:
      - get
  - nonResourceURLs:
      - /metrics
    verbs:
      - get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
  - kind: ServiceAccount
    name: prometheus
    namespace: observability

Service

為了訪問到 prometheus 服務(wù),我們還需要創(chuàng)建一個 Service。

注:為了方便測試,這里指定 type 為 NodePort。

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: observability
  labels:
    app: prometheus
spec:
  selector:
    app: prometheus
  type: NodePort
  ports:
    - name: web
      port: 9090
      targetPort: http

部署

# 創(chuàng)建 observability 命名空間,用于存放 Prometheus 的部署
$ kubectl create namespace observability
namespace/observability created

# 部署所有文件

$ kubectl apply -f prometheus.yaml
configmap/prometheus-config created

$ kubectl apply -f rbac.yaml
serviceaccount/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created

$ kubectl apply -f deployment.yaml
deployment.apps/prometheus created

$ kubectl apply -f service.yaml
service/prometheus created

webui

訪問

獲取訪問服務(wù)端口(31033)

$ kubectl get service -n observability
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
prometheus   NodePort   10.98.133.13   <none>        9090:31033/TCP   44s

然后通過 http://localhost:31033 即可訪問 Prometheus webui 服務(wù)。

image

查看 Targets

image

查看指標(biāo)

輸入并選擇 prometheus_http_requests_total

image

選擇 Graph,然后點擊 Execute 即可以圖形的形式查看指標(biāo) prometheus_http_requests_total 的具體數(shù)據(jù)。

image

prometheus_http_requests_total 這個指標(biāo)是怎么加入到 Prometheus 的呢?

原因是在配置文件中配置了 Prometheus 自身的監(jiān)控。而 Prometheus 自身在 9090 端口暴露了 /metrics 接口。所以,我們可以訪問 http://localhost:9090/metrics 查看具體的 metrics。因為,我們使用 NodePort 暴露服務(wù)。所以,訪問的地址變成 http://localhost:31033/metrics。

image

這里可以看到 Prometheus /metrics 接口中含有 prometheus_http_requests_total 指標(biāo),所以我們可以獲取得到該指標(biāo)的值。

小結(jié)

本篇為大家介紹了 Prometheus 的基本用法,讓大家對微服務(wù)監(jiān)控有一個大致的了解。下一篇開始,將為大家逐篇講解以下內(nèi)容:

注:本章內(nèi)容涉及的 yaml 文件可前往 https://github.com/MakeOptim/service-mesh/prometheus 獲取。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容