Kubernetes ပေါ်က Prometheus

Prometheus ကို Server ရော Alert Manager ပါရှေ့မှာကြည့်ခဲ့ပြီးပြီမို့ ဒီတပိုင်းမှာတော့ Kubernetes ပေါ်ဘယ်လိုတင်မလဲသိဖို့ လုပ်ကြပါမယ်။ Prometheus က Kubernetes Application မဟုတ်ပေမယ့် Kubernetes ပေါ်မှာ install နိုင်ဖို့အတွက် ထုတ်ထားပေးတဲ့ image တွေ chart တွေအသင့်ရှိတယ်။ အဲဒီအပြင် Prometheus ရဲ့ configuration တို့၊ Alert Manager ရဲ့ configuration တို့ကိုလည်း Kubernetes CRD သုံးပြီးလုပ်လို့ရအောင် controller နဲ့တကွ အသင့်ပြင်ထားပေးတဲ့ project တွေလည်း ရှိတာမို့ Prometheus ကို Kubernetes ပေါ်တင်ဖို့ အတော်လေး ရိုးရှင်းသွားစေတယ်။

Prometheus အတွက် Helm Chart တွေအများကြီး ထွက်ထားပေမယ့် ကျွန်တော်တို့ kube-prometheus-stack ဆိုတဲ့ဟာကို သုံးကြပါမယ်။ ထုံးစံအတိုင်း ကျွန်တော်တို့ IaC သုံးပြီး Terraform နဲ့ install လုပ်ကြမယ်။

providers.tf

terraform {
    required_providers {
        helm = {
            source  = "hashicorp/helm"
            version = "~> 3.0.2"
        }
        kubectl = {
            source = "gavinbunney/kubectl"
        }
    }
}
    
provider "helm" {
    kubernetes = {
        config_path = "~/.kube/config"
    }
}

provider "kubectl" {
    config_path       = "~/.kube/config"
    apply_retry_count = 5
}

variables.tf

variable "chart_version" {
    description = "The version of kube-prometheus-stack chart to install"
    default     = "v76.3.0"
}

main.tf

locals {
    monitoring_ns = "monitoring"
}

prometheus.tf

resource "helm_release" "prometheus" {
    name             = "prometheus"
    namespace        = local.monitoring_ns
    repository       = "https://prometheus-community.github.io/helm-charts"
    chart            = "kube-prometheus-stack"
    version          = var.chart_version
    create_namespace = true
    
    set = [
        {
            name  = "prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues"
            value = "false"
        }
    ]
      
    values = [
      <<-EOF
        grafana:
          enabled: false
        alertmanager:
          enabled: true
        kubeStateMetrics:
          enabled: true
        nodeExporter:
          enabled: true     
      EOF
    ]
}

terraform.tfvars

chart_version = "v76.3.0"

ဘာတွေ install လိုက်လဲ ကြည့်ရအောင်။

kubectl get deploy -n monitoring

kubectl get sts -n monitoring

kubectl get ds -n monitoring

လို့ရှာကြည့်ရင် Prometheus CRD တွေကို manage လုပ်မယ့် Kube Prometheus Operator ရယ်၊ Kubernetes Cluster ထဲက metrics တွေကို proxy လုပ်ပေးမယ့် Kube State Metrics ရယ်ကို deployment အဖြစ် မြင်ရပါမယ်။ Prometheus Server နဲ့ Alert Manager တွေကိုတော့ StatefulSet အဖြစ် မြင်ရမယ်။ Linux Host တွေဆီက metrics တွေကို proxy မယ့် Node Exporter ကိုတော့ DaemonSet အနေနဲ့ မြင်ရမှာပါ။ အပေါ်က Terraform code ထဲမှာ Grafana install မလုပ်ဖို့ explicit configuration လုပ်ခဲ့တာရယ်၊ နောက် Push Gateway နဲ့ Thanos စတဲ့ component တွေကို default install မလုပ်ဖို့ implicit configuration ပါတာရယ်ကြောင့် အဲဒါတွေကိုလည်း မြင်ရမှာ မဟုတ်ပါဘူး။

အဓိကက Cluster Metrics တွေဖြစ်တဲ့ Pod တွေ crash နေသလား။ Pod ဘယ်နှလုံး Pending ဖြစ်နေလဲ။ Kubelet ကျနေလား စသဖြင့် သိနိုင်ဖို့ဆိုရင် Kube State Metrics ကိုမဖြစ်မနေ install လုပ်ဖို့ လိုပါတယ်။ API Server ကလည်း /metrics မှာ Prometheus format နဲ့ metrics တွေ instrument လုပ်ပြီးသားဆိုပေမယ့် အဲဒါတွေက API Server ဘယ်လောက် healthy ဖြစ်သလဲဆိုတာကို သိရဖို့အတွက်သက်သက်ပါ။ Kube State Metrics ကမှ kubernetes client ကိုသုံးပြီး API Server ကတဆင့် လိုအပ်တဲ့ stats တွေကို query ဆွဲတယ်။ ပြီးမှ အရေးကြီးတဲ့ metrics တွေကို Prometheus format နဲ့ပြန်ပြပေးတယ်ပေါ့။

Kubernetes ပေါ်မှာတော့ ကျွန်တော်တို့ အရင်က Linux Host ပေါ် standalone binary တွေနဲ့ run ခဲ့တုန်းကလုပ်သလို configuration file တွေလိုက်ပြင်ဖို့ မလိုပါဘူး။ configuration အတွက် Prometheus Operator နဲ့ CRD တွေကိုသုံးပြီး လုပ်နိုင်တယ်။ CRD တွေအများကြီး ရှိတဲ့အထဲမှာ သိထားသင့်တဲ့ ၅ ခုရှိပါတယ်။

နံပါတ်တစ်က Prometheus CRD ပါ။ ပုံမှန်​ကတော့ prometheus.yml ထဲမှာ target discovery တွေ၊ rule file တွေ၊ Alert Manager discovery တွေကို ထည့်ပေးရပါတယ်။ Kubernetes ပေါ်မှာတော့ ဒါတွေကို CRD နဲ့လုပ်တာဖြစ်လို့ အဲဒီ CRD တွေကို ဘယ် namespace ဘယ် label တွေနဲ့ရှာရမယ်။ tsdb ကိုဘယ်လို configure လုပ်ချင်တယ်နဲ့ တခြား Prometheus Server အတွက် လိုအပ်တဲ့ configuration တွေကို Prometheus CRD ကိုသုံးပြီး လုပ်နိုင်ပါတယ်။

ဒုတိယတခုက AlertManager CRD ပါ။ သူကတော့ Alert Manager Stateful Set ရဲ့ configuration တွေအတွက်ဖြစ်တယ်။ နောက်ပြီး alertmanager.yml ထဲသတ်မှတ်ပေးရတဲ့ route တွေ၊ receiver တွေ၊ rule တွေကို Kubernetes ပေါ်မှာ CRD နဲ့လုပ်တဲ့အခါ အဲဒီ CRD တွေကို ဘယ် namespace ဘယ် label နဲ့ရှာရမလဲ စတဲ့ detail တွေကို AlertManager CRD ကနေ သတ်မှတ်ပါတယ်။

နံပါတ်သုံးက ServiceMonitor နဲ့ PodMonitor တွေပါ။ prometheus.yml ထဲမှာ target discovery အတွက် scrape configs ရေးကြတဲ့ job တွေကို ServiceMonitor/PodMonitor CRD တွေနဲ့ သတ်မှတ်နိုင်တယ်။ http protocol scheme, metrics endpoint, target တွေကို ရှာရမယ့် namespace နဲ့ label စသဖြင့် အသေးစိတ် configure လုပ်လို့ရတယ်။

နံပါတ်လေးက alert တွေကို ဘယ်လိုလက်ခံမယ်၊ deduplicate လုပ်မယ်၊ route မယ်၊ slack သုံးရင် slack ကိုဘယ်လိုချိတ်ရမယ် စသဖြင့် alertmanager.yml ထဲက configuration တွေအတွက် သုံးရတဲ့ AlertManagerConfig ဖြစ်တယ်။ sensitive information တွေဖြစ်တဲ့ Token တွေ၊ Webhook URL တွေကိုလည်း Kubernetes Secret ကတဆင့် reference လုပ်နိုင်အောင် ပြင်ထားပေးတဲ့အတွက် secret တွေကို AlertManagerConfig ထဲမှာ hardcode မလုပ်သင့်ပါဘူး။

​ဒီအဆင့်ထိ ရောက်လာခဲ့ပြီဆိုရင် Prometheus ကိုကိုယ့် platform ပေါ်က တခြား system တွေနဲ့ ဆက်စပ်ပြီး လိုအပ်သလို သုံးသွားနိုင်အောင် ဆက်လေ့လာတတ်သွားမယ်လို့ ထင်ပါတယ်။