google-cloud-platform - 如何使用 GKE over HTTPS 提高 Google 负载均衡器的性能?
问题描述
我正在将 Heroku 迁移到 Google Cloud Platform,目前我正在运行 3 个 n1-highcpu-4 节点 GKE 集群来测试设置和我的应用程序。集群是使用默认配置构建的(抢占式节点除外)。为了创建 Ingres、LB(使用 NEG 平衡)并使用 Google 管理的 SSL 证书,我严格遵循了以下指南:
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
在我开始负载测试之前,一切都可以完美地开箱即用。
我们的 Web 应用程序正在从传感器收集数据,通过 HTTP(S) POST 发送给它。我使用 loader.io 进行测试,这个集群每秒处理大约 30k 个请求,通过 HTTP 的响应时间不到 200 毫秒。然而,当我切换到 HTTPS 并重复测试时,性能急剧下降到不到 4k RPS,响应时间为 1.7s-4s。
我尝试运行更多 pod,添加新节点;从 loader.io 向 LB 发送更多请求;配置保持活动/空闲超时;一些内核调整,但没有一个有助于跨越 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 性能和减少请求延迟或帮助我进一步调查的任何建议,我将不胜感激。我现在被困住了:(谢谢!
解决方案
推荐阅读
- c++ - 即使看起来更好的匹配,也不会考虑重载
- kubernetes - 如何通过 https 访问 Kubernetes 网站
- bash - 超时并移至脚本中的下一个请求
- r - 如何根据R中的重叠序列有效地合并两个数据表?
- css - 让您的 chrome 扩展的样式表覆盖网站的 CSS
- mysql - laravel 中的嵌套查询
- groovy - JMeter Groovy:打印以登录类(静态)(在静态范围内找到了明显的变量“日志”,但不引用本地...)
- embedded-linux - 如何覆盖 yocto 配方中定义的任务顺序?
- dart - 是否有任何函数可以从 DART 中的给定字符串中选择随机字符
- google-bigquery - 如何在 BigQuery 中安排脚本?