{"id":10799,"date":"2022-05-31T18:08:14","date_gmt":"2022-05-31T12:38:14","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=10799"},"modified":"2026-02-18T15:16:19","modified_gmt":"2026-02-18T09:46:19","slug":"azure-ha-kubernetes-monitoring-using-prometheus-and-thanos","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2022\/05\/31\/azure-ha-kubernetes-monitoring-using-prometheus-and-thanos\/","title":{"rendered":"Azure HA Kubernetes Monitoring using Prometheus and&nbsp;Thanos"},"content":{"rendered":"\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1600\/0*327it1GmEmCRB6tA\" alt=\"\" \/><\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Introduction<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>Long since Prometheus took on the role of monitoring the systems, it has been the undisputed open-source leader for monitoring and alerting in Kubernetes systems, it has become a go-to solution. While Prometheus does some general instructions for achieving high availability but it has limitations when it comes to data retention, historical data retrieval, and multi-tenancy. This is where Thanos comes into play. In this blog post, we will discuss how to integrate Thanos with Prometheus in Kubernetes environments and why one should choose a particular approach. So let\u2019s get started.<\/p>\r\n\r\n\r\n\r\n<p><!--more--><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Why Thanos<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>The deployments in Prometheus are based on persistent volumes, which are scaled using federated set-ups. Federated methodologies are not applicable to all types of data. You will often need a different tool to manage Prometheus configurations. In this section, we will be using Thanos to handle these issues. Prometheus can be run on multiple instances in Thanos, data can be deduplicated, and data can be archived in long-term storage via GCS, Azure account storage, or S3.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Thanos Architecture<\/strong><\/h3>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/05\/838f5-1dt5mbbcr8tzqwfwdhasebg.png\" alt=\"\" width=\"600\" height=\"445\" \/>\r\n<figcaption>Thanos Architecture<\/figcaption>\r\n<\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Thanos Components<\/strong><\/h3>\r\n\r\n\r\n\r\n<ol>\r\n<li>Thanos Sidecar<\/li>\r\n<li>Thanos Store<\/li>\r\n<li>Thanos Query<\/li>\r\n<li>Thanos Compact<\/li>\r\n<li>Thanos Ruler<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Thanos Implementation<\/h3>\r\n\r\n\r\n\r\n<p>We\u2019ll need an Azure Storage Account, you can <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/storage\/common\/storage-account-create?tabs=azure-portal\" target=\"_blank\" rel=\"noreferrer noopener\">create one<\/a> using the Azure Portal or the Azure CLI. You will also need the <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/storage\/common\/storage-account-keys-manage?tabs=azure-portal\" target=\"_blank\" rel=\"noreferrer noopener\">storage account access key<\/a> which can also be retrieved using the Azure CLI.<\/p>\r\n\r\n\r\n\r\n<ol>\r\n<li>(a) Create a storage account.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">az storage account create --name &lt;name&gt; --resource-group &lt;resource-group&gt;<\/pre>\r\n\r\n\r\n\r\n<ol>\r\n<li>(b) Create a storage container called <code>metrics<\/code>.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">az storage container create \u2014 name metrics \u2014 account-name &lt;name&gt;<\/pre>\r\n\r\n\r\n\r\n<ol>\r\n<li>(c) Retrieve the storage account access key for later use.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">az storage account keys list --account-name &lt;name&gt; --resource-group &lt;resource-group&gt; -o tsv --query \"[0].value\"<\/pre>\r\n\r\n\r\n\r\n<p>2. Implementing Ingress Controller and Ingress objects (We will use Nginx Ingress Controller)<\/p>\r\n\r\n\r\n\r\n<p>3. Creating credentials to be used by Thanos components to access object store (in this case, Azure bucket)<\/p>\r\n\r\n\r\n\r\n<p>a. Create a Kubernetes secret using the credentials, as you can see in the following snippet:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl -n monitoring create secret generic thanos-objstore-config --from-file=thanos.yaml=thanos.yaml<\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Deployment<\/h3>\r\n\r\n\r\n\r\n<p>Create a monitoring namespace, service accounts, cluster role, and cluster role bindings for Prometheus using the following manifest.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/sa.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/sa.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating the Prometheus Configuration configmap<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>This configmap creates the Prometheus configuration file template that is read by the Thanos sidecar component. The template will also generate the actual configuration file. The file will be consumed by the Prometheus container running in the same pod. It is important to include the external_labels section in the configuration file so that the querier can use it to deduplicate data.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-configmap.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-configmap.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Prometheus Rules configmap<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>This will create alert rules that will be relayed to Alertmanager for delivery.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-rules.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-rules.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Prometheus Stateful\u00a0Set<\/strong><\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-deployment.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-deployment.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<p>It is important to understand the following about the above manifest:<\/p>\r\n\r\n\r\n\r\n<ol>\r\n<li>Prometheus is deployed as a stateful set with three replicas. Each replica provisions its own persistent volume dynamically.<\/li>\r\n<li>Prometheus configuration is generated by the Thanos Sidecar container using the template file created above.<\/li>\r\n<li>Thanos handles data compaction and therefore we need to set\u200a<strong>\u2014\u200astorage.tsdb.min-block-duration=2h<\/strong> and\u200a<strong>\u2014\u200astorage.tsdb.max-block-duration=2h<\/strong><\/li>\r\n<li>Prometheus stateful set is labeled as <strong>thanos-store-api: \u201ctrue\u201d<\/strong> so that each pod gets discovered by the headless service. This headless service will be used by <strong>Thanos Query<\/strong> to query data across all the Prometheus instances.<\/li>\r\n<li>We apply the same label to the <strong>Thanos Store<\/strong> and <strong>Thanos Ruler <\/strong>components so that they are also discovered by the querier and can be used for querying metrics.<\/li>\r\n<li>The Azure bucket credentials path is provided using the <strong>AZURE_APPLICATION_CREDENTIALS <\/strong>environment variable. The configuration file is mounted to that from the secret created as a part of the prerequisites.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Creating<strong> Prometheus Services<\/strong><\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-service.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/prometheus-service.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Thanos\u00a0Query<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>One of the key components of Thanos deployment<\/p>\r\n\r\n\r\n\r\n<ol>\r\n<li>The container argument\u200a\u2014\u200astore=dnssrv+thanos-store-gateway:10901 assists in discovering all the components from which metric data should be queried.<\/li>\r\n<li>Thanos-querier provides a web-based interface for running PromQL queries.. It also has the option to deduplicate data across various Prometheus clusters.<\/li>\r\n<li>Here we provide Grafana as a data source for all dashboards.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-querier.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-querier.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Thanos Store\u00a0Gateway<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>This will create the store component which serves metrics from the object storage to the querier.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-store-gateway.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-store-gateway.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Thanos\u00a0Compact<\/strong><\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-compact.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-compact.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Thanos\u00a0Ruler<\/strong><\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-ruler.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/thanos-ruler.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Alertmanager<\/strong><\/h3>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/alertmanger.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/alertmanger.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Kube state\u00a0Metrics<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>In order to relay some important container metrics, Kubestate metrics deployment is required. The metrics are not exposed natively by the kubelet and are not directly accessible via Prometheus.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/kube-state-metrics.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/kube-state-metrics.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating Node-exporter Daemon set<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>On each node, a node-exporter pod runs the daemon set. It exposes important metrics that can be retrieved by Prometheus instances.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/node-exporter.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/node-exporter.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Deploying Grafana<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>We will create our Grafana deployment and Service that will be exposed by means of our ingress object. We will add thanos-querier as the datasource for our Grafana deployment. In order to do so:<\/p>\r\n\r\n\r\n\r\n<ol>\r\n<li>Click on <strong>Add DataSource<\/strong><\/li>\r\n<li>Set <strong>Name: DS_PROMETHEUS<\/strong><\/li>\r\n<li>Set <strong>Type: Prometheus<\/strong><\/li>\r\n<li>Set <strong>URL: <\/strong><strong>http:\/\/thanos-querier:9090<\/strong><\/li>\r\n<li>Save and Test. You can now build your custom dashboards or simply import dashboards from grafana.net. Dashboards #315 and #1471 are very good places to start.<\/li>\r\n<\/ol>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">kubectl apply -f <a href=\"https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/grafana.yaml\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/raw.githubusercontent.com\/v5arcus\/azure-ha-prometheus-thanos\/main\/grafana.yaml<\/a><\/pre>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\"><strong>Creating the Ingress\u00a0Object<\/strong><\/h3>\r\n\r\n\r\n\r\n<p>Here is the final component of the journey. As a result, we will be able to access all of our services outside of the Kubernetes cluster.<\/p>\r\n\r\n\r\n\r\n<p>Your domain name should be changed to &lt;yourdomain&gt;.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">apiVersion: extensions\/v1beta1\r\nkind: Ingress\r\nmetadata:\r\n  name: monitoring-ingress\r\n  namespace: monitoring\r\n  annotations:\r\n    kubernetes.io\/ingress.class: \"nginx\"\r\nspec:\r\n  rules:\r\n  - host: grafana.&lt;yourdomain&gt;.com\r\n    http:\r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: grafana\r\n          servicePort: 3000\r\n  - host: prometheus-0.&lt;yourdomain&gt;.com\r\n    http:\r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: prometheus-0-service\r\n          servicePort: 8080\r\n  - host: prometheus-1.&lt;yourdomain&gt;.com\r\n    http:\r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: prometheus-1-service\r\n          servicePort: 8080\r\n  - host: prometheus-2.&lt;yourdomain&gt;.com\r\n    http:\r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: prometheus-2-service\r\n          servicePort: 8080\r\n  - host: alertmanager.&lt;yourdomain&gt;.com\r\n    http: \r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: alertmanager\r\n          servicePort: 9093\r\n  - host: thanos-querier.&lt;yourdomain&gt;.com\r\n    http:\r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: thanos-querier\r\n          servicePort: 9090\r\n  - host: thanos-ruler.&lt;yourdomain&gt;.com\r\n    http:\r\n      paths:\r\n      - path: \/\r\n        backend:\r\n          serviceName: thanos-ruler\r\n          servicePort: 9090<\/pre>\r\n\r\n\r\n\r\n<p>Access Thanos Querier at http:\/\/thanos-querier.&lt;yourdomain&gt;.com<\/p>\r\n\r\n\r\n\r\n<p>Make sure deduplication is selected.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/05\/a3be9-1uob289swvm7_yumfxxm2cg.png\" alt=\"\" width=\"800\" height=\"468\" \/><\/figure>\r\n\r\n\r\n\r\n<p>If you click on <strong>Stores<\/strong>, you will be able to see all the active endpoints discovered by <strong>thanos-store-gateway<\/strong>.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Grafana Dashboards<\/h3>\r\n\r\n\r\n\r\n<p>Thanos Querier is then added as the data source in Grafana, and you can start creating dashboards.<\/p>\r\n\r\n\r\n\r\n<p>Kubernetes Cluster Monitoring Dashboard:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/05\/0ab94-1xfmh2na0t5m8yefsksxwga.png\" alt=\"\" width=\"800\" height=\"730\" \/><\/figure>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2022\/05\/6921f-1iuny0-civn5q6j2bate_bw.png\" alt=\"\" width=\"800\" height=\"477\" \/><\/figure>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\r\n\r\n\r\n\r\n<p>So in this blog, we have seen the limitations of the Prometheus High availability and how we tried to come up with a solution to overcome those limitations by using Thanos.<\/p>\r\n\r\n\r\n\r\n<p>If you guys have any other ideas or suggestions around the approach, please comment in the comment section. Thanks for reading, I\u2019d really appreciate your suggestions and feedback.<\/p>\r\n\r\n\r\n\r\n<p>References:-\u00a0<br \/><a href=\"https:\/\/thanos.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/thanos.io\/<\/a><\/p>\r\n\r\n\r\n\r\n<p><br \/><strong style=\"font-weight: bold;\">Blog Pundit:<\/strong> <a href=\"https:\/\/opstree.com\/blog\/\/author\/naveenverma023\/\">\u00a0<strong>Naveen Verma<\/strong><\/a>, <strong>Sanjeev Pandey<\/strong> and <a href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Sandeep Rawat<\/strong><\/a><\/p>\r\n\r\n\r\n\r\n<p><strong><a href=\"https:\/\/www.opstree.com\/contact-us?utm_source=wordpress&amp;utm_campaign=Azure-HA-Kubernetes-Monitoring-using-Prometheus-and-Thanos&amp;utm_id=Blog\" target=\"_blank\" rel=\"noreferrer noopener\">Opstree<\/a><\/strong> is an End to End DevOps solution provider<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\r\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link\" href=\"https:\/\/www.opstree.com\/contact-us\" target=\"_blank\" rel=\"noreferrer noopener\">CONTACT US<\/a><\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<p class=\"has-text-align-center\"><strong>Connect Us <\/strong><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-social-links aligncenter is-content-justification-right is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\r\n\r\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\" target=\"_blank\" rel=\"noopener\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li><\/ul>\r\n","protected":false},"excerpt":{"rendered":"<p>Introduction Long since Prometheus took on the role of monitoring the systems, it has been the undisputed open-source leader for monitoring and alerting in Kubernetes systems, it has become a go-to solution. While Prometheus does some general instructions for achieving high availability but it has limitations when it comes to data retention, historical data retrieval, &hellip; <a href=\"https:\/\/opstree.com\/blog\/2022\/05\/31\/azure-ha-kubernetes-monitoring-using-prometheus-and-thanos\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Azure HA Kubernetes Monitoring using Prometheus and&nbsp;Thanos&#8221;<\/span><\/a><\/p>\n","protected":false},"author":159458069,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[335778,460,768739309,768739293,768739287,4996032],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-2Ob","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10799"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/159458069"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=10799"}],"version-history":[{"count":13,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10799\/revisions"}],"predecessor-version":[{"id":30835,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/10799\/revisions\/30835"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=10799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=10799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=10799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}