在 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 角色:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | - 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 角色挺重要:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | - 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 並採集監控資料了:
1 2 3 | annotations: prometheus.io/scrape: "true" prometheus.io/port: "<your app port>" |
其它詳細配置請看 這裡。
Kubernetes Deployment
最後,部署 Prometheus,需要注意的是,我們已經在 k8s 之外單獨部署了一套,為了統一處理,在這裡是打算作為中轉的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | 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 全部同步出來。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | - 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' |
相關文章
- K8s 部署 Prometheus + GrafanaK8SPrometheusGrafana
- 部署 Prometheus 和 Grafana 到 k8sPrometheusGrafanaK8S
- 在k8s中快速搭建基於Prometheus監控系統K8SPrometheus
- 在 K8S 中快速部署 Redis Cluster & RedisinsightK8SRedis
- helm 部署PrometheusPrometheus
- 部署prometheus、grafana、alertmanagerPrometheusGrafana
- 是時候扔掉Prometheus了,VictoriaMetrics全家桶入門與K8S部署PrometheusK8S
- 容器編排系統K8s之Prometheus監控系統+Grafana部署K8SPrometheusGrafana
- 如何使用 Helm 在 K8s 上整合 Prometheus 和 Grafana|Part 1K8SPrometheusGrafana
- 怎麼在k8s中部署nginx?K8SNginx
- [Hyperf] 在 Hyperf 框架中使用 prometheus + grafana 部署基本的監控框架PrometheusGrafana
- k8s中使用prometheus operator監控外部伺服器部署的windows exporterK8SPrometheus伺服器WindowsExport
- 在 K8s 中快速部署使用 GitLab 並構建 DevOps 專案K8SGitlabdev
- helm在k8s上部署Elasticsearch和KibanaK8SElasticsearch
- prometheus監控k8s叢集PrometheusK8S
- prometheus k8s服務發現PrometheusK8S
- Kubernetes+Prometheus+Grafana部署筆記PrometheusGrafana筆記
- docker部署監控Prometheus+GrafanaDockerPrometheusGrafana
- Docker環境部署Prometheus實踐DockerPrometheus
- Prometheus Operator(二) 監控k8s元件PrometheusK8S元件
- 1-Prometheus基本概念與部署Prometheus
- Prometheus從入門到精通:一、部署Prometheus
- K8S的Kafka監控(Prometheus+Grafana)K8SKafkaPrometheusGrafana
- 在k8s裡面部署自己的go web服務K8SGoWeb
- Prometheus監控系統入門與部署Prometheus
- 二進位制部署 Prometheus+Alertmanager+GrafanaPrometheusGrafana
- kubernetes1.15極速部署prometheus和grafanaPrometheusGrafana
- k8s dashboard部署K8S
- rancher部署k8sK8S
- 容器化 | 在 K8s 上部署 RadonDB MySQL Operator 和叢集K8SMySql
- 【MySQL】 在Docker中快速部署PXCMySqlDocker
- 【k8s】在AWS EKS部署並通過ALB訪問k8s Dashboard保姆級教程K8S
- 在K8S中,ingress 有何作用?K8S
- 在K8S中,CSI模型有哪些?K8S模型
- docker部署Prometheus+AlertManager實現郵件告警DockerPrometheus
- 容器雲平臺監控告警體系(三)—— 使用Prometheus Operator部署並管理Prometheus ServerPrometheusServer
- centos 7 部署k8sCentOSK8S
- k8s叢集部署K8S