Devstack 多节点自动化部署

时间:2023-12-22 16:14:38

本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou

JmilkFan:minxihou的技术博文方向是 算法&Openstack自动化 ,写得很好,值得推荐。

这是个在多物理服务器上部署openstack例子:

目录

1 先决条件Linux&网络

1.1 最小化安装系统

你需要一个刚安装好的Linux系统。你可以直接下载最小化的Ubuntu版本,devstack会下载安装所有额外的依赖关系。同样也支持网络安装Fedora,Centos/RHEL.安装几个包用于引导程序配置。

apt-get install -y git sudo || yum install -y git sudo

1.2 网络配置

在实验中我们只需要反复的使用openstack的FlatDHCP网络控制器所以我们只需要一个单网络。不使用DHCP,要保证网络处在它自己的网段内。主机IP和前端IP池将会设在同一个网段内。如下设置了一个示例:

* Gateway: 192.168.42.1
* Physical nodes: 192.168.42.11-192.168.42.99
* Floating IPs: 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版本的Linux来说修改/etc/sysconfig/network-scripts/ifcfg-eth0:

BOOTPROTO=static
IPADDR=192.168.42.11
NETMASK=255.255.255.0
GATEWAY=192.168.42.1

2 安装shake和bake

2.1 添加devstack用户

openstack运行需要使用非root用户该用户可以通过sudo来访问root,对于这个非root用户来说用户名没有特别的限制。在这里我们使用stack来作为用户名。每个节点都必须使用相同的用户名(uuid也尽量保持一致)来部署openstack。如果你在安装系统的时候就设置了用户那你可以直接使用它,用sudo指令进入用户。如果没有创建stack用户的话需要进系统把这个用户创建出来。

groupadd stack
useradd -g stack -s /bin/bash -d /opt/stack -m stack

在安装部署openstack的时候stack用户会修改很多系统的操作,这样我们需要stack用户拥有sudo到root并且无需输入密码的特权。

echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

从这里开始使用stack用户。登入和登出都使用stack用户。

2.2 设置ssh

在每个节点上设置stack的秘钥用于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

2.3 下载devstack

找到devstack的最新版

git clone https://git.openstack.org/openstack-dev/devstack
cd devstack

到目前为止以上的操作适用于你要部署集群中的每个节点。从现在开始在集群控制节点(又名头结点)和计算节点上配置有一些差异。

2.4 配置集群控制节点

集群控制节点上跑着所有openstack的服务。在集群控制节点devstack的local.conf文件中做如下配置。

[[local|localrc]]
HOST_IP=192.168.42.11
FLAT_INTERFACE=eth0
FIXED_RANGE=10.4.128.0/20
FIXED_NETWORK_SIZE=4096
FLOATING_RANGE=192.168.42.128/25
MULTI_HOST=1
LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=labstack
DATABASE_PASSWORD=supersecret
RABBIT_PASSWORD=supersecret
SERVICE_PASSWORD=supersecret

在多节点的配置文件中子网段前十个IP地址一般预留作为虚机私网网段的IP地址。把如下命令加入到local.sh文件中,在每次stack.sh运行完之后运行local.sh。

for i in `seq 2 10`; do /opt/stack/nova/bin/nova-manage fixed reserve 10.4.128.$i; done

运行devstack的部署脚本。

./stack.sh

在一连串运行之后。当stack.sh部署完成的时候终端会输出一个总结的信息,其中包括了各个端点使用的URL,账户和密码信息。最近一次运行stack.sh脚本的日志会被存放到stack.sh.log中。

2.5 配置计算节点

计算节点只运行openstack的计算服务。针对充当计算节点角色的机器,我们需要添加一个local.conf文件在计算节点的devstack中,配置如下:

[[local|localrc]]
HOST_IP=192.168.42.12 # change this per compute node
FLAT_INTERFACE=eth0
FIXED_RANGE=10.4.128.0/20
FIXED_NETWORK_SIZE=4096
FLOATING_RANGE=192.168.42.128/25
MULTI_HOST=1
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,n-net,n-api-meta,c-vol
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN

注意:n-api-meta服务只是源数据服务api的一个版本。启用这个服务是需要的因为计算节点不会创建到控制节点源数据服务的路由路径。

之后我们只需要运行./stack.sh

./stack.sh

2.6 部署完之后的清理工作

现在关闭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

3 stack上增加其他功能性选项

3.1 配置其他用户

devstack创建了两个openstack账号(一个是admin一个是demo)同时创建了两个对应的project(命名依旧一个是admin一个是demo)。admin的作用就像admin字面意思上一样,一个特权管理账户这个账户同时包含在了admin和demo的项目里面。demo账户作为一个普通用户账户它只包含在了demo项目里面。通过dashboard我们可以自定义的创建我们所需要的openstack账户。有些时候在dashboard里面创建账户会比在脚本里面定义创建会更快捷方便一些。尤其你每次执行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 list

3.2 Swift节点

Swift,openstack类储存对象。swift需要大量的存储资源,这个项目在devstack自动化部署的时候是默认禁止的。在devstack中支持swift的最小化安装,这样可以用于测试swift功能。为了真正测试多节点的swift,如下附加的参数设置是必要的。在local.conf文件中写入尽可能简单的开启swift配置参数。

enable_service s-proxy s-object s-container s-account

swift是openstack的类存储对象服务,swift将会把它的数据文件存放到SWIFT_DATA_DIR中(设定的默认值/opt/stack/data/swift).划分分区的数据大小由SWIFT_LOOPBACK_DISK_SZIE来确定(这样实际上是挂载了一个本地文件夹供swift来使用)。swift的配置文件由SWIFT_CONF_DIR参数决定(默认值为/ect/swift)。以上所说的这些配置都可以在local.conf文件中通过修改配置项来实现。

3.3 卷

devstack会自动使用现有stack-volumes的LVM卷来作为云主机的存储卷。如果stack-volumes不存在,那么devstack会自动创建一个10GB大小的本地卷来作为存储卷使用。这样在openstack创建云主机的时候因为卷的数量和规模而被限制了创建个数和大小。卷的大小可以通过修改local.conf中的VOLUME_BACKING_FILE_SIZE来扩大。

stack-volumes卷能在任何支持Linux的LVM功能的物理机上预先创建出来。卷组名可以通过localrc中的VOLUME_GROUP参数进行修改。想要清除之前运行的内容,部分工作需要依靠stack.sh这个脚本,该脚本可以删除VOLUME_GROUP中以VOLUME_GROUP_PREFIX开头的所有逻辑卷。 在设置VOLUME_GROUP的时候不建议使用根卷组。

创建卷组的细节取决于你所用到的物理服务器,在系统层面上指令如下所示

pvcreate /dev/sdc
vgcreate stack-volumes /dev/sdc

3.4 系统日志

devstack通过使用参数ryslog可以跨节点的来收集日志。默认情况下是这个参数是关闭的,要打开的话需要在local.conf中写入SYSLOG=True.SYSLOG_HOST默认的IP地址继承了HOST_IP参数的IP地址。在计算节点设置收集日志的IP地址必须只想keystone控制节点,这样能够统一的收集日志。以下例子指出如何在计算节点添加输出日志的条目值:

SYSLOG_HOST=192.168.42.11

3.5 使用不同repo源与分支

在stackrc中定义了devstack自动化部署时候所要下载openstack服务所要用到的默认repo源与分支。自从这个文件加入了devstack自动部署文件中我们只需要在这个文件中设置我们想使用的repo源和相对应的git分支,则部署的时候就会按照我们配置的repo和分支生效。但是在stackrc中设定的值都是可以在local.conf中重新定义的。

针对创建一个特定的openstack服务选用不同的repo源和分支,最简单的办法就是在local.conf文件中修改针对这个服务的*_REPO和*_BARNCH参数。

再修改了repo源和分支之后,如果你在local.conf中没有设置RECLONE参数,则需要从/opt/stack目录中删除相关服务的文件目录,然后用git来重新根据你设定的repo源和分支来重新克隆代码。

例如,我想从nova主分支树下拉取候选发行版的nova分支,可用如下操作:

NOVA_BRANCH=rc-proposed

从一个实验分支下拉取一个glance的分支则需要使用如下参数:

GLANCE_BRANCH=try-something-big
GLANCE_REPO=https://github.com/mcuser/glance.git

4 注意事项

4.1 重置网桥

如何重置网桥配置

sudo brctl delif br100 eth0.926
sudo ip link set dev br100 down
sudo brctl delbr br100

4.2 设置MySQL数据库密码

如果你忘记设置数据库root密码你可以遵循以下做法:

mysqladmin -u root -pnova password 'supersecret'

4.3 动态迁移

默认配置动态迁移的URL

[libvirt]
live_migration_uri = qemu+ssh://stack@%s/system

每个计算节点间因该要互相交换秘钥

1.在“源”主机中root用户的公钥(形如/root/.ssh/id_rsa.pub)需要复制到”目标”服务器stack用户目录认证秘钥文件夹下(~stack/.ssh/authorized_keys)。可以通过手动的在”源”主机中复制目标目录下的文件到”目标”主机对应的文件目录中来实现这个目标。如果你为stack用户做了密码配置同样的可以通过以下的命令来完成秘钥交换。

ssh-copy-id -i /root/.ssh/id_rsa.pub stack@DESTINATION

2.“目标主机”公用的ECDSA秘钥(/etc/ssh/ssh_host_ecdsa_key.pub)需要放入”源”主机的超级用户的known_hosts文件夹中(/root/.ssh/know_hosts).在“源”主机中通过使用以下命令可以完成需求(注意需要使用主机名)

ssh-keyscan -H DEST_HOSTNAME | sudo tee -a /root/.ssh/known_hosts

本质上,做这两步的操作是为了能够让每一个计算节点中的root用户公钥存在于其他计算节点stack用户的authorized_keys文件中,其次为了让每个计算节点中的公共ECDSA秘钥存在于其他计算节点的root用户knows_hosts文件夹中。请注意,如果root或者stack用户没有SSH秘钥,可以用以下命令生成一个:

ssh-keygen -t rsa

以上的配置是必须的当动态迁移设置的参数live_migration_uri是以root身份来使用的”qemu:///system”系列的URL。