Как улучшить производительность Google Load Balancer с помощью GKE over HTTPS? - PullRequest
1 голос
/ 31 октября 2019

Я перевожу Heroku на облачную платформу Google, и в настоящее время я использую кластер GKE с 3 узлами n1-highcpu-4, чтобы проверить настройки и мое приложение. Кластер был построен с использованием конфигурации по умолчанию (за исключением включенных вытесняемых узлов). Чтобы создать Ingres, LB (с балансировкой NEG) и использовать SSL-сертификат, управляемый Google, я внимательно следовал этим инструкциям:

https://cloud.google.com/kubernetes-engine/docs/concepts/ingress https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#create_service

Всеработал безупречно из коробки, пока я не начал нагрузочное тестирование.

Наше веб-приложение собирает данные с датчиков, отправляемых на него через HTTP (S) POST. Я использовал loader.io для тестирования, и этот кластер обрабатывал примерно 30 000 запросов в секунду с временем отклика менее 200 мс по HTTP. Однако, когда я переключился на HTTPS и повторил тестирование, производительность резко упала до менее чем 4 тыс. Запросов в секунду с временем отклика 1.7 с-4.

Я пытался запускать больше модулей, добавлять новые узлы;отправлять больше запросов в LB с loader.io;настроить время ожидания активности / простоя;несколько твиков ядра, но ни один из них не помог преодолеть барьеры 4K RPS. Даже замена приложения контейнером nginx и тестирование его статической страницы приветствия дали те же результаты.

Метрики Stackdriver GCLB показывают задержку внешнего интерфейса около 10 мс и 8-секундную задержку. Однако метрики из моего приложения показывают, что запросы обычно занимают от 20 до 700 мс.

ingress.yml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: collector-non-prod
  annotations:
    kubernetes.io/ingress.global-static-ip-name: non-prod-cluster-ip
#    kubernetes.io/ingress.allow-http: "true"
    networking.gke.io/managed-certificates: "collector-dev,collector-staging"
spec:
  rules:
    - host: events-dev.xxx.dev
      http:
        paths:
          - backend:
              serviceName: collector-dev
              servicePort: 80
    - host: events-staging.xxx.dev
      http:
        paths:
          - backend:
              serviceName: collector-staging
              servicePort: 80

service.yml

apiVersion: v1
kind: Service
metadata:
  name: collector-dev
  labels:
    environment: dev
  annotations:
    cloud.google.com/neg: '{"ingress": true}'
    beta.cloud.google.com/backend-config: '{"ports": {"80":"backend-config-non-prod"}}'
spec:
  type: NodePort
  selector:
    app: collector
    environment: dev
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

backend-config.yml просто так:

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: backend-config-non-prod
spec:
  timeoutSec: 60
  connectionDraining:
    drainingTimeoutSec: 60

Буду признателенмного рекомендаций по улучшению производительности HTTPS и уменьшению задержки запросов, или помощи в дальнейших исследованиях. Я застрял на данный момент :( Спасибо!

...