348 lines
11 KiB
Bash
Executable File
348 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ============================================================================
|
|
# Kubernetes Infrastructure Monitoring Deployment Script
|
|
# ============================================================================
|
|
# Deploys kube-state-metrics and node-exporter for Kubernetes infrastructure
|
|
# monitoring in SigNoz
|
|
# ============================================================================
|
|
|
|
set -e
|
|
|
|
# Color codes for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
NAMESPACE="bakery-ia"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
# Function to display help
|
|
show_help() {
|
|
echo "Usage: $0 [OPTIONS] [COMMAND]"
|
|
echo ""
|
|
echo "Deploy Kubernetes infrastructure monitoring components"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " install Install kube-state-metrics and node-exporter (default)"
|
|
echo " upgrade Upgrade existing deployments"
|
|
echo " uninstall Remove all infrastructure monitoring components"
|
|
echo " status Show deployment status"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " -h, --help Show this help message"
|
|
echo " -d, --dry-run Show what would be done without executing"
|
|
echo " -n, --namespace NS Specify namespace (default: bakery-ia)"
|
|
echo " --microk8s Use microk8s helm3 command (for MicroK8s clusters)"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 install # Install on standard k8s"
|
|
echo " $0 --microk8s install # Install on MicroK8s"
|
|
echo " $0 --microk8s upgrade # Upgrade on MicroK8s"
|
|
echo " $0 --microk8s uninstall # Remove from MicroK8s"
|
|
echo " $0 status # Check deployment status"
|
|
}
|
|
|
|
# Parse arguments
|
|
DRY_RUN=false
|
|
USE_MICROK8S=false
|
|
COMMAND="install"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-h|--help)
|
|
show_help
|
|
exit 0
|
|
;;
|
|
-d|--dry-run)
|
|
DRY_RUN=true
|
|
shift
|
|
;;
|
|
-n|--namespace)
|
|
NAMESPACE="$2"
|
|
shift 2
|
|
;;
|
|
--microk8s)
|
|
USE_MICROK8S=true
|
|
shift
|
|
;;
|
|
install|upgrade|uninstall|status)
|
|
COMMAND="$1"
|
|
shift
|
|
;;
|
|
*)
|
|
echo -e "${RED}Unknown argument: $1${NC}"
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Set helm and kubectl commands based on environment
|
|
if [[ "$USE_MICROK8S" == true ]]; then
|
|
HELM_CMD="microk8s helm3"
|
|
KUBECTL_CMD="microk8s kubectl"
|
|
else
|
|
HELM_CMD="helm"
|
|
KUBECTL_CMD="kubectl"
|
|
fi
|
|
|
|
# Function to check prerequisites
|
|
check_prerequisites() {
|
|
echo -e "${BLUE}Checking prerequisites...${NC}"
|
|
|
|
# Check helm
|
|
if [[ "$USE_MICROK8S" == true ]]; then
|
|
# Test if microk8s helm3 command works directly
|
|
if ! microk8s helm3 version &> /dev/null; then
|
|
echo -e "${RED}Error: MicroK8s helm3 addon is not working.${NC}"
|
|
echo "Enable it with: microk8s enable helm3"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}MicroK8s helm3 is available.${NC}"
|
|
else
|
|
if ! command -v helm &> /dev/null; then
|
|
echo -e "${RED}Error: Helm is not installed.${NC}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Check kubectl connectivity
|
|
if ! $KUBECTL_CMD cluster-info &> /dev/null; then
|
|
echo -e "${RED}Error: Cannot connect to Kubernetes cluster.${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}Prerequisites check passed.${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Function to setup Helm repository
|
|
setup_helm_repo() {
|
|
echo -e "${BLUE}Setting up Prometheus Community Helm repository...${NC}"
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo " (dry-run) Would add prometheus-community Helm repository"
|
|
return
|
|
fi
|
|
|
|
if $HELM_CMD repo list 2>/dev/null | grep -q "prometheus-community"; then
|
|
echo -e "${BLUE}Repository already added, updating...${NC}"
|
|
$HELM_CMD repo update prometheus-community
|
|
else
|
|
$HELM_CMD repo add prometheus-community https://prometheus-community.github.io/helm-charts
|
|
$HELM_CMD repo update
|
|
fi
|
|
|
|
echo -e "${GREEN}Helm repository ready.${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Function to ensure namespace exists
|
|
ensure_namespace() {
|
|
echo -e "${BLUE}Ensuring namespace $NAMESPACE exists...${NC}"
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo " (dry-run) Would create namespace if needed"
|
|
return
|
|
fi
|
|
|
|
if ! $KUBECTL_CMD get namespace "$NAMESPACE" &> /dev/null; then
|
|
$KUBECTL_CMD create namespace "$NAMESPACE"
|
|
echo -e "${GREEN}Namespace $NAMESPACE created.${NC}"
|
|
else
|
|
echo -e "${BLUE}Namespace $NAMESPACE already exists.${NC}"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Function to install kube-state-metrics
|
|
install_kube_state_metrics() {
|
|
echo -e "${BLUE}Installing kube-state-metrics...${NC}"
|
|
|
|
local values_file="$SCRIPT_DIR/kube-state-metrics-values.yaml"
|
|
|
|
if [[ ! -f "$values_file" ]]; then
|
|
echo -e "${RED}Error: Values file not found: $values_file${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo " (dry-run) Would install kube-state-metrics"
|
|
echo " Command: $HELM_CMD upgrade --install kube-state-metrics prometheus-community/kube-state-metrics -n $NAMESPACE -f $values_file"
|
|
return
|
|
fi
|
|
|
|
$HELM_CMD upgrade --install kube-state-metrics \
|
|
prometheus-community/kube-state-metrics \
|
|
-n "$NAMESPACE" \
|
|
-f "$values_file" \
|
|
--wait \
|
|
--timeout 5m
|
|
|
|
echo -e "${GREEN}kube-state-metrics installed successfully.${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Function to install node-exporter
|
|
install_node_exporter() {
|
|
echo -e "${BLUE}Installing node-exporter...${NC}"
|
|
|
|
local values_file="$SCRIPT_DIR/node-exporter-values.yaml"
|
|
|
|
if [[ ! -f "$values_file" ]]; then
|
|
echo -e "${RED}Error: Values file not found: $values_file${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo " (dry-run) Would install node-exporter"
|
|
echo " Command: $HELM_CMD upgrade --install node-exporter prometheus-community/prometheus-node-exporter -n $NAMESPACE -f $values_file"
|
|
return
|
|
fi
|
|
|
|
$HELM_CMD upgrade --install node-exporter \
|
|
prometheus-community/prometheus-node-exporter \
|
|
-n "$NAMESPACE" \
|
|
-f "$values_file" \
|
|
--wait \
|
|
--timeout 5m
|
|
|
|
echo -e "${GREEN}node-exporter installed successfully.${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Function to uninstall components
|
|
uninstall_components() {
|
|
echo -e "${BLUE}Uninstalling Kubernetes infrastructure monitoring components...${NC}"
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo " (dry-run) Would uninstall kube-state-metrics and node-exporter"
|
|
return
|
|
fi
|
|
|
|
# Uninstall kube-state-metrics
|
|
if $HELM_CMD list -n "$NAMESPACE" | grep -q "kube-state-metrics"; then
|
|
echo -e "${BLUE}Removing kube-state-metrics...${NC}"
|
|
$HELM_CMD uninstall kube-state-metrics -n "$NAMESPACE" --wait
|
|
echo -e "${GREEN}kube-state-metrics removed.${NC}"
|
|
else
|
|
echo -e "${YELLOW}kube-state-metrics not found.${NC}"
|
|
fi
|
|
|
|
# Uninstall node-exporter
|
|
if $HELM_CMD list -n "$NAMESPACE" | grep -q "node-exporter"; then
|
|
echo -e "${BLUE}Removing node-exporter...${NC}"
|
|
$HELM_CMD uninstall node-exporter -n "$NAMESPACE" --wait
|
|
echo -e "${GREEN}node-exporter removed.${NC}"
|
|
else
|
|
echo -e "${YELLOW}node-exporter not found.${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
}
|
|
|
|
# Function to show deployment status
|
|
show_status() {
|
|
echo -e "${BLUE}=== Kubernetes Infrastructure Monitoring Status ===${NC}"
|
|
echo ""
|
|
|
|
echo -e "${BLUE}Helm Releases:${NC}"
|
|
$HELM_CMD list -n "$NAMESPACE" | grep -E "(kube-state-metrics|node-exporter)" || echo " No releases found"
|
|
echo ""
|
|
|
|
echo -e "${BLUE}Pods:${NC}"
|
|
$KUBECTL_CMD get pods -n "$NAMESPACE" -l 'app.kubernetes.io/name in (kube-state-metrics, prometheus-node-exporter)' 2>/dev/null || echo " No pods found"
|
|
echo ""
|
|
|
|
echo -e "${BLUE}Services:${NC}"
|
|
$KUBECTL_CMD get svc -n "$NAMESPACE" | grep -E "(kube-state-metrics|node-exporter)" || echo " No services found"
|
|
echo ""
|
|
|
|
echo -e "${BLUE}Endpoints (for SigNoz scraping):${NC}"
|
|
echo " kube-state-metrics: kube-state-metrics.$NAMESPACE.svc.cluster.local:8080"
|
|
echo " node-exporter: node-exporter-prometheus-node-exporter.$NAMESPACE.svc.cluster.local:9100"
|
|
echo ""
|
|
}
|
|
|
|
# Function to show post-install instructions
|
|
show_post_install_instructions() {
|
|
echo -e "${BLUE}=== Post-Installation Instructions ===${NC}"
|
|
echo ""
|
|
echo "To enable SigNoz to scrape these metrics, update your SigNoz OTel Collector config."
|
|
echo ""
|
|
echo "Add the following to your signoz-values-prod.yaml under otelCollector.config:"
|
|
echo ""
|
|
cat << 'EOF'
|
|
otelCollector:
|
|
config:
|
|
receivers:
|
|
prometheus:
|
|
config:
|
|
scrape_configs:
|
|
- job_name: 'kube-state-metrics'
|
|
static_configs:
|
|
- targets: ['kube-state-metrics.bakery-ia.svc.cluster.local:8080']
|
|
scrape_interval: 30s
|
|
- job_name: 'node-exporter'
|
|
static_configs:
|
|
- targets: ['node-exporter-prometheus-node-exporter.bakery-ia.svc.cluster.local:9100']
|
|
scrape_interval: 30s
|
|
service:
|
|
pipelines:
|
|
metrics:
|
|
receivers: [otlp, prometheus]
|
|
EOF
|
|
echo ""
|
|
echo "Then upgrade SigNoz:"
|
|
if [[ "$USE_MICROK8S" == true ]]; then
|
|
echo " microk8s helm3 upgrade signoz signoz/signoz -n $NAMESPACE -f infrastructure/monitoring/signoz/signoz-values-prod.yaml"
|
|
else
|
|
echo " helm upgrade signoz signoz/signoz -n $NAMESPACE -f infrastructure/monitoring/signoz/signoz-values-prod.yaml"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
echo -e "${BLUE}"
|
|
echo "=========================================="
|
|
echo "Kubernetes Infrastructure Monitoring"
|
|
echo "=========================================="
|
|
echo -e "${NC}"
|
|
|
|
check_prerequisites
|
|
|
|
case $COMMAND in
|
|
install)
|
|
setup_helm_repo
|
|
ensure_namespace
|
|
install_kube_state_metrics
|
|
install_node_exporter
|
|
show_status
|
|
show_post_install_instructions
|
|
echo -e "${GREEN}Installation completed successfully!${NC}"
|
|
;;
|
|
upgrade)
|
|
setup_helm_repo
|
|
install_kube_state_metrics
|
|
install_node_exporter
|
|
show_status
|
|
echo -e "${GREEN}Upgrade completed successfully!${NC}"
|
|
;;
|
|
uninstall)
|
|
uninstall_components
|
|
echo -e "${GREEN}Uninstallation completed.${NC}"
|
|
;;
|
|
status)
|
|
show_status
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Run main function
|
|
main
|