Что такое Ingress 502 Bad Gateway?

Ошибка Ingress 502 Bad Gateway возникает, когда Ingress controller не может подключиться к backend сервисам.

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

  • Backend сервис недоступен
  • Проблемы с конфигурацией Ingress
  • Неправильные порты или пути
  • Проблемы с сетью
  • Ошибки в backend приложении
  • Проблемы с SSL/TLS

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

  1. Проверь backend сервис - kubectl get svc
  2. Проверь endpoints - kubectl get endpoints
  3. Проверь логи Ingress - kubectl logs -n ingress-nginx
  4. Проверь конфигурацию - kubectl describe ingress
  5. Проверь сетевую связность - kubectl exec pod-name -- curl service

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

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

 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

2. Настрой правильный Ingress

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

3. Проверь readiness backend сервиса

 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    livenessProbe:
16      httpGet:
17        path: /health
18        port: 8080
19      initialDelaySeconds: 15
20      periodSeconds: 10

4. Настрой SSL/TLS

 1apiVersion: v1
 2kind: Secret
 3metadata:
 4  name: tls-secret
 5type: kubernetes.io/tls
 6data:
 7  tls.crt: <base64-encoded-cert>
 8  tls.key: <base64-encoded-key>
 9---
10apiVersion: networking.k8s.io/v1
11kind: Ingress
12metadata:
13  name: my-app-ingress
14spec:
15  tls:
16  - hosts:
17    - my-app.example.com
18    secretName: tls-secret
19  rules:
20  - host: my-app.example.com
21    http:
22      paths:
23      - path: /
24        pathType: Prefix
25        backend:
26          service:
27            name: my-app-service
28            port:
29              number: 80

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

 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
 9
10# Проверь логи Ingress controller
11kubectl logs -n ingress-nginx deployment/ingress-nginx-controller

6. Настрой 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('/')
11def main():
12    return {'message': 'Hello World'}, 200
13
14if __name__ == '__main__':
15    app.run(host='0.0.0.0', port=8080)

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

  • Мониторь доступность backend сервисов
  • Настрой алерты на 502 ошибки
  • Проверяй метрики Ingress controller
  • Логируй все сетевые ошибки

FAQ

В: Что делать, если backend сервис недоступен?

О: Проверь статус подов, readiness пробы, логи приложения и сетевую связность.

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

О: Проверь валидность сертификата, правильность Secret и конфигурацию Ingress.

В: Что делать с проблемами маршрутизации?

О: Проверь конфигурацию Ingress, пути, хосты и backend сервисы.

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

  • Всегда используй readiness пробы
  • Настрой правильные health checks
  • Мониторь доступность сервисов
  • Используй SSL/TLS для production
  • Тестируй конфигурацию перед деплоем