Что такое Service health check failed?

Ошибка Service health check failed возникает, когда проверка состояния сервиса в CI/CD пайплайне завершается неудачно, что указывает на проблемы с работоспособностью приложения.

Причины возникновения

  • Сервис не запустился после деплоя
  • Проблемы с конфигурацией приложения
  • Недостаточно ресурсов (CPU, память, диск)
  • Проблемы с сетевым подключением
  • Ошибки в коде приложения
  • Проблемы с зависимостями
  • Неправильные настройки health check
  • Проблемы с правами доступа

Как отладить ошибку

  1. Проверь логи сервиса - найди причину неудачного запуска
  2. Проверь ресурсы системы - убедись в достаточности CPU, памяти
  3. Проверь сетевые настройки - убедись в доступности портов
  4. Проверь конфигурацию - убедись в правильности настроек
  5. Проверь зависимости - убедись в доступности БД и других сервисов

Как исправить ошибку

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
  • Настрой автоматическое восстановление