#!/usr/bin/env bash # monitoring/bootstrap.sh # Deploys kube-prometheus-stack into the monitoring namespace, then upgrades # Grafana (in the logging namespace) to add the Prometheus datasource and # pre-built dashboards. # # Prerequisites: # - kubectl configured (KUBECONFIG pointing to cluster-config/kubeconfig) # - helm >= 3.x # - GRAFANA_ADMIN_PASSWORD set, or present in k8s/logging/.env set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" KUBECONFIG="${KUBECONFIG:-${REPO_ROOT}/cluster-config/kubeconfig}" export KUBECONFIG # ── Namespace ───────────────────────────────────────────────────────────────── echo "==> Creating monitoring namespace..." kubectl create namespace monitoring --dry-run=client -o yaml | kubectl apply -f - kubectl label namespace monitoring \ pod-security.kubernetes.io/enforce=privileged \ pod-security.kubernetes.io/enforce-version=latest \ --overwrite # ── Helm repo ───────────────────────────────────────────────────────────────── echo "==> Adding prometheus-community Helm repo..." helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update prometheus-community # ── kube-prometheus-stack ───────────────────────────────────────────────────── echo "==> Installing kube-prometheus-stack..." helm upgrade --install prometheus prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --values "${SCRIPT_DIR}/prometheus-values.yaml" \ --wait \ --timeout 10m echo "==> Waiting for Prometheus StatefulSet..." kubectl rollout status \ statefulset/prometheus-prometheus-kube-prometheus-prometheus \ -n monitoring --timeout=180s echo "==> Waiting for node-exporter DaemonSet..." kubectl rollout status \ daemonset/prometheus-prometheus-node-exporter \ -n monitoring --timeout=60s echo "==> Waiting for kube-state-metrics..." kubectl rollout status \ deployment/prometheus-kube-state-metrics \ -n monitoring --timeout=60s # ── Upgrade Grafana with Prometheus datasource + dashboards ─────────────────── echo "" echo "==> Upgrading Grafana to wire in Prometheus datasource + dashboards..." LOGGING_DIR="${REPO_ROOT}/k8s/logging" if [[ -f "${LOGGING_DIR}/.env" ]]; then # shellcheck source=/dev/null source "${LOGGING_DIR}/.env" fi if [[ -z "${GRAFANA_ADMIN_PASSWORD:-}" ]]; then echo "ERROR: GRAFANA_ADMIN_PASSWORD is not set. Export it or place it in k8s/logging/.env" exit 1 fi helm repo add grafana https://grafana.github.io/helm-charts helm repo update grafana helm upgrade grafana grafana/grafana \ --namespace logging \ --values "${LOGGING_DIR}/grafana-values.yaml" \ --set adminPassword="${GRAFANA_ADMIN_PASSWORD}" \ --wait \ --timeout 5m echo "==> Waiting for Grafana rollout..." kubectl rollout status deployment/grafana -n logging --timeout=120s # ── Done ────────────────────────────────────────────────────────────────────── echo "" echo "==> Monitoring stack is up." echo "" echo "Prometheus UI:" echo " kubectl port-forward -n monitoring svc/prometheus-kube-prometheus-prometheus 9090:9090" echo " http://localhost:9090 (Targets page shows node-exporter + kube-state-metrics)" echo "" echo "Grafana:" echo " kubectl port-forward -n logging svc/grafana 3000:80" echo " http://localhost:3000" echo " Datasources: Loki (logs, default) + Prometheus (metrics)" echo " Dashboards → General:" echo " - Node Exporter Full (per-node CPU, RAM, disk, network)" echo " - Kubernetes Cluster (pod resource usage across namespaces)"