阿里云资源编排服务(ROS)为我们快速搭建和整合云计算资源环境提供一个低成本、标准化的方案。基于ROS提供的能力,我们所要做的就是将所需的资源以资源模板的形式进行定义,然后就可实现对所定义云资源的快速生产。除此之外,ROS将应用构建和资源释放的过程也进行了简化。
本文将主要介绍 VPC 的网络机制以及利用 ROS 在 VPC 网络环境下快速交付应用的原理和机制。本文将主要从如下两个方面进行介绍:
- VPC 环境的网络机制
- 基于 Ansible 快速交付应用
VPC 环境的网络机制
专有网络VPC(Virtual Private Cloud),帮助用户基于阿里云构建出一个隔离的网络环境。在这个网络环境中,您可以完全自己配置网络,包括选择自有IP地址范围、划分网段、配置路由表和网关等。此外对于应用开发者而言,VPC为应用提供了一个与外界隔离的、安全的运行环境。
下图是 VPC 的网络架构图:
由图可知,一个典型的 VPC 网络环境,包括一个VPC、虚拟路由器(VRouter)、虚拟交换机(VSwitch)、安全组(Security Group)和云服务器(ECS)。
虚拟路由器是VPC网络中的重要功能组件,它可以连接VPC内的各个交换机,同时也是连接VPC与其他网络的网关设备。每个路由器中维护一张路由表,它会根据具体的路由条目的设置来转发网络流量。
虚拟交换机为VPC网络提供基础网络设备,它连接不同的ECS。在VPC网络内创建ECS时,必须指定云产品实例所在的交换机。
安全组类似虚拟防火墙功能,用于设置单个或多个 ECS 实例的网络访问控制,它是重要的安全隔离手段。在创建 ECS 实例时,必须选择一个安全组。您还可以添加安全组规则,对该安全组下的所有 ECS 实例的出方向和入方向进行网络控制。
一个 VPC 网络环境通过虚拟路由器划分网段、配置路由表和网关来管理多个虚拟交换机,而每个虚拟交换机又连接着不同的ECS,除此之外,VPC中加入安全组,帮助用户更好的提高网络控制的灵活度。
下一跳
VPC 在帮助用户构建一个隔离的网络环境的同时,带来的问题便是 VPC环境下的 ECS 实例不能直接访问公网。对于一些特定的情况,ECS 实例需要访问公网去获取一些资源,此时一种做法是给需要访问公网的ECS实例申请弹性IP,但当面对多个 ECS 实例需要同时访问公网的需求时,这种做法的并不可行,另一种做法就是以SNAT网关访问公网的方式为 VPC 网络环境设置下一跳,如下图所示 :
在VPC环境下申请一台额外的ECS实例并为其绑定EIP,然后配置这台ECS实例的iptables,最后在指定的VPC 网络的路由表中添加一条下一跳是这台 ECS 的路由项,此时这台 ECS 即可做为指定 VPC 网络的SNAT 网关,并且 VPC 下的其他 ECS 均可通过该网关实现对公网的访问。
对于大多数的开发者而言,他们希望所开发的应用可以方便的从公网上获取资源,但又不希望应用及其运行环境完全暴露在公网下,下一跳的出现正好解决了这个问题,它不仅满足了利用较少的EIP实现大量ECS同时访问公网的需求,而且没有破环 VPC 隔离和安全的特性。
额外 EIP
下一跳机制完美的解决了 VPC 环境下 ECS 访问外网的问题,但是对于一个应用而言,最终是能够被外界用户访问到,在VPC环境下,部署在ECS上的应用外网是访问不到的,为此,需要为应用申请一个额外的 EIP,以解决公网访问 VPC 环境下应用的问题。
下面将介绍在 VPC 网络环境构建一个连接 SLB 和 RDS 资源的应用,如下图所示:
上图显示在VPC下构建一个SLB资源,然后在SLB下连接了运行应用的ECS实例,而ECS向下又连接了一个RDS。在应用部署过程中,ECS实例可通过下一跳实现对外网资源的访问和获取。应用部署完成后,外界用户如何访问已搭建的应用呢?此时就需要为SLB配置一个额外的EIP,外界用户通过额外的EIP或者该EIP对应的域名将请求发送到SLB,SLB收到请求后根据监听和分发机制,将请求进一步转发给某台ECS,ECS根据请求内容,获取相应资源后,作出响应。
基于 Ansible 快速交付应用
到目前为止,用户基于 ROS 交付应用可以有两种途径:一种是通过ROS构建好资源,然后登陆到ECS上手动搭建应用运行环境,另一种是利用Cloud-Init机制,将构建应用的步骤编写成脚本,然后将脚本随着ECS资源的构建发送到ECS的User-Data中,Cloud-Init执行User-Data 以完成应用的构建。这两种方式随着ECS数量的增多,操作成本也会相应的增大。那么如何在降低构建应用操作成本的同时,实现对应用的快速交付呢?这里就要使用自动化管理工具Ansible,如下图所示:
用户首先在一台Master机器上安装 Ansible,然后在这台 Master 机器上通过python调用ROS API完成 IaaS 资源的的生产,并用生产出来的 ECS 的登录信息更新 Ansible 的 Inventory 文件,最后根据所要部署的应用,从 Git 上获取相应的 playbook 或者用户可根据应用部署过程自己编写 playbook,进而通过执行playbook完成应用的部署。这种方式带来的最大的好处是,不论所要部署应用的 ECS 数量有多少,在应用部署时只需调用一次命令即可完成所有的部署工作,大大降低的了应用部署的复杂度。
基于 Ansible 快速搭建Redis集群
为了更好的阐述 Ansible 快速交付应用的功能,下面将介绍在 VPC 网络环境下基于 Ansible 快速搭建Redis集群(一主两备)的交付过程,如下图所示:
首先在安装有 Ansible 的 Master 机器上通过 python 调用 ROS API 生成三台ECS用于搭建 Redis 集群,然后根据ECS的登录信息更新 Ansible 的 Inventory 文件,并生成搭建 Redis 的 playbook 执行文件,接着从 Git 上获取搭建 Redis 的 Playbook,最后,在 Ansible 服务器上运行 playbook 执行文件,即可完成Redis集群的搭建。
值得注意的是,根据 playbook 执行文件的设置,用户可以搭建只有一台 Master 的 Redis,也可以搭建拥有一台 Master(主服务器)、两台 Slave(从服务器)的标准配置的 Redis 集群,并且为了提高Redis 集群的高可用性,可以在搭建 Redis 集群后为其部署高可用解决方案 Sentinel。所有的这些工作,Ansible 可以实现一键部署,大大提高了工作效率。