Как повысить производительность Google Load Balancer с помощью GKE через HTTPS?
Я перемещаю Heroku на Google Cloud Platform, и в настоящее время я использую кластер GKE с 3 узлами n1-highcpu-4 для тестирования настройки и моего приложения. Кластер был построен с использованием конфигурации по умолчанию (за исключением вытесняемых узлов On). Чтобы создать Ingres, LB (с балансировкой NEG) и использовать SSL-сертификат, управляемый Google, я внимательно следил за этими руководствами:
https://cloud.google.com/kubernetes-engine/docs/concepts/ingresshttps://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancerhttps://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing
Все работало безупречно, пока я не начал нагрузочное тестирование.
Наше веб-приложение собирает данные с датчиков, отправляемые им через HTTP(S) POST. Я использовал loader.io для тестирования, и этот кластер обрабатывал примерно 30 тысяч запросов в секунду с временем отклика менее 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 и уменьшению задержки запросов или за помощь в дальнейших исследованиях. Я застрял в данный момент:(Спасибо!