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

713 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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'`