<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          它就是最牛逼的集群監(jiān)控系統(tǒng)!

          共 26560字,需瀏覽 54分鐘

           ·

          2022-06-24 12:28

          不點藍(lán)字關(guān)注,我們哪來故事?


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

          Kubernetes普羅米修斯技術(shù)棧

          在為我們的客戶部署Kubernetes基礎(chǔ)設(shè)施時,在每個集群上部署監(jiān)控技術(shù)棧是標(biāo)準(zhǔn)做法。這個堆棧通常由幾個組件組成:

          • Prometheus:收集度量標(biāo)準(zhǔn)
          • 告警管理器:根據(jù)指標(biāo)查詢向各種提供者發(fā)送警報
          • Grafana:可視化豪華儀表板

          注意事項

          這種架構(gòu)有一些注意事項,當(dāng)你想從其中獲取指標(biāo)的集群數(shù)量增加時,它的伸縮性以及可擴(kuò)展性不太好。

          多個Grafana

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

          存儲指標(biāo)數(shù)據(jù)是昂貴的

          Prometheus將指標(biāo)數(shù)據(jù)存儲在磁盤上,你必須在存儲空間和指標(biāo)保留時間之間做出選擇。如果你想長時間存儲數(shù)據(jù)并在云提供商上運行,那么如果存儲TB的數(shù)據(jù),塊存儲的成本可能會很高。同樣,在生產(chǎn)環(huán)境中,Prometheus經(jīng)常使用復(fù)制或分片或兩者同時運行,這可能會使存儲需求增加兩倍甚至四倍。

          解決方案

          多個Grafana數(shù)據(jù)源

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

          Prometheus聯(lián)邦

          Prometheus聯(lián)邦允許從Prometheus中抓取Prometheus,當(dāng)你不抓取很多指標(biāo)數(shù)據(jù)時,這個解決方案可以很好地工作。在規(guī)模上,如果你所有的Prometheus目標(biāo)的抓取持續(xù)時間都比抓取間隔長,可能會遇到一些嚴(yán)重的問題。

          Prometheus遠(yuǎn)程寫

          雖然遠(yuǎn)程寫入是一種解決方案(也由Thanos receiver實現(xiàn)),但我們將不在本文中討論“推送指標(biāo)”部分。你可以在這里[1]閱讀關(guān)于推送指標(biāo)的利弊。建議在不信任多個集群或租戶的情況下(例如在將Prometheus構(gòu)建為服務(wù)提供時),將指標(biāo)作為最后的手段。無論如何,這可能是以后文章的主題,但我們將在這里集中討論抓取。

          Thanos,它來了

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

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

          它是如何工作的?

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

          Thanos被分成幾個組件,每個組件都有一個目標(biāo)(每個服務(wù)都應(yīng)該這樣:)),組件之間通過gRPC進(jìn)行通信。

          Thanos Sidecar

          Thanos和Prometheus一起運行(有一個邊車),每2小時向一個對象存儲庫輸出Prometheus指標(biāo)。這使得Prometheus幾乎是無狀態(tài)的。Prometheus仍然在內(nèi)存中保存著2個小時的度量值,所以在發(fā)生宕機(jī)的情況下,你可能仍然會丟失2個小時的度量值(這個問題應(yīng)該由你的Prometheus設(shè)置來處理,使用HA/分片,而不是Thanos)。

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

          Thanos存儲

          Thanos存儲充當(dāng)一個網(wǎng)關(guān),將查詢轉(zhuǎn)換為遠(yuǎn)程對象存儲。它還可以在本地存儲上緩存一些信息。基本上,這個組件允許你查詢對象存儲以獲取指標(biāo)。這個組件充當(dāng)Thanos查詢的存儲。

          Thanos Compactor

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

          Thanos Query

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

          • Thanos Store
          • Thanos Sidecar
          • Thanos Query

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

          Thanos Query Frontend

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

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

          多集群架構(gòu)

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

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

          • 一個觀察者集群[3]
          • 一個被觀察集群[4]

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

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

          Thanos demo文件夾中的目錄結(jié)構(gòu)如下:

          .
          ├── ? 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)基礎(chǔ)設(shè)施,并可以輕松地擴(kuò)展AWS帳戶、區(qū)域和集群的數(shù)量。

          觀察者集群

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

          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將被進(jìn)入sidecar的被觀察集群所信任
          • 為Thanos querier組件生成TLS證書,這些組件將查詢被觀察集群

          Thanos組件部署:

          • Thanos組件全部部署完成
          • 查詢前端,作為Grafana的數(shù)據(jù)源端點
          • 存儲網(wǎng)關(guān)用于查詢觀察者桶
          • Query將對存儲網(wǎng)關(guān)和其他查詢器執(zhí)行查詢

          部署的額外Thanos組件:

          • 配置了TLS的Thanos查詢器對每個被觀察集群進(jìn)行查詢
          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客戶端認(rèn)證的入口對象一起發(fā)布,并信任觀察者集群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
          }

          再深入一點

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

          關(guān)于觀察員,我們有:

          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   <none>   grafana.thanos.teks-tg.clusterfrak-dynamics.io   k8s-ingressn-ingressn-afa0a48374-f507283b6cd101c5.elb.eu-west-1.amazonaws.com   80443   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   80443   40m

          我們的TLS查詢器應(yīng)該能夠查詢被觀測集群的度量標(biāo)準(zhǔn)。

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

          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

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

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

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

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

          在Grafana可視化

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

          總結(jié)

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

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

          根據(jù)你的基礎(chǔ)設(shè)施和需求,有許多可能適合你的Thanos實現(xiàn)。

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

          ////// END //////
          ↓ 點擊下方關(guān)注,看更多架構(gòu)分享 ↓
          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天日麻批 | 精品久久噜噜午夜论理电影 | 欧美成人乱码视频 | 无码肏逼 | 蜜桃秘 av无码一区二区三区 |