多节点实验室¶
这是一个具有多个物理服务器的真实测试配置中的 OpenStack。
先决条件 Linux & 网络¶
最小安装¶
您需要一个安装了最新 Linux 系统的系统。您可以下载 Minimal CD 用于 Ubuntu 版本,因为 DevStack 将下载并安装所有其他依赖项。netinstall ISO 可用于 Fedora 和 CentOS/RHEL。
安装几个软件包以引导配置
apt-get install -y git sudo || dnf install -y git sudo
网络配置¶
实验室的第一个迭代使用 OpenStack 的 FlatDHCP 网络控制器,因此只需要一个网络。它应该在其自己的子网中,没有 DHCP;主机 IP 和浮动 IP 池将从此块中获取。本示例使用以下配置
网关:192.168.42.1
物理节点:192.168.42.11-192.168.42.99
浮动 IP:192.168.42.128-192.168.42.254
为每个节点配置静态 IP。对于 Ubuntu,编辑 /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.42.11
netmask 255.255.255.0
gateway 192.168.42.1
对于 Fedora 和 CentOS/RHEL,编辑 /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
IPADDR=192.168.42.11
NETMASK=255.255.255.0
GATEWAY=192.168.42.1
安装摇摇欲坠¶
添加 DevStack 用户¶
OpenStack 以具有 sudo 访问 root 权限的非 root 用户身份运行。名称没有特别之处,我们将在这里使用 stack。每个节点必须使用相同的名称,最好是 uid。如果您在 OS 安装期间创建了用户,可以使用它并授予以下 sudo 权限。否则创建 stack 用户
useradd -s /bin/bash -d /opt/stack -m stack
确保 stack 用户的家目录对所有人都有执行权限,因为基于 RHEL 的发行版会以 700 创建它,而 Ubuntu 21.04+ 则以 750 创建它,这可能在部署期间导致问题。
chmod +x /opt/stack
该用户将在安装和操作期间对您的系统进行许多更改,因此它需要具有无需密码即可访问 root 的 sudo 权限
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
从这里开始,使用 stack 用户。**注销**并**登录**为 stack 用户。
设置 Ssh¶
在每个节点上使用 ssh 密钥设置 stack 用户以进行访问
mkdir ~/.ssh; chmod 700 ~/.ssh
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys
下载 DevStack¶
获取 DevStack 的最新版本
git clone https://opendev.org/openstack/devstack
cd devstack
到目前为止,所有步骤都适用于集群中的每个节点。从这里开始,集群控制器(也称为“主节点”)和计算节点之间存在一些差异。
配置集群控制器¶
集群控制器运行所有 OpenStack 服务。在 local.conf 中配置集群控制器的 DevStack
[[local|localrc]]
HOST_IP=192.168.42.11
FIXED_RANGE=10.4.128.0/20
FLOATING_RANGE=192.168.42.128/25
LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=labstack
DATABASE_PASSWORD=supersecret
RABBIT_PASSWORD=supersecret
SERVICE_PASSWORD=supersecret
在多节点配置中,私有子网中的前 10 个 IP 通常是保留的。将此添加到 local.sh,以便在每次 stack.sh 运行后执行
for i in `seq 2 10`; do /opt/stack/nova/bin/nova-manage fixed reserve 10.4.128.$i; done
启动 OpenStack
./stack.sh
随之而来的是一连串的活动。完成时,您将看到 stack.sh 工作摘要,包括相关的 URL、帐户和密码,以探索您全新的 OpenStack。最新的日志文件可在 stack.sh.log 中找到。
配置计算节点¶
计算节点仅运行 OpenStack 工作程序服务。对于其他机器,创建一个包含以下内容的 local.conf
[[local|localrc]]
HOST_IP=192.168.42.12 # change this per compute node
FIXED_RANGE=10.4.128.0/20
FLOATING_RANGE=192.168.42.128/25
LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=labstack
DATABASE_PASSWORD=supersecret
RABBIT_PASSWORD=supersecret
SERVICE_PASSWORD=supersecret
DATABASE_TYPE=mysql
SERVICE_HOST=192.168.42.11
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
ENABLED_SERVICES=n-cpu,c-vol,placement-client,ovn-controller,ovs-vswitchd,ovsdb-server,q-ovn-metadata-agent
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_lite.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
启动 OpenStack
./stack.sh
随之而来的是一连串的活动。完成时,您将看到 stack.sh 工作摘要,包括相关的 URL、帐户和密码,以探索您全新的 OpenStack。最新的日志文件可在 stack.sh.log 中找到。
从 Ocata 版本开始,Nova 需要 Cells v2 部署。在可以使用计算节点服务之前,必须将其映射到单元。
在堆叠每个计算节点后,验证它是否出现在 nova service-list --binary nova-compute 输出中。计算服务异步地注册到单元数据库,因此这可能需要轮询。
一旦计算节点服务出现,从控制节点运行 ./tools/discover_hosts.sh 脚本,将计算主机映射到单个单元。
在堆叠控制节点时,将自动发现运行在主控制节点上的计算服务,因此这只需要对子节点执行。
配置 Tempest 节点以运行 Tempest 测试¶
如果需要对不同的集群控制器节点执行 Tempest 测试,可以通过重用集群控制器节点中的 local.conf 文件来完成,但 ENABLED_SERVICES 变量中禁用了控制器服务。此变量仅应包含 tempest 作为配置的服务。然后变量 SERVICES_FOR_TEMPEST 必须配置为包含集群控制器节点在 ENABLED_SERVICES 变量中启用的那些服务。例如,local.conf 文件可能如下所示
[[local|localrc]]
HOST_IP=192.168.42.12 # change this per compute node
FIXED_RANGE=10.4.128.0/20
FLOATING_RANGE=192.168.42.128/25
LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=labstack
DATABASE_PASSWORD=supersecret
RABBIT_PASSWORD=supersecret
SERVICE_PASSWORD=supersecret
DATABASE_TYPE=mysql
SERVICE_HOST=192.168.42.11
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_lite.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
ENABLED_SERVICES=tempest
SERVICES_FOR_TEMPEST=keystone,nova,neutron,glance
然后只需执行 devstack
./stack.sh
清理 DevStack¶
现在关闭 OpenStack 就像运行包含的 unstack.sh 脚本一样简单
./unstack.sh
可以使用 clean.sh 执行更积极的清理。它会删除某些麻烦的软件包,并尝试使系统处于可以可靠地执行数据库或队列管理器更改的状态。
./clean.sh
有时运行的实例未被清理。DevStack 尝试在运行时执行此操作,但有时仍然需要手动完成。
sudo rm -rf /etc/libvirt/qemu/inst*
sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy
进一步探索¶
其他用户¶
DevStack 创建了两个 OpenStack 用户(admin 和 demo)和两个项目(同样是 admin 和 demo)。admin 正如其名称所示,是一个具有管理权限的帐户,是 admin 和 demo 项目的成员。demo 是一个普通用户帐户,仅是 demo 项目的成员。可以通过仪表板创建其他 OpenStack 用户,有时通过脚本批量执行它们更容易,尤其是因为它们会在每次 stack.sh 运行后被清除。以下步骤非常适合脚本编写
# Get admin creds
. openrc admin admin
# List existing projects
openstack project list
# List existing users
openstack user list
# Add a user and project
NAME=bob
PASSWORD=BigSecret
PROJECT=$NAME
openstack project create $PROJECT
openstack user create $NAME --password=$PASSWORD --project $PROJECT
openstack role add Member --user $NAME --project $PROJECT
# The Member role is created by stack.sh
# openstack role assignment list
Swift¶
Swift,OpenStack 对象存储,需要大量的资源,并且默认情况下在 DevStack 中被禁用。DevStack 中的支持面向最小化安装,但可用于测试。要实现 Swift 的真正多节点测试,需要采取其他步骤。启用它就像在 local.conf 中启用 swift 服务一样简单
enable_service s-proxy s-object s-container s-account
Swift,OpenStack 对象存储,会将数据文件放在 SWIFT_DATA_DIR(默认 /opt/stack/data/swift)中。创建的数据“分区”(实际上是一个循环挂载的文件)的大小由 SWIFT_LOOPBACK_DISK_SIZE 设置。Swift 配置文件位于 SWIFT_CONF_DIR(默认 /etc/swift)中。所有这些设置都可以在(等待…)local.conf 中覆盖。
卷¶
DevStack 将自动使用现有的名为 stack-volumes 的 LVM 卷组来存储云创建的卷。如果 stack-volumes 不存在,DevStack 将设置一个循环挂载的文件来包含它。如果默认大小不足以满足所需的卷的数量和大小,可以通过在 local.conf 中设置 VOLUME_BACKING_FILE_SIZE 来覆盖它(大小以 truncate 兼容格式给出,例如 24G)。
stack-volumes 可以在支持 Linux 的 LVM 的任何物理卷上预先创建。可以通过在 localrc 中设置 VOLUME_GROUP_NAME 来更改卷组的名称。stack.sh 会删除在清理之前运行中以 VOLUME_NAME_PREFIX 开头的 VOLUME_GROUP_NAME 中的所有逻辑卷。不建议将根卷组用作 VOLUME_GROUP_NAME。
创建卷组的细节取决于所涉及的服务器硬件,但类似于以下内容
pvcreate /dev/sdc
vgcreate stack-volumes /dev/sdc
Syslog¶
DevStack 能够使用 rsyslog 在集群中聚合日志记录。默认情况下已关闭;要启用它,请在 local.conf 中设置 SYSLOG=True。SYSLOG_HOST 默认为 HOST_IP;在计算节点上,必须将其设置为集群控制器的 IP,才能将 syslog 输出发送到那里。在上面的示例中,将此添加到计算节点的 local.conf
SYSLOG_HOST=192.168.42.11
使用替代仓库/分支¶
所有 OpenStack 服务的 git 仓库在 stackrc 中定义。由于此文件是 DevStack 包的一部分,因此在应用更新时对其进行更改可能会被覆盖。 stackrc 中的每个设置都可以在 local.conf 中重新定义。
要更改用于创建特定 OpenStack 服务的仓库或分支,只需更改 *_REPO 或 *_BRANCH 对应于该服务的相应值即可。
在更改仓库或分支后,如果 RECLONE 未在 localrc 中设置,则可能需要删除 /opt/stack 中的相应目录,以强制 git 重新克隆仓库。
例如,要从主 nova 仓库中提取 nova,OpenStack Compute 的提议发布候选版本
NOVA_BRANCH=rc-proposed
要从实验性分支中提取 glance,OpenStack 镜像服务
GLANCE_BRANCH=try-something-big
GLANCE_REPO=https://github.com/mcuser/glance.git
注意事项 你可能需要知道的东西¶
设置 MySQL 密码¶
如果您忘记设置 root 密码,可以这样做
mysqladmin -u root -pnova password 'supersecret'
实时迁移¶
为了使实时迁移与默认实时迁移 URI 正常工作
[libvirt]
live_migration_uri = qemu+ssh://stack@%s/system
需要在每个计算节点之间交换 SSH 密钥
SOURCE root 用户的公钥 RSA(可能位于 /root/.ssh/id_rsa.pub 中)需要位于 DESTINATION stack 用户的 authorized_keys 文件中(~stack/.ssh/authorized_keys)。可以通过手动将文件内容从 SOURCE 复制到 DESTINATION 来完成。如果您为 stack 用户配置了密码,则可以使用以下命令完成相同的操作
ssh-copy-id -i /root/.ssh/id_rsa.pub stack@DESTINATION
DESTINATION 主机的公钥 ECDSA(/etc/ssh/ssh_host_ecdsa_key.pub)需要位于 SOURCE root 用户的 known_hosts 文件(/root/.ssh/known_hosts)中。可以通过在 SOURCE 机器上运行以下命令来完成(必须使用主机名)
ssh-keyscan -H DEST_HOSTNAME | sudo tee -a /root/.ssh/known_hosts
验证是否可以使用 ssh 在没有密码的情况下进行登录
ssh -i /root/.ssh/id_rsa stack@DESTINATION
本质上,这意味着每个计算节点的 root 用户的公钥 RSA 必须存在于每个其他计算节点的 stack 用户的 authorized_keys 文件中,并且每个计算节点的公钥 ECDSA 需要位于每个其他计算节点的 root 用户的 known_hosts 文件中。请注意,如果 root 或 stack 用户没有 SSH 密钥,可以使用以下命令生成一个
ssh-keygen -t rsa
上述步骤是必要的,因为 libvirtd 在 live_migration_uri 使用“qemu:///system”系列 URI 时以 root 身份运行。有关更多信息,请参阅 libvirt 文档。