Upload files to "loki-ingress-argocd-setup"

This commit is contained in:
2026-01-06 07:36:53 +00:00
parent dce0be1095
commit 3039f872aa
5 changed files with 1476 additions and 0 deletions

View File

@@ -0,0 +1,712 @@
# 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'`