共計 5352 個字符,預計需要花費 14 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關使用 Prometheus 和 Thanos 怎樣進行高可用 K8S 監控,文章內容質量較高,因此丸趣 TV 小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
介 紹 Prometheus 高可用的必要性
在過去的幾年里,Kubernetes 的采用量增長了數倍。很明顯,Kubernetes 是容器編排的不二選擇。與此同時,Prometheus 也被認為是監控容器化和非容器化工作負載的絕佳選擇。監控是任何基礎設施的一個重要關注點,我們應該確保我們的監控設置具有高可用性和高可擴展性,以滿足不斷增長的基礎設施的需求,特別是在采用 Kubernetes 的情況下。
因此,今天我們將部署一個集群化的 Prometheus 設置,它不僅能夠彈性應對節點故障,還能保證合適的數據存檔,供以后參考。我們的設置還具有很強的可擴展性,以至于我們可以在同一個監控保護傘下跨越多個 Kubernetes 集群。
當前方案
大部分的 Prometheus 部署都是使用持久卷的 pod,而 Prometheus 則是使用聯邦機制進行擴展。但是并不是所有的數據都可以使用聯邦機制進行聚合,在這里,當你增加額外的服務器時,你往往需要一個機制來管理 Prometheus 配置。
解決方法
Thanos 旨在解決上述問題。在 Thanos 的幫助下,我們不僅可以對 Prometheus 的實例進行多重復制,并在它們之間進行數據去重,還可以將數據歸檔到 GCS 或 S3 等長期存儲中。
實施過程 Thanos 架構
圖片來源: https://thanos.io/quick-tutorial.md/
Thanos 由以下組件構成:
Thanos sidecar:這是運行在 Prometheus 上的主要組件。它讀取和歸檔對象存儲上的數據。此外,它還管理著 Prometheus 的配置和生命周期。為了區分每個 Prometheus 實例,sidecar 組件將外部標簽注入到 Prometheus 配置中。該組件能夠在 Prometheus 服務器的 PromQL 接口上運行查詢。Sidecar 組件還能監聽 Thanos gRPC 協議,并在 gRPC 和 REST 之間翻譯查詢。
Thanos 存儲:該組件在對象 storage bucket 中的歷史數據之上實現了 Store API,它主要作為 API 網關,因此不需要大量的本地磁盤空間。它在啟動時加入一個 Thanos 集群,并公布它可以訪問的數據。它在本地磁盤上保存了少量關于所有遠程區塊的信息,并使其與 bucket 保持同步。通常情況下,在重新啟動時可以安全地刪除此數據,但會增加啟動時間。
Thanos 查詢:查詢組件在 HTTP 上監聽并將查詢翻譯成 Thanos gRPC 格式。它從不同的源頭匯總查詢結果,并能從 Sidecar 和 Store 讀取數據。在 HA 設置中,它甚至會對查詢結果進行重復數據刪除。
HA 組的運行時重復數據刪除
Prometheus 是有狀態的,不允許復制其數據庫。這意味著通過運行多個 Prometheus 副本來提高高可用性并不易于使用。簡單的負載均衡是行不通的,比如在發生某些崩潰之后,一個副本可能會啟動,但是查詢這樣的副本會導致它在關閉期間出現一個小的缺口(gap)。你有第二個副本可能正在啟動,但它可能在另一個時刻(如滾動重啟)關閉,因此在這些副本上面的負載均衡將無法正常工作。
Thanos Querier 則從兩個副本中提取數據,并對這些信號進行重復數據刪除,從而為 Querier 使用者填補了缺口(gap)。
Thanos Compact 組件將 Prometheus 2.0 存儲引擎的壓實程序應用于對象存儲中的塊數據存儲。它通常不是語義上的并發安全,必須針對 bucket 進行單例部署。它還負責數據的下采樣——40 小時后執行 5m 下采樣,10 天后執行 1h 下采樣。
Thanos Ruler 基本上和 Prometheus 的規則具有相同作用,唯一區別是它可以與 Thanos 組件進行通信。
配 置前期準備
要完全理解這個教程,需要準備以下東西:
對 Kubernetes 和使用 kubectl 有一定的了解。
運行中的 Kubernetes 集群至少有 3 個節點(在本 demo 中,使用 GKE 集群)
實現 Ingress Controller 和 Ingress 對象(在本 demo 中使用 Nginx Ingress Controller)。雖然這不是強制性的,但為了減少創建外部端點的數量,強烈建議使用。
創建用于 Thanos 組件訪問對象存儲的憑證(在本例中為 GCS bucket)。
創建 2 個 GCS bucket,并將其命名為 Prometheus-long-term 和 thanos-ruler。
創建一個服務賬戶,角色為 Storage Object Admin。
下載密鑰文件作為 json 證書,并命名為 thanos-gcs-credentials.json。
使用憑證創建 Kubernetes sercret
kubectl create secret generic thanos-gcs-credentials –from-file=thanos-gcs-credentials.json
部署各類組件
部署 Prometheus 服務賬戶、Clusterroler 和 Clusterrolebinding
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
apiVersion: v1
kind: ServiceAccount
metadata:
name: monitoring
namespace: monitoring
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: monitoring
namespace: monitoring
rules:
- apiGroups: [ ]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: [get , list , watch]
- apiGroups: [ ]
resources:
- configmaps
verbs: [get]
- nonResourceURLs: [/metrics]
verbs: [get]
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: monitoring
subjects:
- kind: ServiceAccount
name: monitoring
namespace: monitoring
roleRef:
kind: ClusterRole
Name: monitoring
apiGroup: rbac.authorization.k8s.io
---
以上 manifest 創建了 Prometheus 所需的監控命名空間以及服務賬戶、clusterrole 以及 clusterrolebinding。
部署 Prometheues 配置 configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-server-conf
labels:
name: prometheus-server-conf
namespace: monitoring
data:
prometheus.yaml.tmpl: |-
global:
scrape_interval: 5s
evaluation_interval: 5s
external_labels:
cluster: prometheus-ha
# Each Prometheus has to have unique labels.
replica: $(POD_NAME)
rule_files:
- /etc/prometheus/rules/*rules.yaml
alerting:
# We want our alerts to be deduplicated
# from different replicas.
alert_relabel_configs:
- regex: replica
action: labeldrop
alertmanagers:
- scheme: http
path_prefix: /
static_configs:
- targets: [alertmanager:9093]
scrape_configs:
- job_name: kubernetes-nodes-cadvisor
scrape_interval: 10s
scrape_timeout: 10s
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:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# Only for Kubernetes ^1.7.3.
# See: https://github.com/prometheus/prometheus/issues/2916
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: ^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$
target_label: rkt_container_name
replacement: ${2}-${1}
- action: replace
source_labels: [id]
regex: ^/system\.slice/(.+)\.service$
target_label: systemd_service_name
replacement: ${1}
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
relabel_configs:
- 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
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2