【OpenStack】在本地OpenStack中创建一个应用及其网络
@TOC
推荐超级课程:
现在我们对平台的外观和运作有了更清晰的认识,我们可以开始在其基础上构建一些东西。但我们要建造什么?对我来说,为了构建和演示OpenStack的一些特性,最容易的方法是构建一个简单的Web应用程序。
应用程序设计
我在这篇文章中的目标是了解OpenStack的基本组件,以及如何在其基础上创建项目,并希望能直接与其中一些组件进行交互。为了实现我们的目标,我可以想到一些基本的项是必需的。
- Web服务:这将是一个小型的Python应用程序,用于托管简单的UI和API。这部分将在将来的文章中编写。
- 代理:这是处理请求黑名单和身份验证的安全层。这也可以是一个编码组件,但在本例中我将使用Caddy 。
- 网络:这些是各种网络组件,将为我们在项目中设置的实例提供访问权限。
基本结构是在同一网络上拥有服务和代理实例,同时通过一个路由器为我们的代理提供访问应用程序。
如果您来自先前的文章,您会很快注意到这种设置与示例Web应用程序配置 非常相似,但缺少一些值得注意的组件,比如负载均衡器和多个网络/安全组。这是为了保持对基本结构的关注。我可以制作其他文章,介绍如何扩展OpenStack应用程序以进行水平/垂直扩展和集成其他组件。如果您希望出现这种情况,请给我留言,我可以着手进行后续系列的工作。
对于这个练习,我们需要执行以下操作:
- 创建一个新项目和用户
- 创建网络和连接
在下一篇文章中,我们将创建实例镜像并部署它们,使用我们在这里构建的东西并测试访问。
创建项目
在整个OpenStack中,处理基于角色的逻辑(项目、用户、角色、域等)都是通过Keystone Identity Management 处理的。这个主题可能会相当冗长,因此为了让本文保持简短,我将专注于必要的部分,这意味着创建一个专用的项目来容纳我们的组件。我们可以在以后的文章中涵盖Keystone组件的其他方面(如用户、角色和域)。
创建一个新项目
从我们的OpenStack管理控制台中,我们将转到身份部分,并选择项目。
在这里,您将要使用“+创建项目”按钮创建一个新项目。这将显示一个对话框,提示您填写关于您的项目的详细信息。
输入以下详细信息以创建项目:
- 项目信息:
- 名称:my_app
- 描述:示例Web应用项目
- 项目成员:
- 选择管理员的(+)图标加入项目。
- 移动后,将角色设为管理员,以赋予该用户管理员权限。这将允许管理员用户管理项目. 我们还可以为这个项目创建其他用户帐户,但现在我们保持简单。
填写这些部分之后,我们可以选择“创建项目”来创建新项目并开始使用它。
使用新项目
从仪表盘顶部,您应该看到当前选定的项目。选择此下拉列表应该允许您选择不同的项目作为当前项目。
选择“my_app”后,我们可以切换回仪表板的项目部分,查看特定于此项目的组件。
创建网络
默认情况下,OpenStack不会向您提供任何组件的开放访问权限。相反,我们需要在虚拟网络(VNETs)上设置所有内容,通过路由器可以让我们提供对互联网的访问。我们还需要指定规则,通过安全组和浮动IP的组合来打开我们的应用程序。
总的来说,我已经能够确定关于在OpenStack中进行网络设置的关键事项的一个小清单:
- VNETs用于逻辑上分离节点和组件。
- Ports被定义为类似网络接口的网络接口,就像以太网电缆插入路由器,而不是应用程序套接字端口(如用于SSH的端口22)。
- 我们通过路由器连接VNETs和其他网络。
public
网络是可以被外部访问的网络,可以被主机系统访问。默认情况下,在主机系统上显示为br-ex
。- 将路由器连接到
public
网络允许VNET上的实例访问互联网(安装应用程序和软件包非常重要)。 - 安全组类似于控制实例所属的组中允许哪种类型的流量进出的防火墙策略。
- 浮动IPs是
public
网络端口范围内预定义IP地址,您几乎可以分配给任何端口。这为VNET中的节点提供了一个外部引用。
有了这些覆盖内容,我们可以开始创建我们的网络并将它们连接在一起。
创建我们的应用程序VNET
从我们的仪表板控制台,我们要打开网络标签并查看网络拓扑结构。生成的图表显示了项目可用的现有网络和VNET以及连接到每个设备的设备以及它们如何连接在一起。在构建项目时,您可以返回此处查看如何将各项连接起来。
在图表底部,我们应该选择创建网络以打开新网络对话框。在此对话框中,我们需要指定以下项目:
- 网络标签:
- 名称:
app_net
- 点击下一步移至子网
- 名称:
- 子网标签:
- 子网名称:
app_server_sn
- 网络地址:这是CIDR记法定义,
192.168.1.0/24
。您可以选择其他值,只要该范围不与稍后可能连接的其他网络冲突。 - 点击下一步移至子网详情
- 子网名称:
- 子网详情标签:
- 在DNS名称服务器下,添加
8.8.8.8
以添加Google名称服务器。您可以通过在新行上输入其他条目(如Google的其他名称服务器"8.8.4.4"或Cloudflare的"1.1.1.1")来使用其他多个名称服务器。 - 点击创建。
- 在DNS名称服务器下,添加
现在,新网络已经在拓扑结构对话框中准备好接受新设备。
创建路由器
通过直接在public网络上创建我们的实例来测试应用程序绰绰有余。但是,路由器不仅提供流量路由,还提供类似防火墙的功能,具有自定义路由规则,并且还在我们开始创建服务器实例时将需要的服务元数据功能。
选择创建路由器来打开新路由器对话框。
- 路由器名称:
app_router
- 外部网络:
public
- 点击创建路由器以创建这个路由器。
现在您将看到一个新设备出现在我们的public网络上。 这是我们将用于应用程序的路由器。
从这里,我们需要将我们的VNET连接到这个路由器,以便VNET中的任何内容都可以实现出入。从侧边栏中的路由器部分,选择app_router
名称以打开路由器的详细信息。在接口标签下,我们现在可以将我们的VNET作为另一个接口添加进来:
- 点击添加接口以打开添加接口对话框。
- 在子网下,选择
app_net
。如果我们的VNET有多个子网,每个子网都会列出为它们自己的子网,因此最好查看每个入口结尾处的子网名称。 - 点击提交以建立连接。通常,在创建后,状态列会显示为“下线”,但这只是临时状态,因为软件正在进行调整。
返回至网络拓扑结构,我们的两个网络现在已经连接。
更新安全组
安全组定义了应用程序如何进行外部连接以及外部应用程序如何进行内部连接的策略。所有创建的实例都自动添加到default
安全组中,该组提供了以下访问权限:
- 只有同样在
default
安全组中的流量可以被 Ingress 或传入流量接受。 - 所有流量都被 Egress 或传出的流量接受。
尝试调整这些策略可能导致一些复杂的行为和控制。例如,您可以创建一个策略,所有数据库流量永远不会离开VNET,而可能设置一个MQTT服务,可以使其流量在所有VNET之间传播。
在我们的练习中,我们想要做的唯一更改是:
- 允许SSH(端口22)流量
- 允许HTTP(端口80)流量
在侧边栏的安全组部分,点击default
项目旁边的管理规则。在这里,我们要为上面定义的内容创建2条新规则。
- 点击创建规则以打开添加规则对话框。
- 在规则下,您可以指定自定义规则,但也可以使用预定义的SSH规则。让我们选择这个。
- 我们还可以将权限缩小为特定网络CIDR /范围,比如我们的主机机器IP。现在我们会离开它。点击添加以添加此规则。
- 重复这些步骤来添加HTTP规则。
现在您应该在安全组中有4条入口规则。
创建浮动IP
浮动IP可以被称为内部虚拟网络的公共可访问地址。这些IP可以关联到我们网络中将接受传递给它的流量(只要符合安全组中的规则)的内容。
创建一个:
- 在侧边栏中打开浮动IPs部分。
- 点击分配IP给项目
- 点击分配IP
这将从 public网络(或其他外部可用网络)的允许范围内创建一个随机的预定义IP。目前,它的状态为关闭,只是因为它没有关联到任何内容。我们将在下一部分解决这个。
结论
在本系列中,我们已经创建了一个专用项目和网络访问规则,这将使我们的应用程序对互联网开放。在下一篇文章中,我们将开始创建执行我们所设定的应用程序特定职责的功能组件。