使用 Kolla 构建多功能 OpenStack 实验室

在一个虚拟机中进行完整部署,磨练您的 OpenStack 技能。

如今,无论走到哪里,都很难不听到关于迫切需要部署敏捷、灵活且构建和维护成本不高昂的本地云环境的消息,但是真正上手一个真正的 OpenStack 集群(事实上的标准)可能完全不可能。

Kolla-Ansible 横空出世,这是一个官方的 OpenStack 项目,它允许您在单个强大的虚拟机上以 Docker 容器成功部署一个完整的集群,包括 Keystone、Cinder、Neutron、Nova、Heat 和 Horizon。实际上,它只是新兴的官方 OpenStack 项目组之一,这些项目将 OpenStack 控制平面容器化,以便用户可以在容器和 Kubernetes 中部署完整的系统。

迄今为止,对于那些碰巧没有一堆装有大量 RAM 和 CPU 核心的额外服务器的人来说,DevStack 一直是首选的 OpenStack 实验室环境,但它有一些局限性。其中关键的是您无法有效地重启 DevStack 系统。事实上,重启通常会使您的实例崩溃,并使堆栈的其余部分在很大程度上无法使用。DevStack 还限制了您在核心 OpenStack 模块之外进行实验的能力,而 Kolla 允许您构建可以模仿完整生产能力、进行更改并在关机后从中断处继续的系统。

在本文中,我将解释如何部署 Kolla,从您的笔记本电脑或工作站的初始配置开始,到集群的配置,再到将您的 OpenStack 集群投入使用。

为什么选择 OpenStack?

随着各种规模的组织都在寻求加速关键任务应用程序的开发和部署,许多组织转向公共云,例如 Amazon Web Services (AWS)、Microsoft Azure、Google Compute Engine、RackSpace 以及许多其他云。所有这些云都使您可以轻松快速地构建您和您的组织需要的系统。尽管如此,这些公共云服务也是有代价的,有时价格昂贵,您只能在账单周期结束时才了解到。您组织中任何拥有信用卡的人都可以启动服务器,甚至包括包含专有数据和不充分的安全保障的服务器。

OpenStack 是一个社区驱动的开源项目,在全球拥有数千名开发人员,它提供了一个强大且适合企业使用的替代方案。它为您在自己的数据中心中提供了公共云的灵活性。在许多方面,它也比公共云更容易使用,特别是当 OpenStack 管理员正确设置网络、划分存储和计算资源并为用户提供自助服务功能时。它还具有大量的附加功能,几乎可以满足您能想到的任何用例。难怪 75% 的私有云都是使用 OpenStack 构建的。

然而,让 OpenStack 启动并运行仍然是一个挑战。即使它不依赖于任何特定品牌的硬件,但它确实需要具有大量内存和 CPU 核心的机器。仅这一点就为许多想要尝试它的人设置了障碍。Kolla 项目让您克服了这个障碍。

您需要的

Kolla 可以在单个虚拟机(或裸机服务器)中运行,这被称为“一体化”部署。您也可以将其设置为使用多个虚拟机,这被称为“多节点”。在本文中,我将展示如何使用 KVM 部署的虚拟机进行前者部署,KVM 是基于 libvirtd 的 Linux 虚拟化服务。我成功地在配备 32GB RAM 和 12 核 i7 CPU 的 Dell 5530 上部署了 Kolla,但我也在一台配备 16GB RAM 和 4 核的机器上完成了部署。您可以分配您拥有的任何资源。显然,RAM 和核心越多,您的 OpenStack 集群性能就越好。

我在此部署中使用了 KVM,但理论上,您可以使用 VirtualBox、VMware Desktop 或其他虚拟机管理程序。系统的基础是 Docker,因此只需确保您使用的是可以运行它的系统即可。如果您对 Docker 不太了解,请不要担心;Kolla 使用 Ansible 来自动化镜像和容器本身的创建。

要安装 KVM,请查看您的发行版的要求,请记住您需要 libvirtd、qemu 和 virt-manager(用于 GUI 管理)。在 Ubuntu 上,这将是


$ sudo apt-get install qemu-kvm libvirt-bin bridge-utils
 ↪virt-manager

在 Fedora 上,您将使用


$ sudo dnf -y install bridge-utils libvirt virt-install
 ↪qemu-kvm

在 openSUSE 上,您将安装 KVM 模式


$ sudo zypper -n install patterns-openSUSE-kvm_server
 ↪patterns-server-kvm_tools

作为工作站配置的一部分,我建议设置桥接网络。这将使您能够直接从主机连接到 Kolla VM(以及您在其上创建的 OpenStack 实例)。如果没有它,KVM 默认使用 NAT 配置,该配置将 VM 与主机隔离。(您将在下面看到如何设置桥接网络连接。)

最后,Kolla 支持两种 Linux 发行版进行部署:CentOS 和 Ubuntu。您的主机可以是您想要的任何 Linux 版本(甚至 Windows 或 Mac),但主 VM 将是上面列出的两种版本之一。这并不意味着您不能为基于其他 Linux 版本的 OpenStack 实例创建 OpenStack 镜像。您可以,并且您有很多选择。但是,对于本实验室,我将使用 CentOS 7 作为主 Kolla VM。

准备您的工作站

为了正常工作,Kolla 需要两个活动的 NIC,在理想的世界中,这些 NIC 将是不同的子网,但它们不需要是。对于本实验室而言,更重要的是您可以访问您的 Kolla VM 和您的 OpenStack 实例,为此,请设置一个桥接。

在我的例子中,我的工作站有两个不同的网络,一个内部网络和一个外部网络。对于内部网络,我使用了 10.128.1.0/24,但您可以创建一个适合您需求的子网。我的子网跨越了我的实验室网络上的几个物理和虚拟服务器,包括 DNS 服务器,因此我能够自动利用这些资源。只需小心划分足够的网络资源以满足您的需求即可。我只需要大约 50 个 IP,因此创建一个 /24 对于 OpenStack 实例和我所有其他服务器来说已经足够了。

您可以根据您的 Linux 发行版选择多种设置桥接的方式。大多数桥接都可以通过从命令行编辑配置文件来简单完成,而其他桥接则可以通过图形工具轻松完成,例如 openSUSE 的 YaST。无论如何,前提都是相同的。与其将网络参数分配给物理网络设备(eth0、eth1、enps01 等),不如将未配置的物理设备绑定到单独的桥接设备,该桥接设备获取静态 IP、子网掩码、网关、DNS 服务器和其他网络参数。

历史上,Ubuntu 用户会编辑 /etc/network/interfaces 以设置桥接,这可能看起来像这样


auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 10.128.1.10
netmask 255.255.255.0
gateway 10.128.1.1
dns-nameservers 10.128.1.2 10.128.1.3 8.8.8.8
dns-search example.com
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

当前版本的 Ubuntu(和其他发行版)使用 netplan,它可能看起来像这样


network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
  bridges:
    br0:
      dhcp4: yes
      interfaces:
        - enp3s0

有关使用 Netplan 的更多信息,请参阅本文末尾的“资源”部分。

对于使用 /etc/sysconfig/network/ 配置文件的发行版(例如 CentOS 和 openSUSE),单独的桥接文件引用物理设备。例如,ifcfg-br0 将与 ifcfg-eth0 一起创建


$ sudo vi /etc/sysconfig/network-scripts/ifcfg-br0:

BOOTPROTO='static'
BRIDGE='yes'
BRIDGE_FORWARDDELAY='0'
BRIDGE_PORTS='eth0'
BRIDGE_STP='off'
BROADCAST='10.128.1.255'
ETHTOOL_OPTIONS=''
IPADDR='10.128.1.10/24'
STARTMODE='auto'

$ sudo vi /etc/sysconfig/network/ifcfg-eth0:

BOOTPROTO='none'
NAME='AX88179 Gigabit Ethernet'
STARTMODE='hotplug'

根据您的网络管理方式(NetworkManager、Wicked、Networkd),您应该在继续之前重启服务。如果事情似乎不对劲,请尝试重启。

创建 Kolla 虚拟机

使用 Kolla 部署 OpenStack 依赖于单个强大的虚拟机。您可以为其分配的资源越多,OpenStack 的性能就越好。以下是您应分配的最低配置

  • CentOS 7(最小 .iso 文件即可)。
  • 8GB 内存。
  • 四个 vCPU。
  • 两个 NIC(可以在同一网络上)。
  • 两个虚拟磁盘(主机 VM 操作系统至少 40GB,Cinder 卷至少 40GB)。

这是最低要求。我强烈建议至少 10GB 内存和六个 vCPU。此外,如果您有 SSD 或 NVMe 驱动器,请将其用于您的 VM 存储。固态驱动器将显着提高性能并加快初始部署速度。请记住根据您的预期用例调整磁盘大小。如果您计划为您的 OpenStack 实例创建 200GB 的卷,请创建一个至少 200GB 的第二个虚拟磁盘。

""

图 1. 创建 KVM 虚拟机时,请记住选中“安装前自定义配置”框,以便您可以添加第二个存储设备和第二个网络接口。

准备 CentOS

逐步完成 CentOS 的基本配置并重启。为了节省资源和时间,请不要费心安装桌面环境。系统重启后,登录并执行一些内务处理任务,包括设置静态 IP 地址——这里没有桥接,只是 eth0 的静态地址。不要配置 eth1 接口,但要验证它是否存在


DEVICE='eth0'
HWADDR='00:AA:0C:28:46:6B:91'
Type=Ethernet
UUID=25a7bad9-616a-40a0-ace5-52aa0af9fdb7
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=10.128.1.20
NETMASK=255.255.255.0
GATEWAY=10.128.1.1

几次当我创建 CentOS 7 VM 时,我发现它会自动将 eth0 重命名为 eth1 并以这种方式持久化。Kolla 要求您在配置文件中指定并硬编码接口名称,因此这种不希望有的名称更改会破坏安装。如果发生这种情况,只需运行以下命令即可修复它(无需重启)


$ sudo ip link set eth1 down
$ sudo ip link set eth1 name eth0
$ sudo ip link set eth0 up

安装所需的软件包

理论上,您可以一次性运行以下安装命令,但最好单独运行它们以隔离任何错误。epel-release 和其他软件包是 Kolla 所必需的,如果任何软件包失败,其余的安装都将失败


$ sudo yum update
$ sudo yum install epel-release
$ sudo yum install python-pip
$ sudo yum install python-devel libffi-devel gcc openssl-devel
 ↪libselinux-python
$ sudo yum install ansible git

更新 pip 以避免稍后出现问题


$ sudo pip install --upgrade pip

安装 kolla-ansible

您将需要 kolla-ansible 软件包的元素进行安装,但您不会使用此系统版本的应用程序来稍后执行单个命令。如果您在部署步骤中遇到错误,请记住这一点


$ sudo pip install kolla-ansible --ignore-installed

设置 Git 并克隆 Kolla 仓库

安装主要通过存储在 GitHub 中的代码完成,因此您需要 GitHub 凭据——即从您的 Kolla 主机 VM 添加到您的 GitHub 设置的公共 SSH 密钥


$ git config --global user.name "Your Name"
$ git config --global user.email "your@github-email"
$ git clone https://github.com/openstack/kolla
$ git clone https://github.com/openstack/kolla-ansible

""

图 2. 您的工作目录现在应该看起来像这样,其中包含来自 GitHub 的 kolla 和 kolla-ansible 目录。

复制一些配置文件并安装 kolla-ansible 需求

必须将 kolla-ansible Git 仓库提供的一些配置文件复制到您的 Kolla 主机 VM 上的位置。requirements.txt 文件检查所有必需的软件包并安装任何未满足的软件包


$ sudo cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/
$ sudo cp /usr/share/kolla-ansible/ansible/inventory/* .
$ sudo pip install -r kolla/requirements.txt
$ sudo pip install -r kolla-ansible/requirements.txt

复制配置文件

requirements 文件运行后,将有许多新资源可用,并且必须将其复制到 /etc/kolla/ 和您的工作目录


$ sudo mkdir -p /etc/kolla
$ sudo cp -r kolla-ansible/etc/kolla/* /etc/kolla
$ sudo cp kolla-ansible/ansible/inventory/* .

为 LVM 创建 Cinder 卷

可以启动没有 Cinder(OpenStack 存储组件)的 Kolla 集群,但是您将无法创建除使用小型 Cirros 镜像构建的实例之外的任何实例。由于此特定实验室将使用 LVM 作为后端,因此应创建一个卷组。这将部署在您在 Kolla 主机 VM 中创建的第二个虚拟磁盘上。使用 pvcreatevgcreate 创建卷组(要了解更多信息,请参阅“资源”部分中的 Cinder 指南链接)


$ sudo pvcreate /dev/sda
$ sudo vgcreate cinder-volumes /dev/sda

""

图 3. 如果您在设置 Kolla 主机 VM 时创建了 SATA 磁盘,则该驱动器将显示为 sda

编辑主 Kolla 配置设置

Kolla 从主配置文件 /etc/kolla/globals.yml 获取有关您的虚拟环境的信息。确保设置了以下项目并且取消注释了这些行


# Define the installation type
config_strategy: "COPY_ALWAYS"
kolla_base_distro: "centos"
kolla_install_type: "binary"
openstack_release: "master"    # "master" ensures you're
                               # pulling the latest release.
                               # You also can designate specific
                               # OpenStack versions

network_interface: "eth0"    # This must match the name of your
                             # first NIC

# Match first NIC on host
neutron_external_interface: "eth1"    # This should match the
                                      # name of your second NIC

# Match second NIC on host
kolla_internal_vip_address: "10.128.1.250"    # Any free IP
                                              # address on your
                                              # subnet

# An unused address in eth0 subnet
keepalived_virtual_router_id: "51"    # If initial deployment
                                      # fails to get the vip
                                      # address, change "51"
                                      # to "251"
enable_cinder: "yes"
enable_cinder_backend_iscsi: "yes"
enable_cinder_backend_lvm: "yes"
enable_heat: "yes"

注意:您可以在此处启用各种其他 OpenStack 资源,但对于初始部署,我建议使用这种相对最小的配置。另请注意,此配置提供了 Heat 和 Cinder。

自动生成密码

OpenStack 需要许多不同的凭据,Kolla 提供了一个脚本来为您生成它们。它还在部署期间根据需要将它们提供给各种组件


$ sudo kolla-ansible/tools/generate_passwords.py

稍后,您将需要 Horizon 仪表板登录凭据,这些凭据与其他密码一起创建。发出以下命令以获取“admin”用户密码


$ grep keystone_admin_password /etc/kolla/passwords.yml

安装 Heat 软件包

Heat 使您可以在 OpenStack 环境中轻松自动化完整堆栈。我建议添加此组件,以便您可以尝试构建堆栈,而不仅仅是实例


$ sudo pip install openstack-heat

将 qemu 设置为 VM 类型

由于您在虚拟机中运行 OpenStack 的嵌套安装,因此您需要告诉 Kolla 使用 qemu 作为虚拟机监控程序,而不是默认的 KVM。创建一个新目录和一个配置文件


$ sudo mkdir -p /etc/kolla/config/nova

创建文件 /etc/kolla/config/nova/nova-compute.conf 并包含以下内容


[libvirt]
virt_type=qemu

引导 Kolla 容器

您现在已准备好部署 OpenStack!如果到目前为止的所有安装步骤都已完成且没有错误,则您的环境已准备就绪。

执行以下命令时,请务必使用位于您从 GitHub 下载的文件夹中的 kolla-ansible 版本,而不是系统版本。系统版本将无法正常工作。

请注意,您正在指示系统引导“一体化”部署,而不是“多节点”。deploy 命令可能需要一些时间,具体取决于您的系统资源以及您是否正在使用 SSD 或旋转磁盘进行存储。Kolla 正在启动大约 40 个 Docker 容器,请耐心等待


$ sudo kolla-ansible/tools/kolla-ansible -i all-in-one
 ↪bootstrap-servers
$ sudo kolla-ansible/tools/kolla-ansible -i all-in-one
 ↪prechecks
$ sudo kolla-ansible/tools/kolla-ansible -i all-in-one
 ↪deploy

""

图 4. 每个步骤都会在发生时提供详细信息,因此您可以跟随并排除任何问题。

同样,部署步骤可能需要一些时间——一个小时或更长时间。您可以通过从单独的 shell 运行 sudo docker ps 来跟踪进度。某些容器可能看起来“卡住”或显示大量重启。这是正常的。避免任何停止安装的冲动。

""

图 5. 在单独的 shell 中运行 sudo docker ps 以跟踪 Kolla 部署构建 OpenStack 所需的容器。

当一体化部署步骤成功完成 (failed=0) 后,您可能需要此时制作 VM 的快照。这是一个很好的回滚点,以防您稍后遇到问题。

安装 OpenStack 客户端工具并运行 post-deploy

引导完成后,您的 OpenStack 集群将启动并运行。实际上,它以当前形式是可访问和可用的,但 Kolla 项目提供了一些额外的自动化,可以添加资源并为您配置网络


$ sudo pip install python-openstackclient --ignore-installed
 ↪python-glanceclient python-neutronclient
$ sudo kolla-ansible/tools/kolla-ansible post-deploy

Kolla 提供了一个初始化步骤,将所有内容整合在一起。init-runonce 脚本创建网络、密钥和镜像类型等。请务必编辑该文件以匹配您的公共网络配置,然后再继续。这样,您的 OpenStack 实例将立即访问您的网络,而不是默认网络,如果您的子网与默认网络不匹配,则默认网络对您没有任何好处


$ vi kolla-ansible/tools/init-runonce

编辑以下行以匹配您自己的网络。使用之前的示例网络 (10.128.1.0/24),您的条目可能如下所示


EXT_NET_CIDR='10.128.1.0/24'    # This will become public1
EXT_NET_RANGE='start=10.128.1.100,end=10.128.1.149'   # These 50
                                           # addresses will be
                                           # floating IPs
EXT_NET_GATEWAY='10.128.1.1'    # Your network gateway

运行最终初始化

现在是为您的 Kolla 主机 VM 拍摄第二个快照的好时机。一旦您在下一步中运行 init-runonce,您将无法回滚。

首先获取管理员用户的 openrc.sh 文件,然后启动 init 脚本


$ source /etc/kolla/admin-openrc.sh
$ kolla-ansible/tools/init-runonce

""

图 6. 来自 init-runonce 脚本的输出示例。

启动 Horizon 仪表板

如果一切顺利,您现在拥有一个可用的 OpenStack 集群。您可以通过 Horizon 在您在 /etc/kolla/globals.yml 文件中设置的 kolla_internal_vip_address 访问它(在本例中为 10.128.1.250)


http://kolla_internal_vip_address

Username: admin
Password: $ grep keystone_admin_password
 ↪/etc/kolla/passwords.yml

""

图 7. OpenStack Horizon 登录界面

稍等片刻,您将被带到主 OpenStack 概览仪表板。继续探索界面,包括“计算”→“实例”和“网络”→“网络拓扑”。在后者中,您会注意到您的公共网络已配置,以及一个私有子网和一个连接它们的路由器。另请务必查看“计算”→“镜像”,您将在其中看到 cirros,这是一个小型操作系统,您可以立即将其部署为工作实例。

""

图 8. OpenStack Horizon 仪表板

""

图 9. 使用提供的 cirros qcow2 镜像启动实例。

在您探索时,请记住整个集群都在单个 VM 上运行,有时响应可能很慢。请耐心等待,或者如果您无法耐心等待并且有更多可用资源,请关闭集群电源,并为您的虚拟机添加更多 RAM 和 CPU。

重启您的集群

如果您想关闭集群,请确保没有正在运行的进程(例如正在启动的实例),然后在 Kolla 主机上发出 sudo poweroff 命令。这将关闭 Docker 容器并使所有内容脱机。您还可以发出 sudo docker stop $(docker ps -q) 以在关闭之前停止所有容器。当您重启 Kolla VM 时,您的 OpenStack 集群将需要一些时间来重启所有容器,但系统将完好无损,所有资源都与您离开时一样。在大多数情况下,您的实例不会自动启动,因此您需要从仪表板启动它们。要在关闭后重启您的 Kolla 集群,您需要启动所有相关的 OpenStack 容器。发出以下命令即可执行此操作


sudo docker start $(docker ps -q)

这将查找所有现有镜像并启动它们。

资源

John Tonello 是 SUSE 的全球技术营销经理,他在软件定义的基础架构方面拥有专长。自从 20 多年前从软盘构建他的第一个 Slackware 系统以来,他一直是 Linux 用户和爱好者。

加载 Disqus 评论