亚马逊AWS官方博客
Mobvista 在亚马逊云上优化 EKS public IP 的实践
概述
本文介绍了 Mobvista 如何在 EKS 上优化当前使用的 Public IP,实现 34% 的成本节省,以及实施优化过程中的经验及注意事项,希望对其他大规模使用 EKS 的客户有所启发。
Mobvista 公司介绍
Mobvista 是一家领先的移动营销科技公司,总部位于中国广州。作为全球领先的第三方移动数据监测和营销科技平台之一,Mobvista 为客户提供智能营销技术平台、移动广告效果监测、用户行为分析、广告素材洞察等一系列服务。公司旗下的产品包括 Mintegral、SolorEngine、GameAnalytics、NativeX 等,是一站式智能投放平台,为各行业提供广告投放管理服务。
Mobvista 专注于为客户提供流畅、安全、高效、便捷的数据分析及决策服务,帮助企业加速数字化转型,实现更高的价值。通过与各大主流媒体平台的深度对接,Mobvista 的解决方案助力客户提升投放效率、优化广告效果,覆盖了游戏、小说、教育、金融、电商等多个行业领域。
项目背景
亚马逊云科技的 Public IP 一直是云上服务的重要组成部分,为客户提供了安全的互联网访问和通信。然而,随着云计算的快速发展,公网 IP 地址的需求也与日俱增,导致了资源的紧缺和成本的上升。为了应对这一挑战,亚马逊云科技决定从 2024 年 2 月 1 日起对 Public IP 地址收费,以更好地管理和优化资源利用。
根据收费政策,每个公网 IP 地址将按小时计费。举例来说,在美国东部(弗吉尼亚北部)地区,每小时 IPv4 公网 IP 地址的费用约为 0.005 美元,而 IPv6 IP 地址则无需付费。此外,亚马逊云科技还将对长期未使用的 Public IP 地址收取额外费用,以鼓励客户合理利用资源。
这一变革对于大量使用云计算服务的客户来说,无疑会带来一定的成本压力。面对新增的庞大开支,Mobvista 决定与亚马逊云科技团队密切合作,寻求降低成本的解决方案。
作为一家领先的互联网技术公司,Mobvista 其大部分业务应用都部署在亚马逊云科技的 Elastic Kubernetes Service(EKS)上。此次收费之前,Mobvista 都会为 EKS 中每个节点分配 Public IP 地址,导致 Public IP 地址的数量非常巨大。Mobvista 期望在 EKS 集群中大幅降低 Public IP 地址的使用量,从而显著减轻未来的云服务成本压力。
方案介绍
通过调研,Mobvista 发现大部分 EKS 的节点都可以下掉 public IP,仅在私网环境下运行。经过与亚马逊云科技团队的密切讨论,初步形成了以下四种方案。
1. 将 EKS 集群部署在新的 VPC
- 创建一个新的 VPC,并将 EKS 集群部署在私有子网。这样可以有效避免为每个 Worker 节点分配 Public IP 地址,从而大幅减少 Public IP 地址的消耗。
- 工作节点使用 VPC PrivateLink 来实现与其他亚马逊云服务的通信,PrivateLink 可以通过亚马逊的网络服务创建一个入口点,使 EKS 集群能够与其他服务(如 Amazon Elastic Container Registry、Amazon CloudWatch 等)进行私密通信,无需公共 IP 地址。在完成上述配置后,EKS 集群将完全运行在私有网络环境中,无需为每个 Node 分配公共 IP 地址,所有与其他服务的通信都将通过 Private Link 进行。
要提前创建的一些 PrivateLink Endpoint 如下[1]:Service Endpoint Amazon EC2 com.amazonaws. region-code
.ec2Amazon Elastic Container Registry (for pulling container images) com.amazonaws.
region-code
.ecr.api,com.amazonaws.
region-code
.ecr.dkr,com.amazonaws.
region-code
.s3Application Load Balancers and Network Load Balancers com.amazonaws. region-code
.elasticloadbalancingEC2 autoscalng com.amazonaws. region
.autoscalingAmazon CloudWatch Logs com.amazonaws. region-code
.logsAWS Security Token Service (required when using IAM roles for service accounts) com.amazonaws. region-code
.sts - 使用 eksctl 创建 EKS 私有子网集群:
在完成上述配置后,EKS 集群将完全运行在私有网络环境中,无需为每个 Node 分配公共 IP 地址,所有与其他服务的通信都将通过 Private Link 进行。
2. 同 VPC 下将 EKS 节点组由公网迁移到私网
此方案不需要创建新的 VPC,利用同 VPC 下已有的私有子网,将 EKS 节点组从公网转移到私网。
- 和方案一相同,首先需要在 VPC 中创建 VPC Interface Endpoint,以便 worker 节点可以无需公网 IP 就能访问其他托管服务。
- 在私网创建新的节点组:使用与公网节点组相同的配置(AMI、实例类型等)创建新的私网节点组。
- 迁移应用负载:利用 Node selector 等机制,逐步将 Pod 调度到私有节点组。 监控应用运行状况,确保迁移过程顺利。
- 删除公网节点组:从 EKS 集群中移除原有的公网节点组。
在执行上述步骤时,需要注意几点:
- 首先,确保应用程序可以在私有环境中正常运行,如果需要外部服务,可以利用 VPC Endpoint 服务或 NAT 网关。
- 其次,建议分批进行迁移,并做好回滚准备,以降低风险。
- 最后,在删除公网节点组前,仔细检查并确保所有应用已成功迁移到私有节点组。
3. 公网 VPC 原地迁移
在只有公有子网的 VPC 中,如果不想通过创建私有子网或者迁移到其他 VPC,我们可以采取以下步骤将 EKS 节点组的 Public IP 去除掉:
- 和上面两种方案一样,先创建 VPC Interface Endpoints 来连接各种亚马逊云的服务。这样可以确保节点组没有 Public IP 也可以与它们交互,无需通过公网。
- 然后,我们需要禁用公网自动分配公有 IP 的功能。登录控制台,找到 EKS 对应的公有子网,将”Auto-assign public IPv4 address”选项关闭。这样节点组新扩容的节点就不会再分配公有 IP 地址[2], 从而实现了去掉公有 IP 的效果。
- 创建新的公网节点组进行测试:新创建出来的节点将不再获取到公网 IP。在新节点组中部署测试应用,确保可以正常访问所需服务。测试完成后,利用 Node Selector 等机制,将应用逐步调度到新节点。
- 清理旧节点:从 EKS 集群中移除原有的公网节点组,并删除相关的 Auto Scaling 组和 EC2 实例。
4. 在 Launch Template 里关闭自动分配公网 IP
方案三会将整个子网的自动分配公网 IP 设置更新,如果只需要在 EKS 集群级别关闭自动分配公网,也可以在 EKS 节点组的 Launch Template 更新设置。
以下是修改 EKS 节点组启动模板以禁用自动分配公共 IP 的步骤:
- 登录亚马逊云控制台,进入 EKS 服务。选择需要修改集群的节点组, 并记下其关联的启动模板名称和版本。
- 前往 EC2 服务,找到对应的启动模板。创建一个新版本的启动模板:
- 进入网络配置的”Advanced network configuration”部分,关闭”Auto-assign public IP”选项:
- 最后,在 EKS 中选择创建新的节点组来替换旧的节点组,或更新当前节点组使用的启动模板版本,新创建出来的节点不会再分配公网 IP。
方案选择与实施
方案选择
- 在 Mobvista 实际的生产环境下,将 EKS 集群部署在新 VPC 迁移成本高,要重新更改当前网络的拓扑结构,并且部署数据库/消息队列等基础服务,对整个线上的资源设施更改较大,所以未选择第一种方案。
- 同 VPC 下将 EKS 节点组由公网迁移到私网是一个比较合理的方案,但会涉及到网段规划的问题,需要预留足够的 IP 给私网,实际生产中,部分符合条件的 VPC 采用了第二种方案。
- 第三种方案,公网 VPC 原地迁移风险可控性低,但是原来的 VPC 中一些应用未做容器化处理,直接禁用公网自动分配公有 IP 的功能前,需要对 VPC 中全部的应用进行细致的梳理,项目周期变长,梳理有遗漏的话很容易造成生产异常。如果子网中仅部署了 EKS 应用,可以采用这种方案。
- 第四种方案,在 Launch Template 里关闭自动分配公网 IP,此方法迁移成本、风险可控性与将节点组迁移到私网类似,对 VPC 网段规划情况没有要求,是适配性最高的方案。
最终,生产环境中,优先选择从公网迁移私网的方案,其次选择在 Launch Template 里关闭自动分配公网 IP 的方案。Mobvista 大部分的 EKS 集群是通过 Terraform 管理生命周期,在生产环境中只需要更改“associate_public_ip_address”参数为 false:
方案实施过程中注意事项
- 开启 EKS 集群的 private access 模式。由于 workder node 上不能继续与公网通讯,所以要开启 EKS 的 private access 功能,这样 worker node 可以使用 private IP 访问 API server。
具体操作如下:
- 在 EKS 控制台上启用私有访问(Private Access)功能。这样可以确保工作节点与 API server endpoint 通过 Private IP 进行访问。
- 如果管理员需要从其他位置访问 EKS,则使用 Public and private 模式,同时仅允许特定的公网 IP 地址或网段访问。这种方式可以确保关键的集群管理操作只能通过可信任的渠道进行:
- 因为 Amazon ECR 使用 S3 来存储镜像。当工作节点从 ECR 下载镜像时,它们先访问 Amazon ECR 获取镜像清单,然后再访问 Amazon S3 来下载实际的镜像层,所以中间镜像主体数据都是通过 S3 的 Gateway Endpoint,这部分流量费用是免费的[3]。
- 在 VPC 创建 S3 gateway endpoint 的时候,DNS 解析会中断几秒,如果此时其他业务正在上传文件到 S3,会遇到上传失败,建议在业务低峰期进行这个操作。
- Public IP 也在以在 Cost Explorer 给它打标签,以按团队/项目等维度区分用量。对于 EC2 上自动分配的 Public IP,如果它的 ENI 上打了标签,则在 cost explorer 里会显示出来。
如果想为 EKS 集群下的节点的 Public IP 批量打标签,可以在启动模板里开启:
Public IP 优化后的收益
1. 成本
这项 Public IP 优化工作从深入分析公网 IP 使用情况开始,运维团队发现大量的公有 IP 可以被优化。然后 Mobvista 制定了一套基于 Kubernetes 的 IP 优化方案,通过不断的迭代,不仅大幅降低了公网 IP 的使用成本,还提高了基础设施的灵活性和可扩展性,为业务发展提供了强有力的支持。通过在 EKS 上优化当前使用的公网 IP,目前 Mobvista 成功实现了 34% 的成本节省。
2. 安全
在 EKS 上优化公网 IP 的使用,不仅实现了成本节省,同时也带来了显著的安全收益。
作为一家处理大量移动广告和用户数据的公司,确保数据安全性对 Mobvista 至关重要。Public IP 会增加被攻击者利用的风险,通过优化公网 IP 的使用,将集群内的工作负载与公网隔离,进一步减少了潜在的攻击面。
此外,Mobvista 还加强了对 IP 使用的监控和审计,从而确保数据的机密性和完整性。这些措施不仅提高了 Mobvista 的整体安全防护能力,也增强了客户和合作伙伴对其服务的信心。
总结与展望
Mobvista 作为领先的移动广告和大数据服务商,始终致力于提高运维效率和降低成本。该成果凸显了 Mobvista 在云原生技术和成本优化方面的卓越能力,也必将为其他企业在公有云上构建高效、经济的基础架构提供借鉴和启发。展望未来,Mobvista 将与亚马逊云科技继续探索更多创新实践,为客户提供领先的移动营销和大数据解决方案。
[1] https://docs.aws.amazon.com/vpc/latest/privatelink/aws-services-privatelink-support.html
[2] https://aws.amazon.com/cn/blogs/containers/upcoming-changes-to-ip-assignment-for-eks-managed-node-groups/
[3] https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html