當前位置:網站首頁>Thanos Sidecar組件

Thanos Sidecar組件

2022-05-14 00:55:58富士康質檢員張全蛋

Sidecar 組件


首先將前面章節中的 Prometheus 相關的資源對象全部删除,然後我們需要在 Prometheus 中去自動發現集群的一些資源對象,所以依然需要對應的 RBAC 權限聲明:(rbac.yaml)

Prometheus需要去做自動發現,所以RBAC還是不可少的。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-mon
---
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:
      - "extensions"
    resources:
      - ingresses
    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: kube-mon

然後需要部署 Prometheus 的配置文件,下面的資源對象是創建 Prometheus 配置文件的模板(注意這裏只是一個模板),該模板將由 Thanos sidecar 組件進行讀取,最終會通過該模板生成實際的配置文件,在同一個 Pod 中的 Prometheus 容器將讀取最終的配置文件,在配置文件中添加 external_labels 標簽是非常重要的,以便讓 Queirer 可以基於這些標簽對數據進行去重處理(configmap.yaml)(和之前的Prometheus不同就是global裏面的external_labels,這個可以喂集群添加一個通用的標簽,這個可有可無。因為是HA,有兩個Prometheus server,那麼產生的指標得帶上是由哪個Prometheus產生的,即replica,那麼query組件在做查詢的時候就會對數據進行去重

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-mon
data:
  prometheus.yaml.tmpl: | # 注意這裏的名稱是 prometheus.yaml.tmpl
    global:
      scrape_interval: 15s
      scrape_timeout: 15s
      external_labels:
        cluster: ydzs-test
        replica: $(POD_NAME)  # 每個 Prometheus 有一個唯一的標簽

    rule_files:  # 報警規則文件配置
    - /etc/prometheus/rules/*rules.yaml

    alerting:
      alert_relabel_configs:  # 我們希望告警從不同的副本中也是去重的
      - regex: replica
        action: labeldrop
      alertmanagers:
      - scheme: http
        path_prefix: /
        static_configs:
        - targets: ['alertmanager:9093']

    scrape_configs:
    ......  # 其他抓取任務配置和前面章節中的配置保持一致即可

上面配置了報警規則文件,由於這裏配置文件太大了,所以為了更加清晰,我們將報警規則文件拆分到另外的 ConfigMap 對象中來,下面我們配置了兩個報警規則:(rules-configmap.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-rules
  namespace: kube-mon
data:
  alert-rules.yaml: |-
    groups:
      - name: Deployment
        rules:
        - alert: Deployment at 0 Replicas
          annotations:
            summary: Deployment {
   {$labels.deployment}} in {
   {$labels.exported_namespace}} is currently having no pods running
          expr: |
            sum(kube_deployment_status_replicas) by (deployment,exported_namespace)  < 1
          for: 1m
          labels:
            team: node
      - name: Pods
        rules:
        - alert: Container restarted
          annotations:
            summary: Container named {
   {$labels.container}} in {
   {$labels.pod}} in {
   {$labels.exported_namespace}} was restarted
          expr: |
            sum(increase(kube_pod_container_status_restarts_total[1m])) by (pod,exported_namespace,container) > 0
          for: 0m
          labels:
            team: node

Thanos 通過 Sidecar 和現有的 Prometheus 進行集成,將 Prometheus 的數據備份到對象存儲中,所以首先我們需要將 Prometheus 和 Sidecar 部署在同一個 Pod 中,另外 Prometheus 中一定要開啟下面兩個參數:

  • --web.enable-admin-api 允許 Thanos 的 Sidecar 從 Prometheus 獲取元數據。
  • --web.enable-lifecycle 允許 Thanos 的 Sidecar 重新加載 Promehtues 的配置和規則文件。(如果配置文件做了相應的更改,sidecar組件會自動的重新加載配置)

由於 Prometheus 默認每2h生成一個 TSDB 數據塊,所以仍然並不意味著 Prometheus 可以是完全無狀態的,因為如果它崩潰並重新啟動,我們將丟失〜2 個小時的指標,因此强烈建議依然對 Prometheus 做數據持久化,所以我們這裏使用了 StatefulSet 來管理這個應用,添加 volumeClaimTemplates 來聲明了數據持久化的 PVC 模板:(sidecar.yaml)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: prometheus
  namespace: kube-mon
  labels:
    app: prometheus
spec:
  serviceName: "prometheus"
  replicas: 2
  selector:
    matchLabels:
      app: prometheus
      thanos-store-api: "true"
  template:
    metadata:
      labels:
        app: prometheus
        thanos-store-api: "true"
    spec:
      serviceAccountName: prometheus
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
        - name: prometheus-rules
          configMap:
            name: prometheus-rules
        - name: prometheus-config-shared
          emptyDir: {}
      containers:
        - name: prometheus
          image: prom/prometheus:v2.14.0
          imagePullPolicy: IfNotPresent
          args:
            - "--config.file=/etc/prometheus-shared/prometheus.yaml"
            - "--storage.tsdb.path=/prometheus"
            - "--storage.tsdb.retention.time=6h"
            - "--storage.tsdb.no-lockfile"
            - "--storage.tsdb.min-block-duration=2h" # Thanos處理數據壓縮
            - "--storage.tsdb.max-block-duration=2h"
            - "--web.enable-admin-api" # 通過一些命令去管理數據
            - "--web.enable-lifecycle" # 支持熱更新  localhost:9090/-/reload 加載
          ports:
            - name: http
              containerPort: 9090
          resources:
            requests:
              memory: "2Gi"
              cpu: "1"
            limits:
              memory: "2Gi"
              cpu: "1"
          volumeMounts:
            - name: prometheus-config-shared
              mountPath: /etc/prometheus-shared/
            - name: prometheus-rules
              mountPath: /etc/prometheus/rules
            - name: data
              mountPath: "/prometheus"
        - name: thanos
          image: thanosio/thanos:v0.18.0
          imagePullPolicy: IfNotPresent
          args:
            - sidecar
            - --log.level=debug
            - --tsdb.path=/prometheus
            - --prometheus.url=http://localhost:9090
            - --reloader.config-file=/etc/prometheus/prometheus.yaml.tmpl
            - --reloader.config-envsubst-file=/etc/prometheus-shared/prometheus.yaml
            - --reloader.rule-dir=/etc/prometheus/rules/
          ports:
            - name: http-sidecar
              containerPort: 10902
            - name: grpc
              containerPort: 10901
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
          resources:
            requests:
              memory: "2Gi"
              cpu: "1"
            limits:
              memory: "2Gi"
              cpu: "1"
          volumeMounts:
            - name: prometheus-config-shared
              mountPath: /etc/prometheus-shared/
            - name: prometheus-config
              mountPath: /etc/prometheus
            - name: prometheus-rules
              mountPath: /etc/prometheus/rules
            - name: data
              mountPath: "/prometheus"
  volumeClaimTemplates: # 由於prometheus每2h生成一個TSDB數據塊,所以還是需要保存本地的數據
    - metadata:
        name: data
        labels:
          app: prometheus
      spec:
        storageClassName: openebs-jiva-default
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 2Gi

thanos-store-api: "true"  實現了store api這個接口了,這個是為了query對接pod提供數據用的。 

由於 Prometheus 和 Thanos 的 Sidecar 在同一個 Pod 中了,所以我們完全可以用 localhost 就可以訪問到了,然後將數據目錄做了聲明掛載,所以同樣可以在兩個容器中共享數據目錄了,一定要注意幾個配置文件的掛載方式。此外在上面的配置文件中我們通過 POD_NAME 這個環境變量作為 external 標簽附加到了 Prometheus 實例上,這裏我們通過 Downward API 去設置該環境變量。

由於現在使用的是 StatefulSet 控制器,所以需要創建一個 Headless Service,而且後面的 Thanos Query 還將使用該無頭服務來查詢所有 Prometheus 實例中的數據,當然我們也可以為每一個 Prometheus 實例去創建一個 Service 對象便於調試,當然這個不是必須的:(headless.yaml)

# 該服務為 querier 創建 srv 記錄,以便查找 store-api 的信息
apiVersion: v1
kind: Service
metadata:
  name: thanos-store-gateway
  namespace: kube-mon
spec:
  type: ClusterIP
  clusterIP: None
  ports:
    - name: grpc
      port: 10901
      targetPort: grpc
  selector:
    thanos-store-api: "true"

然後我們就可以使用上面的這些資源對象來創建帶有 Thanos Sidecar 容器的高可用 Prometheus 應用了:

$ kubectl apply -f rbac.yaml
$ kubectl apply -f configmap.yaml
$ kubectl apply -f rules-configmap.yaml
$ kubectl apply -f headless.yaml
$ kubectl apply -f sidecar.yaml
$ kubectl get pods -n kube-mon -l app=prometheus
NAME           READY   STATUS    RESTARTS   AGE
prometheus-0   2/2     Running   0          86s
prometheus-1   2/2     Running   0          74s

版權聲明
本文為[富士康質檢員張全蛋]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/134/202205140052018865.html

隨機推薦