Приложения
Приложение А – Программный код bash скрипта
#!/bin/bash
# === Первоначальные настройки ===
NAMESPACE="yagram-lab5"
RELEASE_NAME="my-nginx"
PROMETHEUS_RELEASE="prometheus-stack"
OLD_NAMESPACE="yagram-lab4"
echo "🚀 Запуск автоматического развёртывания стэка"
# --- Шаг 1: Проверка и вывод версий установленных инструментов ---
echo "🔍 Шаг 1: Проверка версий необходимых инструментов (Docker, kubectl, Helm, Minikube)"
for cmd in docker kubectl helm minikube; do
if command -v $cmd &> /dev/null; then
version=$($cmd version --short 2>/dev/null || $cmd version 2>/dev/null | head -n1 || echo "unknown")
echo "✅ $cmd: $version"
else
echo "❌ $cmd: не установлен"
fi
done
echo ""
# --- Шаг 2: Запуск Minikube ---
echo "🔄 Шаг 2: Проверка состояния Minikube"
if ! minikube status &> /dev/null; then
echo "🚀 Minikube не запущен. Запуск с аддонами metrics-server и ingress"
minikube start --addons=metrics-server,ingress || {
echo "❌ Ошибка при запуске Minikube"
exit 1
}
else
echo "✅ Minikube запущен"
fi
echo ""
# --- Шаг 3: Удаление старого релиза Prometheus и namespace (из 4-й лабораторной работы) ---
echo "🧹 Шаг 3: Проверка наличия старого релиза prometheus-stack в namespace '$OLD_NAMESPACE'"
if helm status "$PROMETHEUS_RELEASE" -n "$OLD_NAMESPACE" &> /dev/null; then
echo "⚠️ Обнаружен старый релиз $PROMETHEUS_RELEASE в namespace $OLD_NAMESPACE. Удаление старого релиза Prometheus"
helm uninstall "$PROMETHEUS_RELEASE" -n "$OLD_NAMESPACE"
fi
if kubectl get namespace "$OLD_NAMESPACE" &> /dev/null; then
echo "⚠️ Обнаружен старый namespace $OLD_NAMESPACE. Удаление старого релиза"
kubectl delete namespace "$OLD_NAMESPACE" --ignore-not-found=true
fi
# Удаление всех ClusterRole и ClusterRoleBinding, относящихся к старому релизу
kubectl delete clusterrole -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --ignore-not-found=true
kubectl delete clusterrolebinding -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --ignore-not-found=true
kubectl delete service -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --all-namespaces --ignore-not-found=true
kubectl delete mutatingwebhookconfiguration -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --ignore-not-found=true
kubectl delete validatingwebhookconfiguration -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --ignore-not-found=true
# Удаление ConfigMap, Deployment, StatefulSet, DaemonSet и др. компонентов, оставшихся в каких-то namespace
kubectl delete deployment -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --all-namespaces --ignore-not-found=true
kubectl delete statefulset -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --all-namespaces --ignore-not-found=true
kubectl delete daemonset -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --all-namespaces --ignore-not-found=true
kubectl delete configmap -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --all-namespaces --ignore-not-found=true
kubectl delete secret -l app.kubernetes.io/instance="$PROMETHEUS_RELEASE" --all-namespaces --ignore-not-found=true
# Удаление всех CRD, созданных Prometheus-оператором
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd alertmanagers.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd podmonitors.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd probes.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd prometheuses.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd prometheusrules.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd servicemonitors.monitoring.coreos.com --ignore-not-found=true
kubectl delete crd thanosrulers.monitoring.coreos.com --ignore-not-found=true
echo "✅ Очистка ресурсов старых релизов завершена"
echo ""
# --- Шаг 4: Создание нового namespace ---
echo "🔧 Шаг 4: Создание нового namespace: $NAMESPACE"
kubectl create namespace "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f -
echo ""
# --- Шаг 5: Установка Prometheus и Grafana ---
echo "🔧 Шаг 5: Установка Prometheus и Grafana"
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install "$PROMETHEUS_RELEASE" prometheus-community/kube-prometheus-stack \
--namespace "$NAMESPACE" \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set nodeExporter.enabled=false \
--set kubeStateMetrics.enabled=true \
--set defaultRules.create=true \
--set alertmanager.enabled=true \
--create-namespace || {
echo "❌ Ошибка при установке Prometheus"
exit 1
}
echo ""
# --- Шаг 6: Установка Nginx через OCI ---
echo "🔧 Шаг 6: Установка Nginx"
helm install "$RELEASE_NAME" oci://registry-1.docker.io/bitnamicharts/nginx \
--namespace "$NAMESPACE" \
--set service.type=ClusterIP \
--set metrics.enabled=true \
--set metrics.serviceMonitor.enabled=true \
--set metrics.serviceMonitor.namespace="$NAMESPACE" \
--set containerPort=8080 \
--create-namespace || {
echo "❌ Ошибка при установке Nginx"
exit 1
}
echo ""
# --- Шаг 7: Создание кастомной страницы index.html ---
echo "🎨 Шаг 7: Создание кастомной страницы index.html"
cat > index.html <<EOF
<!DOCTYPE html>
<html>
<head><title>My Custom Nginx on Minikube</title></head>
<body><h1>Hello from Nginx running in Minikube!</h1></body>
<body><h1>Hello, Ramil!</h1></body>
</html>
EOF
echo "index.html создан"
echo ""
# --- Шаг 8: Создание ConfigMap ---
echo "🔧 Шаг 8: Создание ConfigMap с index.html"
kubectl create configmap nginx-custom-html --from-file=index.html -n "$NAMESPACE" --dry-run=client -o yaml | kubectl apply -f -
echo ""
# --- Шаг 9: Модификация Deployment Nginx ---
echo "🔧 Шаг 9: Применение patch к Deployment для монтирования index.html"
kubectl patch deployment "$RELEASE_NAME" -n "$NAMESPACE" --type='json' -p='[
{"op":"add","path":"/spec/template/spec/volumes/-","value":{"name":"custom-html","configMap":{"name":"nginx-custom-html"}}},
{"op":"add","path":"/spec/template/spec/containers/0/volumeMounts/-","value":{"name":"custom-html","mountPath":"/opt/bitnami/nginx/html/index.html","subPath":"index.html"}}
]' || {
echo "❌ Ошибка при применении patch"
exit 1
}
echo ""
# --- Шаг 10: Ожидание готовности подов ---
echo "⏳ Шаг 10: Ожидание готовности всех подов"
kubectl wait --for=condition=ready pod --all -n "$NAMESPACE" --timeout=900s || {
echo "⚠️ Не все поды перешли в состояние Running"
}
echo ""
# --- Шаг 11: Получение пароля от Grafana ---
echo "🔑 Шаг 11: Получение пароля от Grafana"
GRAFANA_PASSWORD=$(kubectl get secret -n "$NAMESPACE" "${PROMETHEUS_RELEASE}-grafana" -o jsonpath="{.data.admin-password}" | base64 --decode)
echo "Логин и пароль для входа в Grafana: admin/$GRAFANA_PASSWORD"
echo ""
# --- Шаг 12: Проброс портов Nginx, Grafana и Prometheus ---
echo "🔑 Шаг 12: Проброс портов Nginx, Grafana и Prometheus"
kubectl port-forward svc/$RELEASE_NAME 8080:80 -n $NAMESPACE &
kubectl port-forward svc/${PROMETHEUS_RELEASE}-grafana 3000:80 -n $NAMESPACE &
kubectl port-forward svc/prometheus-stack-kube-prom-prometheus 9090:9090 -n $NAMESPACE &
# Ожидание остановки проброса портов (нажать Ctrl+C)
echo "⏳ Проброс портов запущен. Нажмите Ctrl+C, чтобы остановить"
wait
# Удаление файла index.html
rm -f index.html
exit 0
