Date
Log
26/05/2019
初始版本.
解决什么问题 本文尝试解决的问题:
使用个人开发电脑搭建一套 OpenStack 开发环境。
本文所有操作的前提是个人电脑搭建 Linux 操作系统且具有 16G 以上的内存资源和 足够大的硬盘空间。要完成整个系统的搭建,需要进行:
准备三个控制节点和两个计算节点的虚拟机环境;
使用 kolla-ansible 部署 OpenStack。
准备虚拟机 首先,新建 /infra 目录用于存放本次部署产生所有的数据信息,包括安装文件和虚拟机磁盘文件。基于 VMware Workstation 创建虚拟机, VMware Workstation 安装过程不再赘述。使用 CentOS 7.6 最小系统镜像安装操作系统,镜像地址:
1 https://mirrors.tuna.tsinghua.edu.cn/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso
三个控制节点配置相同,可以在创建完成一个虚拟机后使用 VMware 提供的 clone 功能直接复制出其余的(复制得到的虚拟机需要重新生成 MAC 地址,否则会造成地址冲突),配置详情如下: 两个计算节点在上图配置的基础上提升了内存、处理器和硬盘配置,这里硬盘容量设置较大是为了后续在 OpenStack 环境中部署 Kubernetes 等其它系统做准备,可根据个人需要缩减: 所有节点配置两张网卡:一张用于 OpenStack 管理网,通过 NAT 连接外网;一张用于 Neutron 网络,直接桥接到外部网络。可根据个人需求调整连接外部网络的方式,VMware 虚拟网络信息如下: 虚拟机创建完成后进入操作系统检查 IP 地址获取情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@controller_03 ~] 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:50:56:32:8a:b7 brd ff:ff:ff:ff:ff:ff inet 172.16.192.131/24 brd 172.16.192.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::250:56ff:fe32:8ab7/64 scope link valid_lft forever preferred_lft forever 3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:50:56:34:89:62 brd ff:ff:ff:ff:ff:ff inet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute dynamic ens36 valid_lft 82858sec preferred_lft 82858sec inet6 fe80::91ef:7089:dc2e:d7f1/64 scope link noprefixroute valid_lft forever preferred_lft forever
如果没有获取到 IP 可执行 dhclient 命令尝试获取 IP 地址,动态分配的 IP 地址只是为系统提供了临时连接外部网络的途径。为了后续的自动化部署,我们需要将每个节点连接管理网的网卡 IP 地址固定下来,并使用管理网网关为默认路由网关(一定要确认好网关地址),如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@controller_03 ~] TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes NAME=ens33 UUID=f7c0ccd3-10d2-4bd9-bc47-c6429cbc28a0 DEVICE=ens33 ONBOOT=yes IPADDR=172.16.192.131 GATEWAY=172.16.192.2 NETMASK=255.255.255.0 DNS1=114.114.114.114 DNS2=1.1.1.1 DNS3=8.8.4.4
给 Neutron 使用的网卡配置如下:
1 2 3 4 5 6 7 8 9 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=no NAME=ens36 DEVICE=ens36 ONBOOT=yes
为了管理方便,我们将三个控制节点和两个计算节点的 hostname 分别设置为(主机名不能带下划线,否则部署 OpenStack 时报错):
1 2 3 4 5 controller-01 controller-02 controller-03 compute-01 compute-02
为了方便命令行登录节点,可通过 ssh-copy-id 将宿主机 ssh public-key 拷贝到各虚拟节点,之后在 ssh 登录时无需再输入密码。 为了方便在所有虚拟机和宿主机之间共享文件,我们可以使用 VMware 的文件共享机制将宿主机目录挂载到虚拟机中。首先,在虚拟机的属性配置中添加要共享的文件夹,如下是将宿主机上的 /infra/vmshare 目录共享给虚拟机:
只有上图的设置还不够,我们需要进入到虚拟机内部将共享的文件夹挂载到本地目录才能使用,如下,该命令的涵义是将名称为 vmshare 的共享挂载到本地 /vmshare 目录:
1 vmhgfs-fuse .host:/vmshare /vmshare
另外也可以将挂载信息写入到 /etc/fstab 使系统在启动时自动挂载:
1 .host:/vmshare /vmshare fuse.vmhgfs-fuse allow_other 0 0
部署 OpenStack 的时候需要使用到网卡的混杂模式,而在 Linux 下虚拟机没有权限完成该操作,可通过以下设置开放权限给虚拟机:
1 2 sudo chmod a+rw /dev/vmnet0 sudo chmod a+rw /dev/vmnet8
在使用图形化界面完成以上操作和配置后,我们将脱离 GUI 运行虚拟机,这样可以节省一些资源开支。执行以下命令以命令行形式运行虚拟机:
1 vmrun start /infra/openstack_controller_02/openstack_controller_02.vmx nogui
现在,将所有节点都以 nogui 形式启动起来,vmrun list 可以看到它们:
1 2 3 4 5 6 7 (kolla) ➜ kolla vmrun list Total running VMs: 5 /infra/openstack_controller_02/openstack_controller_02.vmx /infra/openstack_controller_03/openstack_controller_03.vmx /infra/openstack_controller_01/openstack_controller_01.vmx /infra/openstack_compute_01/openstack_compute_01.vmx /infra/openstack_compute_02/openstack_compute_02.vmx
我们的虚拟机环境准备好了,开始使用 kolla-ansible 进行部署。
使用 kolla-ansible 部署 OpenStack 参考 kolla-ansible 官方文档 进行部署。 创建一份虚拟 Python 环境用于本次部署,需要先安装 virtualenv ,我的宿主机环境是 ArchLinux,执行以下命令安装,其它 Linux 环境请自行 Google 安装方法:
1 yay -S python-virtualenv
然后执行以下命令创建 kolla 虚拟环境:
1 virtualenv -p python2 /infra/kolla
使用以下命令激活虚拟 Python 环境 :
1 source /infra/kolla/bin/activate
安装 Ansible:
为了方便对所有节点执行一些共性的操作,我们临时创建一份 hosts 文件,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 (kolla) ➜ kolla cat /infra/hosts [OpenstackGroup:children] nodes controllers computes [OpenstackGroup:vars] ansible_ssh_user=root ansible_ssh_pass=r00tme ansible_port=22 [nodes] openstack_controller_01 ansible_host=172.16.192.129 openstack_controller_02 ansible_host=172.16.192.130 openstack_controller_03 ansible_host=172.16.192.131 openstack_compute_01 ansible_host=172.16.192.132 openstack_compute_02 ansible_host=172.16.192.133 [contorllers] openstack_controller_01 ansible_host=172.16.192.129 openstack_controller_02 ansible_host=172.16.192.130 openstack_controller_03 ansible_host=172.16.192.131 [computes] openstack_compute_01 ansible_host=172.16.192.132 openstack_compute_02 ansible_host=172.16.192.133
启用 SELinux 会带来一些麻烦,影响 kolla 安装部署,因此我们使用 ansible 关闭所有节点的 SELinux 并重启系统使之生效:
1 2 ansible nodes -i /infra/hosts -m shell -a 'sed -i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config' ansible nodes -i /infra/hosts -m shell -a 'reboot'
另外,我们使用清华开源镜像替代 Pypi 官方仓库:
1 2 3 ansible nodes -i /infra/hosts -m shell -a 'yum install -y wget' ansible nodes -i /infra/hosts -m shell -a 'wget https://tuna.moe/oh-my-tuna/oh-my-tuna.py' ansible nodes -i /infra/hosts -m shell -a 'python /root/oh-my-tuna.py'
接下来,继续按照 kolla 文档安装 kolla-ansible:
1 2 3 4 5 pip install kolla-ansible sudo mkdir -p /etc/kolla sudo chown $USER :$USER /etc/kolla cp -r /infra/kolla/share/kolla-ansible/etc_examples/kolla/* /etc/kolla cp /infra/kolla/share/kolla-ansible/ansible/inventory/multinode /infra/kolla
然后,配置 multinode inventory 文件,根据文档中的说明来进行配置即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 (kolla) ➜ kolla cat multinode [control] openstack_controller_01 openstack_controller_02 openstack_controller_03 [network] openstack_controller_01 openstack_controller_02 openstack_controller_03 [inner-compute] [external-compute] openstack_compute_01 openstack_compute_02 [compute:children] inner-compute external-compute [monitoring] openstack_controller_01 [storage] openstack_compute_01 openstack_compute_02 [deployment] localhost ansible_connection=local [baremetal:children] control network compute storage monitoring [baremetal:vars] ansible_ssh_user=root ansible_ssh_pass=r00tme ansible_port=22
注意上述文件中的虚拟机名称应当可以在宿主机解析到其对应的 IP 地址,为此 宿主机 hosts 增加如下配置:
1 2 3 4 5 6 (kolla) ➜ kolla tail -n 5 /etc/hosts 172.16.192.129 openstack_controller_01 172.16.192.130 openstack_controller_02 172.16.192.131 openstack_controller_03 172.16.192.132 openstack_compute_01 172.16.192.133 openstack_compute_02
执行以下命令生成安装过程所需的数据库等各项基础设施密码:
然后修改 kolla 的全局配置文件 /etc/kolla/globals.yml :
1 2 3 4 5 6 7 8 9 10 11 12 kolla_base_distro: "centos" kolla_install_type: "binary" openstack_release: "rocky" network_interface: "ens33" neutron_external_interface: "ens36" kolla_internal_vip_address: "172.16.192.134"
接下来,开始真正部署的第一步,在所有节点上安装部署依赖的基础软件包,安装过程可能有报错,可针对具体问题解决后重复执行安装命令:
1 kolla-ansible -i /infra/kolla/multinode bootstrap-servers
第二步,检查环境是否已经准备好,配置是否有错漏,检查过程可能会抛出一些错误,不要惊慌,一般都有提示信息,按照提示去修改即可:
1 kolla-ansible -i /infra/kolla/multinode prechecks
第三步,正式开始安装:
1 kolla-ansible -i /infra/kolla/multinode deploy
如果在安装中出错,可以先找到错误原因并修复后,先清理上次安装后再重装:
1 2 kolla-ansible -i ./multinode destroy --yes-i-really-really-mean-it kolla-ansible -i /infra/kolla/multinode deploy
常见错误
在 bootstrap-servers 阶段遇到 Python uninstall request 包错误,可尝试如下方式解决:
1 pip install -I requests==2.9
参考资料