Что такое Service health check failed?
Ошибка Service health check failed
возникает, когда проверка состояния сервиса в CI/CD пайплайне завершается неудачно, что указывает на проблемы с работоспособностью приложения.
Причины возникновения
- Сервис не запустился после деплоя
- Проблемы с конфигурацией приложения
- Недостаточно ресурсов (CPU, память, диск)
- Проблемы с сетевым подключением
- Ошибки в коде приложения
- Проблемы с зависимостями
- Неправильные настройки health check
- Проблемы с правами доступа
Как отладить ошибку
- Проверь логи сервиса - найди причину неудачного запуска
- Проверь ресурсы системы - убедись в достаточности CPU, памяти
- Проверь сетевые настройки - убедись в доступности портов
- Проверь конфигурацию - убедись в правильности настроек
- Проверь зависимости - убедись в доступности БД и других сервисов
Как исправить ошибку
1. Настрой правильный health check endpoint
1# Django health check endpoint
2from django.http import JsonResponse
3from django.db import connection
4
5def health_check(request):
6 try:
7 # Проверка подключения к БД
8 with connection.cursor() as cursor:
9 cursor.execute("SELECT 1")
10
11 # Проверка других зависимостей
12 return JsonResponse({
13 'status': 'healthy',
14 'database': 'connected',
15 'timestamp': time.time()
16 })
17 except Exception as e:
18 return JsonResponse({
19 'status': 'unhealthy',
20 'error': str(e)
21 }, status=500)
2. Настрой Docker health check
1# Dockerfile с health check
2FROM python:3.11-slim
3
4WORKDIR /app
5COPY requirements.txt .
6RUN pip install -r requirements.txt
7
8COPY . .
9
10# Настройка health check
11HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
12 CMD curl -f http://localhost:8000/health/ || exit 1
13
14EXPOSE 8000
15CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
3. Настрой Kubernetes health check
1# k8s-deployment.yaml
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: my-app
6spec:
7 replicas: 3
8 selector:
9 matchLabels:
10 app: my-app
11 template:
12 metadata:
13 labels:
14 app: my-app
15 spec:
16 containers:
17 - name: my-app
18 image: my-app:latest
19 ports:
20 - containerPort: 8000
21 livenessProbe:
22 httpGet:
23 path: /health/
24 port: 8000
25 initialDelaySeconds: 30
26 periodSeconds: 10
27 timeoutSeconds: 5
28 failureThreshold: 3
29 readinessProbe:
30 httpGet:
31 path: /health/
32 port: 8000
33 initialDelaySeconds: 5
34 periodSeconds: 5
35 timeoutSeconds: 3
36 failureThreshold: 3
4. Настрой мониторинг ресурсов
1#!/bin/bash
2# health-check-script.sh
3
4# Проверка CPU
5cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
6if [ "$cpu_usage" -gt 90 ]; then
7 echo "High CPU usage: ${cpu_usage}%"
8 exit 1
9fi
10
11# Проверка памяти
12memory_usage=$(free | grep Mem | awk '{printf("%.2f", $3/$2 * 100.0)}')
13if [ "$memory_usage" -gt 90 ]; then
14 echo "High memory usage: ${memory_usage}%"
15 exit 1
16fi
17
18# Проверка диска
19disk_usage=$(df / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
20if [ "$disk_usage" -gt 90 ]; then
21 echo "High disk usage: ${disk_usage}%"
22 exit 1
23fi
24
25echo "System resources OK"
5. Настрой CI/CD для health check
1# .github/workflows/deploy.yml
2name: Deploy with Health Check
3on: [push]
4
5jobs:
6 deploy:
7 runs-on: ubuntu-latest
8 steps:
9 - uses: actions/checkout@v3
10
11 - name: Deploy to staging
12 run: |
13 # Деплой приложения
14 kubectl apply -f k8s/
15
16 - name: Wait for deployment
17 run: |
18 kubectl rollout status deployment/my-app --timeout=300s
19
20 - name: Health check
21 run: |
22 # Ждем готовности подов
23 kubectl wait --for=condition=ready pod -l app=my-app --timeout=300s
24
25 # Проверяем health check endpoint
26 for i in {1..30}; do
27 if curl -f http://staging.myapp.com/health/; then
28 echo "Health check passed"
29 break
30 fi
31 echo "Health check failed, retrying..."
32 sleep 10
33 done
34
35 if [ $i -eq 30 ]; then
36 echo "Health check failed after 30 attempts"
37 exit 1
38 fi
Как мониторить подобные ошибки
- Настрой алерты на failed health checks
- Мониторь время ответа health check
- Отслеживай доступность сервисов
- Настрой мониторинг ресурсов системы
- Используй метрики для анализа проблем
FAQ
В: Как часто должен выполняться health check?
О: Обычно каждые 30-60 секунд, но зависит от критичности сервиса и требований к мониторингу.
В: Что делать, если health check падает периодически?
О: Проверь стабильность зависимостей, настрой retry логику, оптимизируй производительность.
В: Как настроить health check для микросервисов?
О: Создай отдельный endpoint для каждого сервиса, настрой circuit breaker, используй service mesh.
Лучшие практики
- Создавай легкие и быстрые health check endpoints
- Проверяй критические зависимости в health check
- Настрой правильные таймауты и интервалы
- Используй разные проверки для liveness и readiness
- Мониторь производительность health check
- Настрой автоматическое восстановление