713 lines
18 KiB
Markdown
713 lines
18 KiB
Markdown
# 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'`
|