Ловушка 6: При горизонтальном масштабировании (HPA) количество реплик меняется динамически. Приложение не должно полагаться на конкретный под — любой запрос может попасть на любую реплику.
У «ТрейдБот» сервис аналитики хранил промежуточные вычисления в памяти процесса. При масштабировании с 2 до 5 реплик пользователи получали разные данные в зависимости от того, на какой под попал запрос. Мы вынесли все промежуточные результаты в Redis и сконфигурировали HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: analytics-service-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: analytics-service
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Ловушка 7: Приложение за Ingress (nginx) работает по HTTP внутри кластера, но снаружи — HTTPS. Если приложение генерирует абсолютные URL с http://, браузер получит mixed content или бесконечный редирект.
Для «ТрейдБот» мы настроили доверенные прокси в каждом фреймворке:
# Python FastAPI — корректная работа за reverse proxy
from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware
app = FastAPI(root_path="/api")
app.add_middleware(
TrustedHostMiddleware,
allowed_hosts=["tradebot.ru", "*.tradebot.ru"]
)
# uvicorn запуск с proxy headers
# CMD ["uvicorn", "app:app", "--proxy-headers", "--forwarded-allow-ips", "*"]
Ingress конфигурация:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tradebot-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
tls:
- hosts:
- tradebot.ru
- api.tradebot.ru
secretName: tradebot-tls
rules:
- host: api.tradebot.ru
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-gateway
port:
number: 8080
Оставить комментарий