[Openstack] 重部署记录
数据中心集群断电后,openstack没法正常连接vm,本身系统也是前人部署,留下来的资料有限,debug比较麻烦,加之instance基本都没人在用,索性重装了。
UPDATE 2020/04/25
- 为了修个后视镜,把车都给拆咯
记录一下,以后再出问题时,稍微提供一些参考。
网络架构
其实之前工作的主要难点就是没有整个网络架构的资料,每个地方都得像“盲人摸象”一样一点一点去尝试,再加上对 OpenStack 缺少系统性的了解,走了很多弯路。
疫情缓和,终于是从学校拿到了系统网络架构的资料,也得益于tripleZ的工作,整个系统终于可以顺利的恢复了。

相关
网络解释:
- Provider Network (提供者网络):外网 IP 网络通道,绑定公网 IP 后可直接访问 Internet ;
- Cluster External Network (集群外部网络):集群内网,可直接访问 Internet ;
- Tunnel Network (隧道网络):实例/系统网络组件之间的网络通道,通过
VLAN实现不同自服务网络间的二层网络隔离;- Management Network(管理网络):用于 OpenStack 系统组件内部的连接通信;
- Storage Network(存储专用网络):高速的存储专线网络以获得较好的实例使用体验。
虚拟网络组件:
虚拟网桥是二层 SDN 的主要实现方式。
br-int:集成网桥,对主机来说是整个 SDN 网络实现的核心,可理解为一个大型的内部虚拟交换机;
br-tun:隧道网桥,用于实现实例间的网络通信;
br-ex:外部网桥,直接连接在可访问外部网络的网卡上,实例可通过该网桥访问外部网络。
数据中心网络拓扑:

Openstack重新部署
从头开始部署请参照 Quick Start,由于大部分环境之前已经配置好了,所以为了避免麻烦,还是摸索着前人留下来的工具直接用,尽量别引入新的问题了,速战速决。
移除容器
- $ cd /root/Kolla-ansible,该路径下- multinode为ansible的inventory,记录了节点角色信息,由于- compute11-13节点离线,先备份 (multinode-datetime.bak),再将这三个节点从- multinode中移除
- scripts中为ansible一些操作的脚本,将日志输入到- logs中,一般建议用这里面的脚本而非直接使用命令
 
- $ ./scripts/stop,stop过程中遇到了- fatal: nova_libvirt cnotainers are running的问题,如遇相似问题,可参考文末 Troubleshoot 章节
- $ ./scripts/destroy,删除容器重新部署
相关文件
大部分的坑已经被前人给趟平了,这里如果需要自定义修改一些配置,主要关注:
- /etc/kolla/globals.yml:- Kolla的配置文件:- 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- kolla_base_distro: "centos" 
 kolla_install_type: "source"
 openstack_release: "ocata"
 node_custom_config: "/etc/kolla/config"
 kolla_internal_vip_address: "10.0.0.254"
 docker_registry: "10.0.0.41:4000"
 enable_aodh: "yes"
 enable_ceilometer: "yes"
 enable_chrony: "yes"
 enable_cinder: "yes"
 enable_cinder_backend_lvm: "yes"
 enable_designate: "yes"
 enable_gnocchi: "yes"
 enable_heat: "yes"
 enable_horizon: "yes"
 enable_mongodb: "yes"
 enable_panko: "yes"
 enable_swift: "no"
 glance_backend_file: "yes"
 glance_backend_ceph: "no"
 ceilometer_database_type: "mongodb"
 ceilometer_event_type: "mongodb"
- /root/Kolla-ansible/multinode:- ansible的- inventory文件,用于指定集群中各个节点的角色,并分发容器,修改时注意备份;
- /usr/share/kolla-ansible/init-runonce:- OpenStack的初始化脚本,可以参考里面的指令。
Kolla方式部署
- $ cd /root/Kolla-ansible
- $ ./scripts/prechecks,部署前预先检查各个节点是否有问题,(其实在这一步之前一般需要- kolla-ansible -i multinode bootstrap-servers将所有节点都安装依赖,不过好在已经搞好,就不用这个,以免依赖版本更新造成一些奇怪的问题),解决这一步中出现的所有问题(error)后,方可进行下一步;
- $ ./scripts/deploy,注意由于- gathering facts收集各个节点统计数据,这一步极为耗时,且会多次出现(所以 log 流停止的时候不要以为出问题了),要么可以直接将- gathering facts关掉(不建议这么做),要么使用一个Ansible的插件 https://github.com/jlafon/ansible-profile ,对统计信息进行缓存,大大减少等待的时间,- 更简单的做法:放这,干别的去,这也是推荐你用脚本而不是命令的原因;
- $ ./scripts/post-deploy,漫长等待之后,可以看到在各个节点上,容器已经正常工作了;
- 这时需要设置下 admin user 和环境变量,执行这步后 - $ source /etc/kolla/admin-openrc.sh获取操作权限;
- 运行脚本创建示例网络,镜像等 - init-runonce:- 1 
 2
 3- EXT_NET_CIDR='211.65.102.1/24' 
 EXT_NET_RANGE='start=211.65.102.42,end=211.65.102.69'
 EXT_NET_GATEWAY='211.65.102.1'- 执行: - 1 - . /usr/share/kolla-ansible/init-runonce 
- 创建external网络: - 1 
 2- $ openstack network create --external --provider-physical-network physnet1 \ 
 --provider-network-type flat external
- 创建子网: - 1 
 2
 3
 4
 5
 6
 7- $ openstack subnet create --no-dhcp \ 
 --allocation-pool start=10.10.0.100,end=10.10.5.255 --network external \
 --subnet-range 10.10.0.0/16 --gateway 10.10.0.1 external-share
 $ openstack subnet create --no-dhcp \
 --allocation-pool start=211.65.102.42,end=211.65.102.69 --network external \
 --subnet-range 211.65.102.0/24 --gateway 211.65.102.1 public-subnet
- 创建 - internal网络:- 1 
 2
 3- $ openstack network create --provider-network-type vxlan internal 
 $ openstack subnet create --subnet-range 192.168.0.1/24 --network internal \
 --gateway 192.168.0.1 --dns-nameserver 8.8.8.8 internal-subnet
- 创建路由: - 1 
 2
 3- $ openstack router create admin-router 
 $ openstack router add subnet admin-router internal-subnet
 $ openstack router set --external-gateway external admin-router
- 创建浮动IP: - $ openstack floating ip create --subnet external-share --project admin external
- 导入镜像,镜像文件位于 - /openstack-images- 1 
 2- openstack image create --disk-format qcow2 --container-format bare --public \ 
 --file ./${IMAGE} ${IMAGE_NAME}- 关于镜像的制作,可以参考另外一篇文章:OpenStack镜像定制 
参考
- 数据中心部署相关资料
Troubleshoot
stop/destory无效:nova_libvirt cnotainers are running:
使用 $ kolla-ansible -i multinode stop 中发现,有部分节点上的容器无法正常停止,这是由于其中有正在运行的实例,一般可以用 $ openstack server delete INSTANCE_NAME 这种方式先将实例删除,再重新运行一遍 stop 命令即可,特殊情况下也可以手动删除(如下)。
报错如下:
| 1 | TASK [stop : Stopping Kolla containers] ***************************************************************************************************************************************************************** | 
解决方法:
- 进入对应的宿主机,进入 nova_libvirt容器:$ docker exec -it nova_libvirt /bin/sh
- 手动执行删除实例
| 1 | (nova-libvirt)[root@Compute02 /]$ virsh list |