Files
k3s-gitops/loki-ingress-argocd-setup/ARGOCD_LOKI_INGRESS_SETUP.md

18 KiB
Raw Permalink Blame History

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 автоматически:

  1. Обнаружит изменения в git (в течение 3 минут)
  2. Применит новые манифесты
  3. Создаст Secret, Middleware и Ingress

Ручная синхронизация (если не хочешь ждать)

Через ArgoCD CLI:

# Синхронизируй приложение
argocd app sync loki

# Посмотри статус
argocd app get loki

# Посмотри логи синхронизации
argocd app logs loki --follow

Через ArgoCD UI:

  1. Открой: https://argocd.thedevops.dev (или твой ArgoCD URL)
  2. Найди приложение loki
  3. Нажми кнопку "SYNC"
  4. Нажми "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 Проверка через браузер

  1. Открой: https://loki.thedevops.dev
  2. Должен появиться Basic Auth prompt
  3. Введи:
    • Username: admin
    • Password: lokipass123
  4. Должна открыться страница Loki (скорее всего 404 на корневом пути - это нормально)
  5. Попробуй endpoints:
    • https://loki.thedevops.dev/ready
    • https://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

  1. Открой Grafana: https://grafana.thedevops.dev
  2. Перейди в: Configuration → Data Sources
  3. Должны появиться:
    • Loki (внутренний)
    • Loki External (внешний)
  4. Нажми Test на каждом
  5. Должно показать: "Data source is working"

Шаг 11: Тестирование логов в Grafana

11.1 Через Explore

  1. В Grafana перейди: Explore (иконка компаса)
  2. Выбери Data Source: Loki
  3. Попробуй запросы:
# Все логи из namespace loki
{namespace="loki"}

# Логи Loki pod'ов
{namespace="loki", app="loki"}

# Ошибки из всех namespaces
{} |= "error"

# Rate запросов за последние 5 минут
rate({namespace="loki"}[5m])

11.2 Создай Dashboard

  1. Dashboards → Import
  2. Вставь ID: 13639 (Loki Dashboard)
  3. Выбери Loki datasource
  4. 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

  1. Пароли:

    • Используй strong passwords
    • Рассмотри интеграцию с Vault для хранения паролей
    • Регулярно меняй пароли
  2. HTTPS:

    • Всегда используй HTTPS для production
    • Let's Encrypt сертификаты автоматически обновляются
  3. Rate Limiting:

    • Добавь Traefik middleware для rate limiting если нужно
  4. Network Policies:

    • Ограничь доступ к Loki только от Promtail и Grafana
  5. Backup:

    • Настрой backup для PVC (loki-data)
    • Используй Longhorn snapshots

Следующие шаги

  1. Добавить Ingress для Loki
  2. Настроить HTTPS с Let's Encrypt
  3. Добавить Basic Authentication
  4. Интегрировать с Grafana
  5. 🔲 Настроить alerting rules в Loki
  6. 🔲 Добавить Grafana dashboards
  7. 🔲 Настроить retention policies
  8. 🔲 Интегрировать с Tempo (distributed tracing)
  9. 🔲 Добавить Network Policies
  10. 🔲 Настроить backup для Loki data

Ресурсы


Поддержка

Если возникли проблемы:

  1. Проверь логи компонентов
  2. Проверь ArgoCD sync status
  3. Проверь Kubernetes events: kubectl get events -n loki --sort-by='.lastTimestamp'