这是OpenStack在具有多个物理服务器的现实测试配置中的示例。
您需要一台全新安装的 Linux 系统。可以下载 以用于 Ubuntu 版本,因为 DevStack 将下载并安装所有额外的依赖项。Fedora 的网络安装 ISO 可在 获取,而 CentOS/RHEL 的网络安装 ISO 可在 获取。
apt-get install -y git sudo || yum install -y git sudo
实验的第一阶段使用 OpenStack 的 FlatDHCP 网络控制器,因此只需要一个网络。该网络应位于自己的子网中,并且不应使用 DHCP;主机 IP 和浮动 IP 池将来自此块。此示例使用以下配置:
网关:172.30.0.1
物理节点:172.30.12.11-172.30.12.99
浮动 IPs:172.30.12.200-172.30.12.254
为每个节点配置静态 IP。对于 Ubuntu,您可以编辑 /etc/network/interfaces
文件,示例如下:
auto eth0
iface eth0 inet static
address 172.30.12.11
netmask 255.255.0.0
gateway 172.30.0.1
对于 Fedora and CentOS/RHEL edit /etc/sysconfig/network-scripts/ifcfg-eth0
:
BOOTPROTO=static
IPADDR=172.30.12.11
NETMASK=255.255.0.0
GATEWAY=172.30.0.1
OpenStack 以具有 sudo 权限的非 root 用户身份运行。用户名称没有特别要求,这里我们使用 stack
。每个节点都必须使用相同的名称,并且最好具有相同的 UID。如果您在操作系统安装期间创建了用户,可以使用该用户并赋予其 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 用户身份登录。
为每个节点上的 stack
用户配置 SSH 密钥以便进行访问,步骤如下:
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 的最新版本,请按照以下步骤操作:
git clone https://opendev.org/openstack/devstack
cd devstack
到目前为止,所有步骤都适用于集群中的每个节点。从这里开始,集群控制器(又名“头节点”)和计算节点之间存在一些差异。
集群控制器运行所有OpenStack服务。在local.conf
中配置集群控制器的DevStack:
[[local|localrc]] HOST_IP=172.30.12.11 FIXED_RANGE=10.10.0.0/16 FLOATING_RANGE=172.30.12.200/25 LOGFILE=/opt/stack/logs/stack.sh.log ADMIN_PASSWORD=admin DATABASE_PASSWORD=admin RABBIT_PASSWORD=admin SERVICE_PASSWORD=admin SYSLOG=True SYSLOG_HOST=172.30.12.11 VOLUME_BACKING_FILE_SIZE=20G enable_service s-proxy s-object s-container s-account SWIFT_DATA_DIR=/opt/stack/data/swift SWIFT_CONF_DIR=/etc/swift # 设置循环挂载盘的大小 SWIFT_LOOPBACK_DISK_SIZE=10G # 使用循环挂载文件来存储卷 VOLUME_BACKING_FILE_SIZE=30G # 禁用 LVM 卷组 VOLUME_GROUP_NAME=
在多节点配置中,私有子网中的前10个左右的IP通常是保留的。将此添加到local.sh
中,使其在每次stack.sh
运行后运行:
stack@openstack-01:~/devstack$ cat /opt/stack/devstack/local.sh #!/bin/bash # 保留前10个IP地址 for i in `seq 1 10`; do /opt/stack/nova/bin/nova-manage fixed reserve 10.10.0.$i done
启动OpenStack:
./stack.sh
一系列活动随之展开。完成后,您将看到 stack.sh
工作的总结,包括相关的 URL、账户和密码,以便访问您崭新的 OpenStack。最近的日志文件可在 stack.sh.log
中找到。
计算节点只运行OpenStack工作服务。对于其他机器,使用以下命令创建一个local.conf
:
[[local|localrc]] HOST_IP=172.30.12.12 # 按计算节点更改此设置 FIXED_RANGE=10.10.0.0/16 FLOATING_RANGE=172.30.12.200/25 LOGFILE=/opt/stack/logs/stack.sh.log ADMIN_PASSWORD=admin DATABASE_PASSWORD=admin RABBIT_PASSWORD=admin SERVICE_PASSWORD=admin DATABASE_TYPE=mysql SERVICE_HOST=172.30.12.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 SYSLOG=True SYSLOG_HOST=172.30.12.11 VOLUME_BACKING_FILE_SIZE=20G enable_service s-proxy s-object s-container s-account SWIFT_DATA_DIR=/opt/stack/data/swift SWIFT_CONF_DIR=/etc/swift # 设置循环挂载盘的大小 SWIFT_LOOPBACK_DISK_SIZE=10G # 使用循环挂载文件来存储卷 VOLUME_BACKING_FILE_SIZE=30G # 禁用 LVM 卷组 VOLUME_GROUP_NAME=
启动OpenStack:
./stack.sh
一系列活动随之展开。完成后,您将看到 stack.sh
工作的总结,包括相关的 URL、账户和密码,以便访问您崭新的 OpenStack。最近的日志文件可以在 stack.sh.log
中找到。
从 Ocata 版本开始,Nova 需要进行 Cells v2 部署。在可以使用计算节点服务之前,必须将计算节点服务映射到一个单元。 在每个计算节点被堆叠后,请验证它是否出现在 nova service-list --binary nova-compute
的输出中。计算服务是异步注册到单元数据库中的,因此可能需要轮询。 一旦计算节点服务出现,请从控制节点运行 ./tools/discover_hosts.sh
脚本,将计算主机映射到单个单元。 主控节点上运行的计算服务将在堆叠控制节点时自动发现,因此这实际上只需要为子节点执行。
关闭 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
时这些用户都会被清除。以下步骤适合脚本化:
# 获取管理员权限 . openrc admin admin # 列出现有项目 openstack project list # 列出现有用户 openstack user list # 添加用户和项目 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 # 成员角色由stack.sh创建 # openstack角色分配列表
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
)。所有这些设置都可以在(wait for it ……)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_GROUP_NAME
中以 VOLUME_NAME_PREFIX
开头的所有逻辑卷。建议不要将根卷组用作 VOLUME_GROUP_NAME
。
创建卷组的具体细节取决于所涉及的服务器硬件,但大致如下:
pvcreate /dev/sdc vgcreate stack-volumes /dev/sdc
DevStack 能够使用 rsyslog
来聚合集群中的日志。默认情况下该功能是关闭的;要启用它,请在 local.conf
中设置 SYSLOG=True
。SYSLOG_HOST
默认设置为 HOST_IP
;在计算节点上,必须将其设置为集群控制器的 IP,以便将 syslog 输出发送到那里。在上面的示例中,请将以下内容添加到计算节点的 local.conf
中:
SYSLOG_HOST=172.30.12.11
所有 OpenStack 服务的 git 仓库在 stackrc
中定义。由于此文件是 DevStack 包的一部分,对其进行的更改可能会在应用更新时被覆盖。stackrc
中的每个设置都可以在 local.conf
中重新定义。
要更改某个特定 OpenStack 服务所创建的仓库或分支,只需更改与该服务对应的 *_REPO
或 *_BRANCH
的值。
在对仓库或分支进行更改后,如果 localrc
中未设置 RECLONE
,可能需要从 /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
如果你忘记设置 root 密码,可以执行以下操作:
mysqladmin -u root -pnova password 'supersecret'
为了使在线迁移能够通过默认的在线迁移 URI 工作:
[libvirt] live_migration_uri = qemu+ssh://stack@%s/system
SSH 密钥需要在每个计算节点之间交换:
源节点的 root 用户的公钥 RSA(通常位于 /root/.ssh/id_rsa.pub)需要添加到目标节点的 stack 用户的 authorized_keys 文件中(~stack/.ssh/authorized_keys)。可以通过手动将源节点文件的内容复制到目标节点来完成此操作。如果你为 stack 用户配置了密码,则可以使用以下命令来完成相同的操作:
ssh-copy-id -i /root/.ssh/id_rsa.pub stack@DESTINATION
目标主机的公钥 ECDSA (/etc/ssh/ssh_host_ecdsa_key.pub) 需要添加到源节点的 root 用户的 known_hosts 文件中 (/root/.ssh/known_hosts)。可以通过在源节点上运行以下命令来完成此操作(必须使用主机名):
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
上述步骤是必要的,因为当 live_migration_uri 使用 “qemu:///system” 系列 URI 时,libvirtd 以 root 身份运行。有关更多信息,请参见