<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    最牛逼的集群監控系統,它始終位列第一!

    VSole2022-07-14 17:19:11

    在本文中,我們將看到Prometheus監控技術棧的局限性,以及為什么移動到基于Thanos的技術棧可以提高指標留存率并降低總體基礎設施成本。

    用于此演示的內容可以在下面鏈接中獲取,并提交到他們各自的許可證。

    • https://github.com/particuleio/teks/tree/main/terragrunt/live/thanos
    • https://github.com/particuleio/terraform-kubernetes-addons/tree/main/modules/aws

    1.Kubernetes普羅米修斯技術棧

    在為我們的客戶部署Kubernetes基礎設施時,在每個集群上部署監控技術棧是標準做法。這個堆棧通常由幾個組件組成:

    • Prometheus: 收集度量標準
    • 告警管理器: 根據指標查詢向各種提供者發送警報
    • Grafana: 可視化豪華儀表板

    簡化架構如下:

    注意事項

    這種架構有一些注意事項,當你想從其中獲取指標的集群數量增加時,它的伸縮性以及可擴展性不太好。

    多個Grafana

    在這種設置中,每個集群都有自己的Grafana和自己的一組儀表板,維護起來很麻煩。

    存儲指標數據是昂貴的

    Prometheus將指標數據存儲在磁盤上,你必須在存儲空間和指標保留時間之間做出選擇。如果你想長時間存儲數據并在云提供商上運行,那么如果存儲TB的數據,塊存儲的成本可能會很高。

    同樣,在生產環境中,Prometheus經常使用復制或分片或兩者同時運行,這可能會使存儲需求增加兩倍甚至四倍。

    解決方案

    多個Grafana數據源

    可以在外部網絡上公開Prometheus的端點,并將它們作為數據源添加到單個Grafana中。你只需要在Prometheus外部端點上使用TLS或TLS和基本認證來實現安全性。此解決方案的缺點是不能基于不同的數據源進行計算。

    Prometheus聯邦

    Prometheus聯邦允許從Prometheus中抓取Prometheus,當你不抓取很多指標數據時,這個解決方案可以很好地工作。在規模上,如果你所有的Prometheus目標的抓取持續時間都比抓取間隔長,可能會遇到一些嚴重的問題。

    Prometheus遠程寫

    雖然遠程寫入是一種解決方案(也由Thanos receiver實現),但我們將不在本文中討論“推送指標”部分。建議在不信任多個集群或租戶的情況下(例如在將Prometheus構建為服務提供時),將指標作為最后的手段。無論如何,這可能是以后文章的主題,但我們將在這里集中討論抓取。

    2.Thanos

    Thanos是一個“開源的,高可用的Prometheus系統,具有長期存儲能力”。很多知名公司都在使用Thanos,也是CNCF孵化項目的一部分。

    Thanos的一個主要特點就是允許“無限”存儲空間。通過使用對象存儲(比如S3),幾乎每個云提供商都提供對象存儲。如果在前提環境下運行,對象存儲可以通過rook或minio這樣的解決方案提供。

    它是如何工作的?

    Thanos和Prometheus并肩作戰,從Prometheus開始升級到Thanos是很常見的。

    Thanos被分成幾個組件,每個組件都有一個目標(每個服務都應該這樣:)),組件之間通過gRPC進行通信。

    Thanos Sidecar

    Thanos和Prometheus一起運行(有一個邊車),每2小時向一個對象存儲庫輸出Prometheus指標。這使得Prometheus幾乎是無狀態的。

    Prometheus仍然在內存中保存著2個小時的度量值,所以在發生宕機的情況下,你可能仍然會丟失2個小時的度量值(這個問題應該由你的Prometheus設置來處理,使用HA/分片,而不是Thanos)。

    Thanos sidecar與Prometheus運營者和Kube Prometheus棧一起,可以輕松部署。這個組件充當Thanos查詢的存儲。

    Thanos存儲

    Thanos存儲充當一個網關,將查詢轉換為遠程對象存儲。它還可以在本地存儲上緩存一些信息。基本上,這個組件允許你查詢對象存儲以獲取指標。這個組件充當Thanos查詢的存儲。

    Thanos Compactor

    Thanos Compactor是一個單例(它是不可擴展的),它負責壓縮和降低存儲在對象存儲中的指標。下采樣是隨著時間的推移對指標粒度的寬松。例如,你可能想將你的指標保持2年或3年,但你不需要像昨天的指標那么多數據點。這就是壓縮器的作用,它可以在對象存儲上節省字節,從而節省成本。

    Thanos Query

    Thanos查詢是Thanos的主要組件,它是向其發送PromQL查詢的中心點。Thanos查詢暴露了一個與Prometheus兼容的端點。然后它將查詢分派給所有的“stores”。記住,Store可能是任何其他提供指標的Thanos組件。

    Thanos查詢可以發送查詢到另一個Thanos查詢(他們可以堆疊)。

    • Thanos Store
    • Thanos Sidecar
    • Thanos Query

    還負責對來自不同Store或Prometheus的相同指標進行重復數據刪除。例如,如果你有一個度量值在Prometheus中,同時也在對象存儲中,Thanos Query可以對該指標值進行重復數據刪除。在Prometheus HA設置的情況下,重復數據刪除也基于Prometheus副本和分片。

    Thanos Query Frontend

    正如它的名字所暗示的,Thanos查詢前端是Thanos查詢的前端,它的目標是將大型查詢拆分為多個較小的查詢,并緩存查詢結果(在內存或memcached中)。

    還有其他組件,比如在遠程寫的情況下接收Thanos,但這仍然不是本文的主題。

    3.多集群架構

    有多種方法可以將這些組件部署到多個Kubernetes集群中,根據用例的不同,有些方法比其他方法更好,在這里我們不能給出詳細的介紹。

    我們的例子是在AWS上運行,使用tEKS部署了2個集群,我們的all in one解決方案將生產就緒的EKS集群部署在AWS上:

    • 一個觀察者集群
    • 一個被觀察集群

    我們的部署使用了官方的kube-prometheus-stackbitnami thanos圖表。

    一切都是在我們的terraform-kubernetes-addons存儲庫中策劃的。

    Thanos demo文件夾中的目錄結構如下:

    ├── ? env_tags.yaml  
    ├── ? eu-west-1  
    │ ├── ? clusters  
    │ │ └── ? observer  
    │ │ ├── ? eks  
    │ │ │ ├── ? kubeconfig  
    │ │ │ └── ? terragrunt.hcl  
    │ │ ├── ? eks-addons  
    │ │ │ └── ? terragrunt.hcl  
    │ │ └── ? vpc  
    │ │ └── ? terragrunt.hcl  
    │ └── ? region_values.yaml  
    └── ? eu-west-3  
       ├── ? clusters  
       │ └── ? observee  
       │ ├── ? cluster_values.yaml  
       │ ├── ? eks  
       │ │ ├── ? kubeconfig  
       │ │ └── ? terragrunt.hcl  
       │ ├── ? eks-addons  
       │ │ └── ? terragrunt.hcl  
       │ └── ? vpc  
       │ └── ? terragrunt.hcl  
       └── ? region_values.yaml
    

    這允許DRY(Don 't Repeat Yourself)基礎設施,并可以輕松地擴展AWS帳戶、區域和集群的數量。

    觀察者集群

    觀察者集群是我們的主集群,我們將從它查詢其他集群:

    Prometheus正在運行:

    • Grafana啟用
    • Thanos邊車上傳到特定的桶
    kube-prometheus-stack = {  
      enabled = true  
      allowed_cidrs = dependency.vpc.outputs.private_subnets_cidr_blocks  
      thanos_sidecar_enabled = true  
      thanos_bucket_force_destroy = true  
      extra_values = <<-EXTRA_VALUES  
        grafana:  
          deploymentStrategy:  
            type: Recreate  
          ingress:  
            enabled: true  
            annotations:  
              kubernetes.io/ingress.class: nginx  
              cert-manager.io/cluster-issuer: "letsencrypt"  
            hosts:  
              - grafana.${local.default_domain_suffix}  
            tls:  
              - secretName: grafana.${local.default_domain_suffix}  
                hosts:  
                  - grafana.${local.default_domain_suffix}  
          persistence:  
            enabled: true  
            storageClassName: ebs-sc  
            accessModes:  
              - ReadWriteOnce  
            size: 1Gi  
        prometheus:  
          prometheusSpec:  
            replicas: 1  
            retention: 2d  
            retentionSize: "10GB"  
            ruleSelectorNilUsesHelmValues: false  
            serviceMonitorSelectorNilUsesHelmValues: false  
            podMonitorSelectorNilUsesHelmValues: false  
            storageSpec:  
              volumeClaimTemplate:  
                spec:  
                  storageClassName: ebs-sc  
                  accessModes: ["ReadWriteOnce"]  
                  resources:  
                    requests:  
                      storage: 10Gi  
        EXTRA_VALUES
    

    為觀察者集群生成一個CA證書:

    • 這個CA將被進入sidecar的被觀察集群所信任
    • Thanos querier組件生成TLS證書,這些組件將查詢被觀察集群

    Thanos組件部署:

    • Thanos組件全部部署完成
    • 查詢前端,作為Grafana的數據源端點
    • 存儲網關用于查詢觀察者桶
    • Query將對存儲網關和其他查詢器執行查詢

    部署的額外Thanos組件:

    • 配置了TLS的Thanos查詢器對每個被觀察集群進行查詢
    thanos-tls-querier = {  
      "observee" = {  
        enabled = true  
        default_global_requests = true  
        default_global_limits = false  
        stores = [  
          "thanos-sidecar.${local.default_domain_suffix}:443"  
        ]  
      }  
    }  
      
    thanos-storegateway = {  
      "observee" = {  
        enabled = true  
        default_global_requests = true  
        default_global_limits = false  
        bucket = "thanos-store-pio-thanos-observee"  
        region = "eu-west-3"  
      }
    

    被觀測集群

    被觀測集群是Kubernetes集群,具有最小的Prometheus/Thanos安裝,將被觀測集群查詢。

    Prometheus operator正在運行:

    • Thanos這邊就是上傳給觀察者特定的桶
    • Thanos邊車與TLS客戶端認證的入口對象一起發布,并信任觀察者集群CA
    kube-prometheus-stack = {  
      enabled = true  
      allowed_cidrs = dependency.vpc.outputs.private_subnets_cidr_blocks  
      thanos_sidecar_enabled = true  
      thanos_bucket_force_destroy = true  
      extra_values = <<-EXTRA_VALUES  
        grafana:  
          enabled: false  
        prometheus:  
          thanosIngress:  
            enabled: true  
            ingressClassName: nginx  
            annotations:  
              cert-manager.io/cluster-issuer: "letsencrypt"  
              nginx.ingress.kubernetes.io/ssl-redirect: "true"  
              nginx.ingress.kubernetes.io/backend-protocol: "GRPC"  
              nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"  
              nginx.ingress.kubernetes.io/auth-tls-secret: "monitoring/thanos-ca"  
            hosts:  
            - thanos-sidecar.${local.default_domain_suffix}  
            paths:  
            - /  
            tls:  
            - secretName: thanos-sidecar.${local.default_domain_suffix}  
              hosts:  
              - thanos-sidecar.${local.default_domain_suffix}  
          prometheusSpec:  
            replicas: 1  
            retention: 2d  
            retentionSize: "6GB"  
            ruleSelectorNilUsesHelmValues: false  
            serviceMonitorSelectorNilUsesHelmValues: false  
            podMonitorSelectorNilUsesHelmValues: false  
            storageSpec:  
              volumeClaimTemplate:  
                spec:  
                  storageClassName: ebs-sc  
                  accessModes: ["ReadWriteOnce"]  
                  resources:  
                    requests:  
                      storage: 10Gi  
        EXTRA_VALUES
    

    Thanos組件部署:

    • Thanos壓縮器來管理這個特定集群的下采樣
    thanos = {  
      enabled = true  
      bucket_force_destroy = true  
      trusted_ca_content = dependency.thanos-ca.outputs.thanos_ca  
      extra_values = <<-EXTRA_VALUES  
        compactor:  
          retentionResolution5m: 90d  
        query:  
          enabled: false  
        queryFrontend:  
          enabled: false  
        storegateway:  
          enabled: false  
        EXTRA_VALUES  
    }
    

    4.再深入一點

    讓我們檢查一下集群上正在運行什么。

    關于觀察員,我們有:

    kubectl -n monitoring get pods  
    NAME READY STATUS RESTARTS AGE  
    alertmanager-kube-prometheus-stack-alertmanager-0           2/2     Running 0          120m  
    kube-prometheus-stack-grafana-c8768466b-rd8wm 2/2     Running 0          120m  
    kube-prometheus-stack-kube-state-metrics-5cf575d8f8-x59rd 1/1     Running 0          120m  
    kube-prometheus-stack-operator-6856b9bb58-hdrb2 1/1     Running 0          119m  
    kube-prometheus-stack-prometheus-node-exporter-8hvmv 1/1     Running 0          117m  
    kube-prometheus-stack-prometheus-node-exporter-cwlfd 1/1     Running 0          120m  
    kube-prometheus-stack-prometheus-node-exporter-rsss5 1/1     Running 0          120m  
    kube-prometheus-stack-prometheus-node-exporter-rzgr9 1/1     Running 0          120m  
    prometheus-kube-prometheus-stack-prometheus-0               3/3     Running 1          120m  
    thanos-compactor-74784bd59d-vmvps 1/1     Running 0          119m  
    thanos-query-7c74db546c-d7bp8 1/1     Running 0          12m  
    thanos-query-7c74db546c-ndnx2 1/1     Running 0          12m  
    thanos-query-frontend-5cbcb65b57-5sx8z 1/1     Running 0          119m  
    thanos-query-frontend-5cbcb65b57-qjhxg 1/1     Running 0          119m  
    thanos-storegateway-0                                       1/1     Running 0          119m  
    thanos-storegateway-1                                       1/1     Running 0          118m  
    thanos-storegateway-observee-storegateway-0                 1/1     Running 0          12m  
    thanos-storegateway-observee-storegateway-1                 1/1     Running 0          11m  
    thanos-tls-querier-observee-query-dfb9f79f9-4str8 1/1     Running 0          29m  
    thanos-tls-querier-observee-query-dfb9f79f9-xsq24 1/1     Running 0          29m  
      
    kubectl -n monitoring get ingress  
    NAME CLASS HOSTS ADDRESS PORTS AGE  
    kube-prometheus-stack-grafana  grafana.thanos.teks-tg.clusterfrak-dynamics.io k8s-ingressn-ingressn-afa0a48374-f507283b6cd101c5.elb.eu-west-1.amazonaws.com 80, 443   123m
    

    被觀察者:

    kubectl -n monitoring get pods  
    NAME READY STATUS RESTARTS AGE  
    alertmanager-kube-prometheus-stack-alertmanager-0           2/2     Running 0          39m  
    kube-prometheus-stack-kube-state-metrics-5cf575d8f8-ct292 1/1     Running 0          39m  
    kube-prometheus-stack-operator-6856b9bb58-4cngc 1/1     Running 0          39m  
    kube-prometheus-stack-prometheus-node-exporter-bs4wp 1/1     Running 0          39m  
    kube-prometheus-stack-prometheus-node-exporter-c57ss 1/1     Running 0          39m  
    kube-prometheus-stack-prometheus-node-exporter-cp5ch 1/1     Running 0          39m  
    kube-prometheus-stack-prometheus-node-exporter-tnqvq 1/1     Running 0          39m  
    kube-prometheus-stack-prometheus-node-exporter-z2p49 1/1     Running 0          39m  
    kube-prometheus-stack-prometheus-node-exporter-zzqp7 1/1     Running 0          39m  
    prometheus-kube-prometheus-stack-prometheus-0               3/3     Running 1          39m  
    thanos-compactor-7576dcbcfc-6pd4v 1/1     Running 0          38m  
      
    kubectl -n monitoring get ingress  
    NAME CLASS HOSTS ADDRESS PORTS AGE  
    kube-prometheus-stack-thanos-gateway nginx thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io k8s-ingressn-ingressn-95903f6102-d2ce9013ac068b9e.elb.eu-west-3.amazonaws.com 80, 443   40m
    

    我們的TLS查詢器應該能夠查詢被觀測集群的度量標準。

    讓我們來看看它們的行為:

    k -n monitoring logs -f thanos-tls-querier-observee-query-687dd88ff5-nzpdh  
      
    level=info ts=2021-02-23T15:37:35.692346206Z caller=storeset.go:387 component=storeset msg="adding new storeAPI to query storeset" address=thanos-sidecar.thanos.teks-tg.clusterfrak-dynamics.io:443 extLset="{cluster=\"pio-thanos-observee\", prometheus=\"monitoring/kube-prometheus-stack-prometheus\", prometheus_replica=\"prometheus-kube-prometheus-stack-prometheus-0\"}"
    

    所以這個查詢器pods可以查詢我的其他集群,如果我們檢查Web,我們可以看到存儲:

    kubectl -n monitoring port-forward thanos-tls-querier-observee-query-687dd88ff5-nzpdh 10902
    

    太棒了,但是我只有一個存儲,還記得我們說過查詢器可以堆疊在一起嗎?在我們的觀察者集群中,我們有標準的http查詢器,它可以查詢架構圖中的其他組件。

    kubectl -n monitoring port-forward thanos-query-7c74db546c-d7bp8 10902
    

    這里我們可以看到所有的存儲已經被添加到我們的中心查詢器:

    • 觀察者把本地Thanos聚集
    • 我們的存儲網關(一個用于遠程觀測者集群,一個用于本地觀測者集群)
    • 本地TLS查詢器,它可以查詢被觀察的sidecar

    5.在Grafana可視化

    最后,我們可以前往Grafana,看看默認的Kubernetes儀表板是如何與多集群兼容的。

    6.總結

    Thanos是一個非常復雜的系統,有很多移動部件,我們沒有深入研究具體的自定義配置,因為它會花費太多的時間。

    我們在tEKS存儲庫中提供了一個相當完整的AWS實現,它抽象了很多復雜性(主要是mTLS部分),并允許進行很多定制。你也可以使用terraform-kubernetes-addons模塊作為獨立的組件。我們計劃在未來支持其他云提供商。不要猶豫,通過Github上的任何一個項目的問題聯系我們。

    根據你的基礎設施和需求,有許多可能適合你的Thanos實現。

    如果你想深入研究Thanos,可以查看他們的官方kube-thanos存儲庫,以及他們關于跨集群通信的建議。

    grafanaprometheus
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    在一個成千上萬的服務和應用程序部署在多個基礎設施中的世界,在高可用性環境中進行監控已成為每個開發過程的重要組成部分。每個 Prometheus pods 在專用PVC中保存最后幾個小時,在規定的保留時間后,數據通過 Thanos sidecar 發送到S3桶。第一階段在這里,我們關注如何在我們要監控的每個集群中部署和配置 Prometheus 以及 Thanos sidecar。
    最牛逼的集群監控系統,它始終位列第一!
    監控系統的建設思路
    2022-07-31 09:37:50
    USE 法把系統資源的性能指標,簡化成了三個類別,即使用率、飽和度以及錯誤數。使用率,表示資源用于服務的時間或容量百分比。飽和度,表示資源的繁忙程度,通常與等待隊列的長度相關。100% 的飽和度,表示資源無法接受更多的請求。錯誤數表示發生錯誤的事件個數。錯誤數越多,表明系統的問題越嚴重。所以,AlertManager 還支持通過分組、抑制或者靜默等多種方式來聚合同類告警,并減少告警數量。
    Grafana中存在一個權限提升漏洞。漏洞編號: CVE-2022-24812,漏洞威脅等級:高危,漏洞評分:8.0。
    Grafana 存在授權問題漏洞(CVE-2021-39226)
    例如,采集數據、分析顯示、報警、簡單故障自動處理等。Cacti通過snmpget檢索數據并使用RRDtool進行繪圖,但用戶不需要知道RRDtool的復雜參數。NagiosNagios是一個企業級監控系統,可以監控服務運行狀態和網絡信息,監控指定的本地或遠程主機參數和服務,并提供異常告警通知功能。
    維護網站正常運行是系統管理員最基本的任務之一,所以對系統進行監視,并保持網絡的最佳運行狀態至關重要。這聽起來很復雜,但是 Cacti 有模板來幫助加速這個過程。支持定制是 Nagios Core 變得如此流行的主要原因之一。與其他開源監控工具相比,Zabbix 提供了很高的便利性。時間序列數據存儲在本地磁盤上,以便在緊急情況下輕松訪問。Prometheus 的 Alertmanager 負責消息通知,Alertmanager 可以通過電子郵件,PagerDuty 或 OpsGenie 發送通知,如有必要,你也可以關閉警報通知。
    目前,研究機構Gartner已將應用可觀測性列為“2023年十大戰略技術趨勢”之一。安全研究人員表示,成功實現可觀測性的企業機構,會在數字化業務開展中建立競爭優勢,企業需要找到合適的工具并盡快部署使用。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类