我在 Google Kubernetes Engine 上托管了一个不算小的集群(2 个 e2 标准节点),其中有几个 Web 服务相互通信。该架构由以下部分组成:
- 2 个 Cloud SQL 实例,托管在 GCP 上
- 1 个 Deployment 和 1 个 Statefulset,各 1 个副本
- 安装 Nginx Ingress Controller,通过 HTTPS 公开两个应用程序(deploy 和 sts)
- 一些内部工具,例如 CertManager 等
这两个应用通过内部 k8s DNS 系统相互通信,它们通过外部 IP 连接到相关的 Cloud SQL 实例,并向 APNS 和 Firebase 发送电子邮件和推送通知。它们公开 RESTful API 供我的移动应用使用。
在账单明细中,我可以看到 Nginx 入口控制器每月产生 1.5+ TB 的出口流量,我无法解释。我预计出口流量仅包含 SQL 连接以及我的 pod 发送的电子邮件消息和推送通知,因为这是集群中实际产生的唯一流量。我还可以看到 2 个应用程序消耗的出口流量,但这两个值的总和比 Nginx 消耗的流量小得多。
现在我想知道 Google 是否还向我收取我的 pod 对使用 API 的移动应用程序生成的 HTTP 响应的费用,因为我看不出我的集群如此昂贵的其他原因。
答案1
将此答案发布为社区维基,以获得更好的可见性,并为问题下的评论添加一些背景信息。
用户 @mdaniel 发布了其中一种可能的解决方案:
您是否尝试过提高 nginx 的日志详细程度,以确保没有人将其用作代理服务器?1.5TB 的流量非常大
其他解决方案可以使用原生 GCP 工具来分析流量流,例如:
其他资源VPC Flow Logs
:
假如说:
- 其中有一个集群
VPC
已Flow logs
启用 - 正在
pod
产生流量的
去:
GCP UI
->VPC Network
->Subnet that GKE cluster resides in
->View flow logs
此日志的过滤器应如下:
logName:("projects/PROJECT_NAME/logs/compute.googleapis.com%2Fvpc_flows") AND resource.labels.subnetwork_id:(SUBNETWORK_ID)
值
PROJECT_NAME
和SUBNETWORK_ID
被替换为占位符
您可以使用以下参数来缩小流量:
jsonPayload.bytes_sent (<,>) VALUE
jsonPayload.connection.dest_ip="IP_ADDRESS"
jsonPayload.connection.src_ip="IP_ADDRESS"
您还可以创建一个下沉并导出此日志以供进一步检查:
- BigQuery
- 云存储(存储桶)-下载并使用脚本提取数据