Я перевожу 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 и уменьшению задержки запросов, или помощи в дальнейших исследованиях. Я застрял на данный момент :( Спасибо!