亚马逊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

  1. 创建一个新的 VPC,并将 EKS 集群部署在私有子网。这样可以有效避免为每个 Worker 节点分配 Public IP 地址,从而大幅减少 Public IP 地址的消耗。
  2. 工作节点使用 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.ec2
    Amazon Elastic Container Registry (for pulling container images)

    com.amazonaws.region-code.ecr.api,

    com.amazonaws.region-code.ecr.dkr,

    com.amazonaws.region-code.s3

    Application Load Balancers and Network Load Balancers com.amazonaws.region-code.elasticloadbalancing
    EC2 autoscalng com.amazonaws.region.autoscaling
    Amazon CloudWatch Logs com.amazonaws.region-code.logs
    AWS Security Token Service (required when using IAM roles for service accounts) com.amazonaws.region-code.sts
  3. 使用 eksctl 创建 EKS 私有子网集群:
    apiVersion: eksctl.io/v1alpha5
    kind: ClusterConfig
    metadata:
      name: prod
      region: us-east-1   
    managedNodeGroups:
      - name: ng-1
        instanceType: m5.xlarge
        desiredCapacity: 2
        privateNetworking: true
    vpc:
      subnets:
        private:
          us-east-1a:
            id: "subnet-xxxx" 
          us-east-1b:
            id: "subnet-xxxx"
          us-east-1c:
            id: "subnet-xxxx"
      clusterEndpoints:
        publicAccess:  true
        privateAccess: true

在完成上述配置后,EKS 集群将完全运行在私有网络环境中,无需为每个 Node 分配公共 IP 地址,所有与其他服务的通信都将通过 Private Link 进行。

2. 同 VPC 下将 EKS 节点组由公网迁移到私网

此方案不需要创建新的 VPC,利用同 VPC 下已有的私有子网,将 EKS 节点组从公网转移到私网。

  1. 和方案一相同,首先需要在 VPC 中创建 VPC Interface Endpoint,以便 worker 节点可以无需公网 IP 就能访问其他托管服务。
  2. 在私网创建新的节点组:使用与公网节点组相同的配置(AMI、实例类型等)创建新的私网节点组。
  3. 迁移应用负载:利用 Node selector 等机制,逐步将 Pod 调度到私有节点组。 监控应用运行状况,确保迁移过程顺利。
  4. 删除公网节点组:从 EKS 集群中移除原有的公网节点组。

在执行上述步骤时,需要注意几点:

  • 首先,确保应用程序可以在私有环境中正常运行,如果需要外部服务,可以利用 VPC Endpoint 服务或 NAT 网关。
  • 其次,建议分批进行迁移,并做好回滚准备,以降低风险。
  • 最后,在删除公网节点组前,仔细检查并确保所有应用已成功迁移到私有节点组。

3. 公网 VPC 原地迁移

在只有公有子网的 VPC 中,如果不想通过创建私有子网或者迁移到其他 VPC,我们可以采取以下步骤将 EKS 节点组的 Public IP 去除掉:

  1. 和上面两种方案一样,先创建 VPC Interface Endpoints 来连接各种亚马逊云的服务。这样可以确保节点组没有 Public IP 也可以与它们交互,无需通过公网。
  2. 然后,我们需要禁用公网自动分配公有 IP 的功能。登录控制台,找到 EKS 对应的公有子网,将”Auto-assign public IPv4 address”选项关闭。这样节点组新扩容的节点就不会再分配公有 IP 地址[2], 从而实现了去掉公有 IP 的效果。
  3. 创建新的公网节点组进行测试:新创建出来的节点将不再获取到公网 IP。在新节点组中部署测试应用,确保可以正常访问所需服务。测试完成后,利用 Node Selector 等机制,将应用逐步调度到新节点。
  4. 清理旧节点:从 EKS 集群中移除原有的公网节点组,并删除相关的 Auto Scaling 组和 EC2 实例。

4. 在 Launch Template 里关闭自动分配公网 IP

方案三会将整个子网的自动分配公网 IP 设置更新,如果只需要在 EKS 集群级别关闭自动分配公网,也可以在 EKS 节点组的 Launch Template 更新设置。

以下是修改 EKS 节点组启动模板以禁用自动分配公共 IP 的步骤:

  1. 登录亚马逊云控制台,进入 EKS 服务。选择需要修改集群的节点组, 并记下其关联的启动模板名称和版本。
  2. 前往 EC2 服务,找到对应的启动模板。创建一个新版本的启动模板:
  3. 进入网络配置的”Advanced network configuration”部分,关闭”Auto-assign public IP”选项:
  4. 最后,在 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:

module "eks-nodegroup" {
  source  = "terraform-aws-modules/eks/aws//modules/eks-managed-node-group"
  version = "v20.8.2"

  name = var.nodegroup_name

  network_interfaces = [
    {
      associate_public_ip_address = false
      delete_on_termination       = true
    }
  ]

  min_size     = var.min_size
  max_size     = var.max_size
  desired_size = var.desired_size

  instance_types = var.instance_types

  labels = var.labels
  tags = var.tags
}

方案实施过程中注意事项

  1. 开启 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 地址或网段访问。这种方式可以确保关键的集群管理操作只能通过可信任的渠道进行:
  1. 因为 Amazon ECR 使用 S3 来存储镜像。当工作节点从 ECR 下载镜像时,它们先访问 Amazon ECR 获取镜像清单,然后再访问 Amazon S3 来下载实际的镜像层,所以中间镜像主体数据都是通过 S3 的 Gateway Endpoint,这部分流量费用是免费的[3]。
  2. 在 VPC 创建 S3 gateway endpoint 的时候,DNS 解析会中断几秒,如果此时其他业务正在上传文件到 S3,会遇到上传失败,建议在业务低峰期进行这个操作。
  3. 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.thinkwithwp.com/vpc/latest/privatelink/aws-services-privatelink-support.html
[2] https://thinkwithwp.com/cn/blogs/containers/upcoming-changes-to-ip-assignment-for-eks-managed-node-groups/
[3] https://docs.thinkwithwp.com/AmazonECR/latest/userguide/vpc-endpoints.html

本篇作者

孔平凡

亚马逊云技术客户经理,在加入亚马逊之前就职于百度,具有多年广告开发经验。目前致力于容器和 Serverless 相关技术的研究。

胡劲斌

汇量科技资深运维工程师,10 年+运维经验,目前专注于运维自动化建设。

朱修磊

亚马逊云科技技术客户经理,负责企业级客户的架构和成本优化、技术支持等工作,拥有多年的产品研发、技术布道、IT 架构设计和运维经验。