Что такое Service Unavailable?

Ошибка Service Unavailable (503) возникает, когда сервис в Kubernetes недоступен или не может обработать запросы.

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

  • Поды не готовы (Readiness probe failed)
  • Недостаточно реплик
  • Проблемы с сетью
  • Ошибки в приложении
  • Проблемы с конфигурацией Service
  • Высокая нагрузка на сервис

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

  1. Проверь статус подов - kubectl get pods
  2. Проверь Service - kubectl get svc
  3. Проверь Endpoints - kubectl get endpoints
  4. Проверь логи приложения - kubectl logs pod-name
  5. Проверь сетевую связность - kubectl exec pod-name -- curl service

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

1. Проверь и исправь readiness probe

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: my-app
 5spec:
 6  containers:
 7  - name: app
 8    image: nginx:latest
 9    readinessProbe:
10      httpGet:
11        path: /health
12        port: 8080
13      initialDelaySeconds: 5
14      periodSeconds: 5
15      timeoutSeconds: 3
16      failureThreshold: 3

2. Увеличь количество реплик

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: my-app
 5spec:
 6  replicas: 3
 7  selector:
 8    matchLabels:
 9      app: my-app
10  template:
11    metadata:
12      labels:
13        app: my-app
14    spec:
15      containers:
16      - name: app
17        image: nginx:latest

3. Настрой правильный Service

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: my-app-service
 5spec:
 6  selector:
 7    app: my-app
 8  ports:
 9  - protocol: TCP
10    port: 80
11    targetPort: 8080
12  type: ClusterIP

4. Исправь проблемы с сетью

1# Проверь DNS
2kubectl exec pod-name -- nslookup my-app-service
3
4# Проверь связность
5kubectl exec pod-name -- curl -v my-app-service:80
6
7# Проверь порты
8kubectl exec pod-name -- netstat -tulpn

5. Настрой health check endpoint

 1# Пример для Python/Flask
 2from flask import Flask
 3
 4app = Flask(__name__)
 5
 6@app.route('/health')
 7def health_check():
 8    return {'status': 'healthy'}, 200
 9
10@app.route('/ready')
11def ready_check():
12    # Проверь зависимости
13    if check_database() and check_redis():
14        return {'status': 'ready'}, 200
15    return {'status': 'not ready'}, 503

6. Используй Circuit Breaker

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  name: my-app-ingress
 5  annotations:
 6    nginx.ingress.kubernetes.io/circuit-breaker: "true"
 7spec:
 8  rules:
 9  - host: my-app.example.com
10    http:
11      paths:
12      - path: /
13        pathType: Prefix
14        backend:
15          service:
16            name: my-app-service
17            port:
18              number: 80

Как мониторить подобные ошибки

  • Настрой алерты на 503 ошибки
  • Мониторь доступность сервисов
  • Проверяй метрики response time
  • Используй health checks

FAQ

В: Что делать, если readiness probe постоянно падает?

О: Проверь endpoint приложения, увеличь timeout, убедись в правильности пути.

В: Как отладить проблемы с Service?

О: Проверь selector, убедись в правильности портов, проверь Endpoints.

В: Что делать с высокой нагрузкой?

О: Увеличь количество реплик, настрой HPA, оптимизируй приложение.

Лучшие практики

  • Всегда используй readiness и liveness пробы
  • Настрой правильные лимиты ресурсов
  • Используй мониторинг и алерты
  • Тестируй отказоустойчивость
  • Документируй зависимости сервисов