在 k8s 中部署 Prometheus

自從 上次 介紹了 Prometheus 之后,就想到要在 k8s 中使用了,不過,在這之前,先介紹下 k8s 的監控。

k8s 的監控

k8s 默認以及推薦的監控體系是它自己的一套東西:Heapster + cAdvisor + Influxdb + Grafana,具體可以看 這里 。

包括 k8s 自身的 HPA (Horizontal Pod Autoscaler),默認從 Heapster 中獲取數據進行自動伸縮。(順便提一句,當你部署完 k8s 集群之后,如果從 Dashboard 中看不到監控數據,往往就是因為你沒有部署 Heapster,或者網絡層有問題, Dashboard 無法訪問 Heapster。)

那,這跟我們介紹的 Prometheus 有什么關系?

首先,它們都是一套監控解決方案,而 k8s 沒有把 Prometheus 作為默認監控,因此,如果你想直接使用 HPA,你還是需要部署 Heapster。

其次,kubelet 中的 cAdvisor 其實是支持 Prometheus 作為存儲的后端的,只是相對于 Prometheus 自己的 SD 解決方案來說,太弱了點。

最后,k8s 1.6 之后,在 annotations 中配置 custom metrics 的方式已經被移除了,而根據
Prometheus 的監控數據來進行自動伸縮還是很有可操作性的。

部署

其實部署很簡單,關鍵是配置,因此這里著重介紹下,如何配置。

Relabel

首先,先來了解下,什么是 relabel_config。

就如字面意思而言,它的作用是 Prometheus 抓取 metrics 之前,就將對象相關的 labels 重寫。下面是它幾個重要的 label:

  • __address__:默認為 host:port,也是之后抓取之后 instance 的值;
  • __scheme__:http or https ?;
  • __metrics_path__:就是 metrics path,默認為 /metrics;
  • __param_${name}:用來作為 URL parameter,比如 http://.../metrics?name=value;
  • __meta_:這個開頭的配置都是 SD 相關的配置;

Kubernetes SD

其次,上次提到,我們可以用到 Service Discovery 這個功能,其中就包含 Kubernetes SD。

它包含四種角色:

  • node
  • service
  • pod
  • endpoints

由于篇幅所限,這里只是簡單介紹下其中的 node 還有 pod 角色:

- job_name: 'kubernetes-nodes'
  scheme: https
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  
  kubernetes_sd_configs:
  - role: node
  
  relabel_configs:
    # 即從 __meta_kubernetes_node_label_<labelname> 這個配置中取出 labelname 以及 value
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
    
    # 配置 address 為 k8s api 的地址,相關的 ca 證書以及 token 在上面配置
  - target_label: __address__
    replacement: kubernetes.default.svc:443
    
    # 取出所有的 node,然后設置 /api/v1/nodes/<node_name>/proxy/metrics 為 metrics path
  - source_labels: 
    - __meta_kubernetes_node_name
    regex: (.+)
    target_label: __metrics_path__
    replacement: /api/v1/nodes/${1}/proxy/metrics

接下來的這個 pod 角色挺重要:

- job_name: 'kubernetes-pods'

  kubernetes_sd_configs:
  - role: pod

  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    action: keep
    regex: true
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
    action: replace
    target_label: __metrics_path__
    regex: (.+)
  - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    action: replace
    regex: ([^:]+)(?::\d+)?;(\d+)
    replacement: $1:$2
    target_label: __address__
  - action: labelmap
    regex: __meta_kubernetes_pod_label_(.+)
  - source_labels: [__meta_kubernetes_namespace]
    action: replace
    target_label: kubernetes_namespace
  - source_labels: [__meta_kubernetes_pod_name]
    action: replace
    target_label: kubernetes_pod_name

在定義了這個角色之后,你只要在你部署的應用 Pod 描述中,加入以下 annotations 就能讓 Prometheus 自動發現此 Pod 并采集監控數據了:

annotations:
  prometheus.io/scrape: "true"
  prometheus.io/port: "<your app port>"

其它詳細配置請看 這里。

Kubernetes Deployment

最后,部署 Prometheus,需要注意的是,我們已經在 k8s 之外單獨部署了一套,為了統一處理,在這里是打算作為中轉的。

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus
  namespace: kube-system
  labels:
    app: prometheus
data:
  prometheus.yml: |-
  # 省略,在這里定義你需要的配置
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: prometheus
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:latest
        args:
          - '-config.file=/prometheus-data/prometheus.yml'
          # 顯然,這里沒有用 `Stateful Sets`,存儲時間不用太長
          - '-storage.local.retention=48h0m0s'
        ports:
        - name: prometheus
          containerPort: 9090
        volumeMounts:
        - name: data-volume
          mountPath: /prometheus-data
      volumes:
      - name: data-volume
        configMap:
          name: prometheus
---
# 簡單處理,直接使用 NodePort 暴露服務,你也可以使用 Ingress
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: kube-system
spec:
  selector:
    app: prometheus
  ports:
  - name: prometheus
    protocol: TCP
    port: 9090
    nodePort: 30090
  type: NodePort

Prometheus Federate

而在我們外部單獨的 Prometheus 中,需要配置 Federate,將 k8s 中 Prometheus 采集的 metrics 全部同步出來。

  - job_name: 'federate'
    scrape_interval: 15s

    honor_labels: true
    metrics_path: '/federate'

    params:
      'match[]':
        - '{job=~".+"}' # 取 k8s 里面部署的  Prometheus 中所有的 job 數據

    static_configs:
      - targets:
        - '<k8s-node1>:30090'
        - '<k8s-node2>:30090'
        - '<k8s-node3>:30090'

原地址:https://xizhibei.github.io/2017/08/19/deploy-prometheus-in-k8s/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,835評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,676評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,730評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,118評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,873評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,266評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,330評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,482評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,036評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,846評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,025評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,575評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,279評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,684評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,953評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,751評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,016評論 2 375

推薦閱讀更多精彩內容