Высокая задержка при использовании gunicorn с django в EKS (Kubernetes) и ELB - PullRequest
0 голосов
/ 02 июня 2019

Я использую DjangoRestAPI в Kubernetes и замечаю очень низкую производительность, когда использую gunicorn в том же развертывании для обслуживания DjangoRestAPI. В среднем для простого HttpResponse требуется ~ 6000 мс. Без gunicorn, обслуживающего python manage.py runserver, тот же запрос займет всего 50 мс.

Вот мое развертывание для djangoRestAPI и gunicorn с помощью команды gunicorn api.wsgi --bind 0.0.0.0:8000

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: djangoapi
    type: web
  name: djangoapi
  namespace: "default"
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: djangoapi
        type: web
    spec:
      containers:
      - name: djangoapi
        image: <repo>/app:v0.9a
        imagePullPolicy: Always
        args:
        - gunicorn
        - api.wsgi
        - --bind
        - 0.0.0.0:8000
        envFrom:
        - configMapRef:
            name: djangoapi-config
        ports:
        - containerPort: 8000
      imagePullSecrets:
        - name: regcred
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: djangoapi-svc
  namespace: "default"
  labels:
    app: djangoapi
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 8000
  selector:
    app: djangoapi
    type: web
  type: NodePort  

Если я заменю аргументы на следующие, время отклика сразу же уменьшится до 50 мс

        - python
        - manage.py
        - runserver
        - 0.0.0.0:8000

На всякий случай, вот мои файлы yaml для входа:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-ingress
  namespace: "default"
  labels:
    app: api-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:eu-west-1:<>:certificate/<>
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: '15'
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: '8'
    alb.ingress.kubernetes.io/healthy-threshold-count: '2'
    alb.ingress.kubernetes.io/healthcheck-path: '/'
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTPS
    alb.ingress.kubernetes.io/success-codes: "200"
spec:
  rules:
  - host: test.mydomain.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: echoheaders
          servicePort: 80
  - host: dev.mydomain.com
    http:
      paths:
      - path: /*
        backend:
          serviceName: djangoapi-svc
          servicePort: 8000

и мой alb-ingress-контроллер основан на https://github.com/kubernetes-sigs/aws-alb-ingress-controller

Мне интересно, неверно ли то, что я использую Gunicorn, или есть какой-то другой способ решить проблему с задержкой.

...