18 KiB
18 KiB
ArgoCD GitOps Setup для Loki Ingress
Текущая конфигурация
- ArgoCD Application:
loki - Git Repository:
http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops - Path:
apps/loki - Auto-sync: Включен (prune: true, selfHeal: true)
- Target Namespace:
loki
Шаг 1: Подключись к Git репозиторию
Вариант A: Через SSH (рекомендуется)
# Клонируй репозиторий
git clone git@gitea-http.gitea.svc.cluster.local:admin/k3s-gitops.git
cd k3s-gitops
# Или если используешь внешний доступ
git clone git@gitea.thedevops.dev:admin/k3s-gitops.git
cd k3s-gitops
Вариант B: Через HTTP
git clone http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops.git
cd k3s-gitops
# Введи credentials для Gitea
Шаг 2: Проверь структуру директорий
# Перейди в директорию приложения Loki
cd apps/loki
# Посмотри текущую структуру
tree .
# Должна быть примерно такая структура:
# apps/loki/
# ├── namespace.yaml
# ├── configmap-loki.yaml
# ├── configmap-promtail.yaml
# ├── statefulset.yaml
# ├── daemonset-promtail.yaml
# ├── service.yaml
# ├── ingress-promtail.yaml (уже существует)
# ├── rbac.yaml
# └── servicemonitor.yaml
Шаг 3: Создай файлы для Loki Ingress
3.1 Secret для Basic Auth
Создай файл: apps/loki/secret-basic-auth.yaml
---
# Basic Auth Secret для защиты Loki
apiVersion: v1
kind: Secret
metadata:
name: loki-basic-auth
namespace: loki
labels:
app.kubernetes.io/name: loki
argocd.argoproj.io/instance: loki
type: Opaque
stringData:
# Username: admin
# Password: lokipass123
# Сгенерировано с помощью: htpasswd -nb admin lokipass123
users: |
admin:$apr1$8jGXMp0X$xR7yGcZqz.pPJY4IaGQ0n0
Как создать свой пароль:
# Установи htpasswd (если нужно)
sudo apt-get install apache2-utils
# Создай новый пароль
htpasswd -nb admin your-secure-password
# Результат замени в stringData.users выше
3.2 Traefik Middleware
Создай файл: apps/loki/middleware-auth.yaml
---
# Traefik Middleware для Basic Auth
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: loki-auth
namespace: loki
labels:
app.kubernetes.io/name: loki
argocd.argoproj.io/instance: loki
spec:
basicAuth:
secret: loki-basic-auth
removeHeader: true
3.3 Loki Ingress
Создай файл: apps/loki/ingress-loki.yaml
---
# Ingress для Loki с HTTPS и аутентификацией
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: loki
namespace: loki
annotations:
# Использовать Traefik ingress controller
kubernetes.io/ingress.class: traefik
# Let's Encrypt сертификат
cert-manager.io/cluster-issuer: letsencrypt-http
cert-manager.io/acme-challenge-type: http01
# Применить Basic Auth middleware
traefik.ingress.kubernetes.io/router.middlewares: loki-loki-auth@kubernetescrd
# Entry points (http и https)
traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
labels:
app.kubernetes.io/name: loki
argocd.argoproj.io/instance: loki
spec:
ingressClassName: traefik
rules:
- host: loki.thedevops.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: loki
port:
number: 3100
tls:
- hosts:
- loki.thedevops.dev
secretName: loki-tls
Шаг 4: Проверь файлы перед коммитом
# Находясь в директории k3s-gitops/apps/loki/
# Проверь что файлы созданы
ls -la
# Должны появиться:
# - secret-basic-auth.yaml
# - middleware-auth.yaml
# - ingress-loki.yaml
# Валидируй YAML синтаксис
kubectl apply --dry-run=client -f secret-basic-auth.yaml
kubectl apply --dry-run=client -f middleware-auth.yaml
kubectl apply --dry-run=client -f ingress-loki.yaml
Шаг 5: Git Commit и Push
# Из директории k3s-gitops/
# Добавь файлы в git
git add apps/loki/secret-basic-auth.yaml
git add apps/loki/middleware-auth.yaml
git add apps/loki/ingress-loki.yaml
# Проверь статус
git status
# Создай коммит
git commit -m "feat(loki): Add Ingress with HTTPS and Basic Auth for loki.thedevops.dev"
# Push в репозиторий
git push origin main
# (или master - в зависимости от твоей ветки)
Шаг 6: ArgoCD Auto-Sync
Поскольку у тебя включен auto-sync, ArgoCD автоматически:
- Обнаружит изменения в git (в течение 3 минут)
- Применит новые манифесты
- Создаст Secret, Middleware и Ingress
Ручная синхронизация (если не хочешь ждать)
Через ArgoCD CLI:
# Синхронизируй приложение
argocd app sync loki
# Посмотри статус
argocd app get loki
# Посмотри логи синхронизации
argocd app logs loki --follow
Через ArgoCD UI:
- Открой:
https://argocd.thedevops.dev(или твой ArgoCD URL) - Найди приложение
loki - Нажми кнопку "SYNC"
- Нажми "SYNCHRONIZE"
Через kubectl:
# Триггер синхронизации через kubectl
kubectl patch application loki -n argocd \
--type merge \
--patch '{"operation": {"initiatedBy": {"username": "manual"}}}'
Шаг 7: Проверка развертывания
7.1 Проверь ресурсы в кластере
# Проверь что все ресурсы созданы
kubectl get all,ingress,secret,middleware -n loki
# Проверь конкретно Ingress
kubectl get ingress loki -n loki -o wide
# Должен показать:
# NAME CLASS HOSTS ADDRESS PORTS AGE
# loki traefik loki.thedevops.dev 5.182.17.194,62.169.30.194,... 80, 443 1m
# Проверь Middleware
kubectl get middleware -n loki
# Проверь Secret
kubectl get secret loki-basic-auth -n loki
7.2 Проверь сертификат
# Посмотри статус сертификата
kubectl get certificate -n loki
# Должен появиться:
# NAME READY SECRET AGE
# loki-tls True loki-tls 2m
# Если сертификат не готов, посмотри детали
kubectl describe certificate loki-tls -n loki
# Проверь логи cert-manager
kubectl logs -n cert-manager deployment/cert-manager --tail=50
7.3 Проверь ArgoCD статус
# Посмотри статус приложения
argocd app get loki
# Должно показать:
# Health Status: Healthy
# Sync Status: Synced
# Посмотри ресурсы приложения
argocd app resources loki
Шаг 8: Настрой DNS
8.1 Проверь IP адреса Ingress
kubectl get ingress loki -n loki -o jsonpath='{.status.loadBalancer.ingress[*].ip}'
# Получишь IP адреса: 5.182.17.194 62.169.30.194 62.169.30.206
8.2 Добавь DNS запись
В DNS провайдере (Cloudflare, Route53, и т.д.) создай A-record:
Type: A
Name: loki.thedevops.dev
Value: 5.182.17.194 (или любой из твоих IP)
TTL: 300
Или для всех IP (если нужен load balancing):
Type: A, Name: loki.thedevops.dev, Value: 5.182.17.194
Type: A, Name: loki.thedevops.dev, Value: 62.169.30.194
Type: A, Name: loki.thedevops.dev, Value: 62.169.30.206
8.3 Проверь DNS резолюцию
# Проверь что DNS работает
nslookup loki.thedevops.dev
# Или
dig loki.thedevops.dev
# Должен показать твои IP адреса
Шаг 9: Тестирование доступа
9.1 Тестовые запросы
# Проверка health endpoint (требует Basic Auth)
curl -u admin:lokipass123 https://loki.thedevops.dev/ready
# Должен вернуть: ready
# Проверка метрик
curl -u admin:lokipass123 https://loki.thedevops.dev/metrics
# Проверка labels
curl -u admin:lokipass123 https://loki.thedevops.dev/loki/api/v1/labels
# Тестовый LogQL запрос
curl -u admin:lokipass123 -G -s "https://loki.thedevops.dev/loki/api/v1/query" \
--data-urlencode 'query={namespace="loki"}' | jq
9.2 Проверка через браузер
- Открой:
https://loki.thedevops.dev - Должен появиться Basic Auth prompt
- Введи:
- Username:
admin - Password:
lokipass123
- Username:
- Должна открыться страница Loki (скорее всего 404 на корневом пути - это нормально)
- Попробуй endpoints:
https://loki.thedevops.dev/readyhttps://loki.thedevops.dev/metrics
9.3 Проверка HTTPS сертификата
# Проверь SSL сертификат
openssl s_client -connect loki.thedevops.dev:443 -servername loki.thedevops.dev
# Или через curl
curl -vI https://loki.thedevops.dev 2>&1 | grep -i "SSL\|certificate"
Шаг 10: Интеграция с Grafana
10.1 Добавь Loki DataSource в Grafana
Создай файл: apps/monitoring/grafana-datasource-loki.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-datasource-loki
namespace: monitoring
labels:
grafana_datasource: "1"
data:
loki.yaml: |
apiVersion: 1
datasources:
# Внутренний доступ (из Grafana pod в кластере) - РЕКОМЕНДУЕТСЯ
- name: Loki
type: loki
access: proxy
url: http://loki.loki.svc.cluster.local:3100
isDefault: false
editable: true
jsonData:
maxLines: 5000
timeout: 60
derivedFields:
- datasourceUid: prometheus
matcherRegex: "traceID=(\\w+)"
name: TraceID
url: '$${__value.raw}'
# Внешний доступ (через домен, требует Basic Auth)
- name: Loki External
type: loki
access: proxy
url: https://loki.thedevops.dev
isDefault: false
editable: true
basicAuth: true
basicAuthUser: admin
secureJsonData:
basicAuthPassword: lokipass123
jsonData:
maxLines: 5000
timeout: 60
tlsSkipVerify: false
10.2 Примени конфигурацию
cd k3s-gitops/
# Добавь файл
git add apps/monitoring/grafana-datasource-loki.yaml
# Commit & Push
git commit -m "feat(grafana): Add Loki datasource configuration"
git push origin main
# Если у Grafana отдельное ArgoCD приложение, синхронизируй его
argocd app sync k8s-monitoring
# (или как называется твое Grafana приложение)
10.3 Перезапусти Grafana (опционально)
# Если datasource не появился автоматически
kubectl rollout restart deployment k8s-monitoring-grafana -n monitoring
10.4 Проверь в Grafana UI
- Открой Grafana:
https://grafana.thedevops.dev - Перейди в: Configuration → Data Sources
- Должны появиться:
Loki(внутренний)Loki External(внешний)
- Нажми Test на каждом
- Должно показать: "Data source is working"
Шаг 11: Тестирование логов в Grafana
11.1 Через Explore
- В Grafana перейди: Explore (иконка компаса)
- Выбери Data Source: Loki
- Попробуй запросы:
# Все логи из namespace loki
{namespace="loki"}
# Логи Loki pod'ов
{namespace="loki", app="loki"}
# Ошибки из всех namespaces
{} |= "error"
# Rate запросов за последние 5 минут
rate({namespace="loki"}[5m])
11.2 Создай Dashboard
- Dashboards → Import
- Вставь ID: 13639 (Loki Dashboard)
- Выбери Loki datasource
- Import
Шаг 12: Мониторинг и алерты
12.1 Проверь ServiceMonitor
# ServiceMonitor уже должен существовать
kubectl get servicemonitor loki -n loki -o yaml
12.2 Prometheus метрики
# Проверь что Prometheus собирает метрики Loki
kubectl port-forward -n monitoring svc/k8s-monitoring-kube-promet-prometheus 9090:9090
# В браузере открой: http://localhost:9090
# Попробуй запрос: loki_ingester_memory_chunks
Troubleshooting
Проблема: Ingress не получает IP
# Проверь Traefik
kubectl get svc -n kube-system traefik
# Проверь логи Traefik
kubectl logs -n kube-system deployment/traefik --tail=50
Проблема: 401 Unauthorized
# Проверь что Secret создан
kubectl get secret loki-basic-auth -n loki
# Проверь содержимое
kubectl get secret loki-basic-auth -n loki -o jsonpath='{.data.users}' | base64 -d
# Проверь что Middleware применен
kubectl get middleware loki-auth -n loki -o yaml
Проблема: Сертификат не создается
# Проверь CertificateRequest
kubectl get certificaterequest -n loki
# Проверь Challenge
kubectl get challenge -n loki
# Проверь Order
kubectl get order -n loki
# Логи cert-manager
kubectl logs -n cert-manager deployment/cert-manager -f
# Проверь что домен резолвится
nslookup loki.thedevops.dev
Проблема: ArgoCD не синхронизирует
# Проверь статус приложения
argocd app get loki
# Проверь логи ArgoCD
kubectl logs -n argocd deployment/argocd-application-controller -f
# Вручную триггер sync
argocd app sync loki --force
Проблема: Loki недоступен из Grafana
# Проверь что Service работает
kubectl get svc loki -n loki
# Проверь endpoints
kubectl get endpoints loki -n loki
# Тест внутри кластера
kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- \
curl -s http://loki.loki.svc.cluster.local:3100/ready
Полезные команды
# Просмотр всех ресурсов Loki
kubectl get all,ingress,secret,middleware,certificate -n loki
# Логи Loki pod
kubectl logs -n loki loki-0 -f
# Логи Promtail
kubectl logs -n loki daemonset/promtail -f
# ArgoCD приложение
argocd app get loki
argocd app sync loki
argocd app diff loki
# Удалить и пересоздать Ingress (если нужно)
kubectl delete ingress loki -n loki
argocd app sync loki
# Принудительный sync всего приложения
argocd app sync loki --prune --force
Итоговая структура Git репозитория
k3s-gitops/
└── apps/
└── loki/
├── namespace.yaml
├── configmap-loki.yaml
├── configmap-promtail.yaml
├── secret-basic-auth.yaml # НОВЫЙ
├── middleware-auth.yaml # НОВЫЙ
├── ingress-loki.yaml # НОВЫЙ
├── ingress-promtail.yaml # СУЩЕСТВУЮЩИЙ
├── service.yaml
├── statefulset.yaml
├── daemonset-promtail.yaml
├── rbac.yaml
└── servicemonitor.yaml
Безопасность и Best Practices
-
Пароли:
- Используй strong passwords
- Рассмотри интеграцию с Vault для хранения паролей
- Регулярно меняй пароли
-
HTTPS:
- Всегда используй HTTPS для production
- Let's Encrypt сертификаты автоматически обновляются
-
Rate Limiting:
- Добавь Traefik middleware для rate limiting если нужно
-
Network Policies:
- Ограничь доступ к Loki только от Promtail и Grafana
-
Backup:
- Настрой backup для PVC (
loki-data) - Используй Longhorn snapshots
- Настрой backup для PVC (
Следующие шаги
- ✅ Добавить Ingress для Loki
- ✅ Настроить HTTPS с Let's Encrypt
- ✅ Добавить Basic Authentication
- ✅ Интегрировать с Grafana
- 🔲 Настроить alerting rules в Loki
- 🔲 Добавить Grafana dashboards
- 🔲 Настроить retention policies
- 🔲 Интегрировать с Tempo (distributed tracing)
- 🔲 Добавить Network Policies
- 🔲 Настроить backup для Loki data
Ресурсы
Поддержка
Если возникли проблемы:
- Проверь логи компонентов
- Проверь ArgoCD sync status
- Проверь Kubernetes events:
kubectl get events -n loki --sort-by='.lastTimestamp'