# 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 (рекомендуется) ```bash # Клонируй репозиторий 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 ```bash git clone http://gitea-http.gitea.svc.cluster.local:3000/admin/k3s-gitops.git cd k3s-gitops # Введи credentials для Gitea ``` --- ## Шаг 2: Проверь структуру директорий ```bash # Перейди в директорию приложения 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` ```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 ``` **Как создать свой пароль:** ```bash # Установи htpasswd (если нужно) sudo apt-get install apache2-utils # Создай новый пароль htpasswd -nb admin your-secure-password # Результат замени в stringData.users выше ``` ### 3.2 Traefik Middleware Создай файл: `apps/loki/middleware-auth.yaml` ```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` ```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: Проверь файлы перед коммитом ```bash # Находясь в директории 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 ```bash # Из директории 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: ```bash # Синхронизируй приложение 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: ```bash # Триггер синхронизации через kubectl kubectl patch application loki -n argocd \ --type merge \ --patch '{"operation": {"initiatedBy": {"username": "manual"}}}' ``` --- ## Шаг 7: Проверка развертывания ### 7.1 Проверь ресурсы в кластере ```bash # Проверь что все ресурсы созданы 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 Проверь сертификат ```bash # Посмотри статус сертификата 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 статус ```bash # Посмотри статус приложения argocd app get loki # Должно показать: # Health Status: Healthy # Sync Status: Synced # Посмотри ресурсы приложения argocd app resources loki ``` --- ## Шаг 8: Настрой DNS ### 8.1 Проверь IP адреса Ingress ```bash 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 резолюцию ```bash # Проверь что DNS работает nslookup loki.thedevops.dev # Или dig loki.thedevops.dev # Должен показать твои IP адреса ``` --- ## Шаг 9: Тестирование доступа ### 9.1 Тестовые запросы ```bash # Проверка 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 сертификата ```bash # Проверь 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` ```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 Примени конфигурацию ```bash 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 (опционально) ```bash # Если 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. Попробуй запросы: ```logql # Все логи из 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 ```bash # ServiceMonitor уже должен существовать kubectl get servicemonitor loki -n loki -o yaml ``` ### 12.2 Prometheus метрики ```bash # Проверь что 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 ```bash # Проверь Traefik kubectl get svc -n kube-system traefik # Проверь логи Traefik kubectl logs -n kube-system deployment/traefik --tail=50 ``` ### Проблема: 401 Unauthorized ```bash # Проверь что 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 ``` ### Проблема: Сертификат не создается ```bash # Проверь 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 не синхронизирует ```bash # Проверь статус приложения argocd app get loki # Проверь логи ArgoCD kubectl logs -n argocd deployment/argocd-application-controller -f # Вручную триггер sync argocd app sync loki --force ``` ### Проблема: Loki недоступен из Grafana ```bash # Проверь что 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 ``` --- ## Полезные команды ```bash # Просмотр всех ресурсов 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 --- ## Ресурсы - [Loki Documentation](https://grafana.com/docs/loki/latest/) - [Traefik Middleware](https://doc.traefik.io/traefik/middlewares/overview/) - [ArgoCD Documentation](https://argo-cd.readthedocs.io/) - [Cert-Manager Documentation](https://cert-manager.io/docs/) --- ## Поддержка Если возникли проблемы: 1. Проверь логи компонентов 2. Проверь ArgoCD sync status 3. Проверь Kubernetes events: `kubectl get events -n loki --sort-by='.lastTimestamp'`