Что такое Ingress 502 Bad Gateway?
Ошибка Ingress 502 Bad Gateway
возникает, когда Ingress controller не может подключиться к backend сервисам.
Причины возникновения
- Backend сервис недоступен
- Проблемы с конфигурацией Ingress
- Неправильные порты или пути
- Проблемы с сетью
- Ошибки в backend приложении
- Проблемы с SSL/TLS
Как отладить ошибку
- Проверь backend сервис -
kubectl get svc
- Проверь endpoints -
kubectl get endpoints
- Проверь логи Ingress -
kubectl logs -n ingress-nginx
- Проверь конфигурацию -
kubectl describe ingress
- Проверь сетевую связность -
kubectl exec pod-name -- curl service
Как исправить ошибку
1. Проверь и исправь backend сервис
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
- Тестируй конфигурацию перед деплоем