kolla部署openstack问题汇总

最近用kolla部署openstack时遇到很多问题,在网上搜索解决办法也比较困难,在这里进行一下总结:

我使用的是virtualbox这款虚拟机软件(因为用的是实验室的wendows服务器,用的是上面分配的专用IP网络,所以VMware这个软件用起来联网的时候一直有bug连不上外网,迫不得已才用的virtualbox),kolla的部署流程参考这篇文章:https://blog.csdn.net/boxrice007/article/details/106352507/

问题1:这篇文章用的是最小化的部署,很多组件都没有安装,我这里想给kolla安装一个块存储cinder组件,需要重新部署。在global文件里加上

enable_cinder: "yes"
enable_ceph: "no"
cinder_backend_ceph: "no"
cinder_backup_driver: "nfs"
enable_cinder_backup: "yes"
enable_cinder_backend_nfs: "yes"

然后重新执行precheck和deploy。另外,一个非常坑的点就是,上面的代码,冒号:和引号" 之间必须打个空格,不然precheck会报错。

问题2:使用了cinder组件和nfs之后,deploy时发生报错,显示nfs_shares file not found.解决方法在我另一篇文章:

kolla部署openstack “msg“: “No file was found when using first_ found. Use errors=‘ignore‘ 报错解决_狂妄的路卡利欧的博客-CSDN博客

问题3:我跟着教程完成了deploy之后,以为大功告成了,没想到接下来还有一个大坑,是在7.7这一步,我运行下面的代码的时候总是报错:

source  /etc/kolla/admin-openrc.sh
bash /usr/share/kolla-ansible/init-runonce

报错如下:

  RequestsDependencyWarning)
Traceback (most recent call last):
  File "/usr/bin/openstack", line 5, in <module>
    from openstackclient.shell import main
  File "/usr/lib/python2.7/site-packages/openstackclient/shell.py", line 24, in <module>
    from osc_lib import shell
  File "/usr/lib/python2.7/site-packages/osc_lib/shell.py", line 33, in <module>
    from osc_lib.cli import client_config as cloud_config
  File "/usr/lib/python2.7/site-packages/osc_lib/cli/client_config.py", line 18, in <module>
    from openstack.config import exceptions as sdk_exceptions
  File "/usr/lib/python2.7/site-packages/openstack/__init__.py", line 17, in <module>
    import openstack.connection
  File "/usr/lib/python2.7/site-packages/openstack/connection.py", line 188, in <module>
    from openstack.cloud import openstackcloud as _cloud
  File "/usr/lib/python2.7/site-packages/openstack/cloud/openstackcloud.py", line 21, in <module>
    import dogpile.cache
  File "/usr/lib/python2.7/site-packages/dogpile/cache/__init__.py", line 1, in <module>
    from .region import CacheRegion  # noqa
    headers['Authorization'] = f'Bearer {oauth2_token}' 
SyntaxError: invalid synsyntax

什么,语法错误?大无语,百度了半天也没结果,后来想到我的python版本是2.7,可能不支持某些语法,于是干脆去升级以下python试试,升级办法参考这篇文章:CentOS升级Python详解_centos 升级python_时空无限的博客-CSDN博客

然而,第一步就进行不下去,wget连接www.python.org没响应,于是又只能在windows上访问相应的网页,下载完安装包然后用rz传到虚拟机上。按步骤下载完之后,再跑上面那个代码,哈哈,还是报错,绝了。

最后发现,原来python3.5还是不支持这个语法,我再把python升级到3.8.15,终于没这个报错了。升级到3.8.15就是把教程里的所有版本号都换一下,剩下的安装步骤都一样。

由于python升级后pip不兼容,所以还要升级一下pip:

python -m pip install --upgrade pip

升级完之后,虽然没出现上面的报错,但又出现了新的报错:

ModuleNotFoundError: No module named 'openstackclient'

这个好解决,顾名思义就是没找到openstackclient这个组件,所以要重新pip install一下:

pip install python-openstackclient

接下来再执行bash ./init_runonce这个代码,还有报错。。。真是服了:

Traceback (most recent call last):
  File "/bin/openstack", line 5, in <module>
    from openstackclient.shell import main
  File "/usr/local/lib/python3.8/site-packages/openstackclient/shell.py", line 21, in <module>
    from osc_lib.api import auth
  File "/usr/local/lib/python3.8/site-packages/osc_lib/api/auth.py", line 18, in <module>
    from keystoneauth1.identity.v3 import k2k
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/__init__.py", line 14, in <module>
    from keystoneauth1.identity import generic
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/generic/__init__.py", line 14, in <module>
    from keystoneauth1.identity.generic.password import Password  # noqa
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/generic/password.py", line 16, in <module>
    from keystoneauth1.identity import v3
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/v3/__init__.py", line 19, in <module>
    from keystoneauth1.identity.v3.multi_factor import *  # noqa
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/v3/multi_factor.py", line 14, in <module>
    from keystoneauth1 import loading
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/loading/__init__.py", line 15, in <module>
    from keystoneauth1.loading import adapter
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/loading/adapter.py", line 13, in <module>
    from keystoneauth1 import adapter
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/adapter.py", line 16, in <module>
    import requests
  File "/usr/local/lib/python3.8/site-packages/requests/__init__.py", line 43, in <module>
    import urllib3
  File "/usr/local/lib/python3.8/site-packages/urllib3/__init__.py", line 41, in <module>
    raise ImportError(
ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips  26 Jan 2017'. See: https://github.com/urllib3/urllib3/issues/2168
Checking for locally available cirros image.
Configuring neutron.
Traceback (most recent call last):
  File "/bin/openstack", line 5, in <module>
    from openstackclient.shell import main
  File "/usr/local/lib/python3.8/site-packages/openstackclient/shell.py", line 21, in <module>
    from osc_lib.api import auth
  File "/usr/local/lib/python3.8/site-packages/osc_lib/api/auth.py", line 18, in <module>
    from keystoneauth1.identity.v3 import k2k
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/__init__.py", line 14, in <module>
    from keystoneauth1.identity import generic
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/generic/__init__.py", line 14, in <module>
    from keystoneauth1.identity.generic.password import Password  # noqa
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/generic/password.py", line 16, in <module>
    from keystoneauth1.identity import v3
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/v3/__init__.py", line 19, in <module>
    from keystoneauth1.identity.v3.multi_factor import *  # noqa
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/identity/v3/multi_factor.py", line 14, in <module>
    from keystoneauth1 import loading
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/loading/__init__.py", line 15, in <module>
    from keystoneauth1.loading import adapter
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/loading/adapter.py", line 13, in <module>
    from keystoneauth1 import adapter
  File "/usr/local/lib/python3.8/site-packages/keystoneauth1/adapter.py", line 16, in <module>
    import requests
  File "/usr/local/lib/python3.8/site-packages/requests/__init__.py", line 43, in <module>
    import urllib3
  File "/usr/local/lib/python3.8/site-packages/urllib3/__init__.py", line 41, in <module>
    raise ImportError(
ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips  26 Jan 2017'. See: https://github.com/urllib3/urllib3/issues/2168

看最后一行的信息,知道是urllib3这个包的兼容性问题,升级到相应版本:

pip install urllib3==1.26.15

终于解决了,再运行bash这个代码,显示:

........前面一大堆省略,最后出现这个就是成功了:
###############
# Kolla options
###############
# Validble_cinder_backend_ceph: "yes" options are [ COPY_ONCE, COPY_ALWAYS ]
| properties                 |           |
| ram                        | 16384     |
| rxtx_factor                | 1.0       |
| swap                       |           |
| vcpus                      | 8         |
+----------------------------+-----------+

Done.

To deploy a demo instance, run:

openstack server create \
    --image cirros \
    --flavor m1.tiny \
    --key-name mykey \
    --network demo-net \
    demo1
[root@openstack ~]

问题4:在7.8步上传镜像显示没这个directory,这个不管他,登录dashboard后在镜像那里手动上传就行,我对centos的环境熟悉,毕竟kolla部署openstack也是这个环境,就上传了centos7的镜像。刚部署完可以先用cirros镜像测试一下组件完整性,这是一个非常小的镜像,下载地址:

Index of /

注意,不要用centos的iso镜像,这个镜像需要安装系统,而实例中是找不到disk的,导致安装无法继续。可以使用qcow2格式的centos镜像。镜像下载地址:CentOS Cloud images

找到这个镜像:CentOS-7-x86_64-GenericCloud-2009.qcow2

 另外,如果你想用ubuntu的qcow2格式镜像,可以在这个网站下找:

Ubuntu Cloud Images

windows的也有,不过一般不会用到:

Windows Cloud Images - Cloudbase Solutions

下载完之后,在dashboard上传镜像,注意镜像格式那里选择QCOW2-QEMU模拟器。

这个镜像是不提供默认密码的,因此在用这个镜像创建实例时要自己设置一个密码,在下面这个界面输入脚本:

#!/bin/bash
passwd root<<EOF
admin123
admin123
EOF

 其中,第三行和第四行是自己定义的密码,两个密码需要一致。然后“配置驱动”那里要勾上,不然脚本可能不生效。

另外,如果不想每次ssh连接都输入一遍密码,可以配置一下密钥对。密钥对有新建和导入两种方式,这里推荐第二种。先在部署的主机上生成密钥对:

ssh-keygen

一直按回车就好。

然后进入/root/.ssh/文件夹下,用cat id_rsa.pub命令查看生成的密钥。然后把生成的密钥复制到下面的“公钥”菜单栏。密钥类型选ssh即可。

 接下来在创建实例的时候选择刚才创建好的密钥对,然后等实例创建完,就可以在宿主机上用ssh直接连进实例了。(ssh连不上的,看问题6)

问题5:deploy这个步骤是kolla部署openstack最核心的步骤,需要占用大量内存,建议把虚拟机的运行内存拉到8G以上,CPU8核,创建的硬盘100G左右最好。如果自己电脑配置不太行只能适当减小虚拟机配置,但是虚拟机配置太差容易部署失败,很难受,所以还是量力而行。

问题6:用kolla部署好了openstack之后,怎么让云主机访问外网(internet)?

首先要明白openstack的组件是如何工作的。。。对于上面的部署过程,只进行了最小化部署,当然也只包含最基本的组件。想要简单了解openstack的基本架构以及运作方式,可以参考这篇文章,写的非常好,给作者点赞 每天5分钟玩转 OPENSTACK系列教程 – Jimmy's Blog

这篇文章里重点介绍了openstack网络的运作方式,作为整个架构中最复杂也最难懂的一个部分,想要理清结构还是需要花一定时间的,这里简单介绍一下创建网络的过程中容易踩坑的地方。

首先,创建网络需要在管理员菜单下进行,只有在管理员菜单下才可以选择运营商以及物理网络,如图所示:

这里,名称随意,项目选择admin,供应商网络类型正常选择flat即可,物理网络名称需要看kolla/neutron-server下的ml2_conf.ini文件,这里面详细定义了openstack的各种网络配置,后期可以按需求更改,现在先不用管,看到这一句:

[ml2_type_flat]
flat_networks = physnet1

 这里定义了flat类型的网络名称,因此上面的“物理网络”这一栏就要填写physnet1。

然后记得勾选“外部网络”。对于一个云主机实例,首先需要一个内部网络的网卡,然后通过路由绑定实现通过网桥访问到外网,也就是说,要创建两个网络,一个不勾选“外部网络”选项,使其成为内部网关,这个网络的IP地址可以随意,不要和外部网络的IP重复即可。内部网络不要在管理员界面下创建,否则会报错。

接下来,在“子网”这个选项,填写网络地址,这个地址要和你用来部署的虚拟机的外部网络管理网卡的网段一样。

比如,你的虚拟机的两个网卡为net+host-only,其中host-only的网卡用来管理组件,也就是你访问dashboard的时候用到的IP地址同网段的网卡,那么这里的“网络地址”选项就填另外一个net网卡的IP网段,比如10.10.10.0/24。

这里有个例外的点是,如果你的另一张网卡是桥接网卡,那这里的网络地址就要填你宿主机的真实物理网卡的IP网段,也就是用cmd命令行输入ipconfig命令,弹出来以太网网卡的那个IP地址。如果因为公司或者其他特殊要求使得这个IP网段不能乱用时(比如我就是,我的电脑是公司分配的IP地址,这个网段下的其他IP地址都不能乱用),桥接网卡的方式是联不通外网的,还是换成net吧。

接下来填写网关IP,注意这里有个巨大的坑!而无论是vmware还是virtualbox,net模式的网卡的默认网关都是xxx.xxx.xxx.2,而在openstack中默认的网关是xxx.xxx.xxx.1,导致你的云主机ping不通网关,也ping不通外网。在创建网络的时候,注意这里的“网关IP”项不要填写,等创建路由成功之后,按下面这篇文章改路由网关:openstack创建实例ping不通外网怎么办_openstack实例ping不通外网_PpikachuP的博客-CSDN博客

然后子网详情那里按需求填写即可,默认啥都不填也行。

 创建好外部网络和内部网络之后,还要创建一个路由把两个网络连起来。项目仍然选择admin,“外部网络”选项就选刚才创建的外部网络就行。

然后点进刚才创建的路由,新建一个接口,把内部网络和外部网络的网段连起来。

 接下来创建实例,在选择网络那里,选择内部网络的网卡就行了,外网已经通过路由接口连起来了。

创建完之后,给实例绑定一个浮动IP,让外网能通过ssh连接到实例。提示没有浮动IP就创建一个,待连接的端口选项选到外部网络那个网段。

绑定成功后,还要修改一下安全组规则,让外网可以通过ssh连到云主机。

在安全组界面,点击“管理规则”,然后新增两条规则:

 新增完规则后,ssh连一下实例试试,用这个命令

ssh cirros@xxx.xxx.xxx.xx

注意,“@”后面接的是实例绑定的浮动IP,不是内部网络的那个IP,cirros镜像默认的密码是gocubsgo,在实例的日志里面也可以看到。

如果要ssh连接centos或者ubuntu的实例,把上面的“cirros”改成centos或者ubuntu就行。

登录成功之后,测试一下各个网络是否都能ping通。

首先ip addr查看一下实例的网卡:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast qlen 1000
    link/ether fa:16:3e:cb:8d:f1 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.7/24 brd 10.0.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fecb:8df1/64 scope link 
       valid_lft forever preferred_lft forever

这里我的内部网络是设置为10.0.1.0这个网段,可以看到这里已经为实例成功分配到了一个10.0.1.7的IP。默认情况下,ping这个网段的网关以及该网段下的其他已经创建的实例,都是能通的。

接下来再ping一下外部网络的网关:

$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2): 56 data bytes
64 bytes from 10.0.2.2: seq=0 ttl=62 time=0.795 ms
64 bytes from 10.0.2.2: seq=1 ttl=62 time=1.041 ms
64 bytes from 10.0.2.2: seq=2 ttl=62 time=0.740 ms
64 bytes from 10.0.2.2: seq=3 ttl=62 time=0.837 ms
^C
--- 10.0.2.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.740/0.853/1.041 ms

这里我创建的外部网络是10.0.2.0,这也是virtualbox这款虚拟机软件的网络地址转换(NET)模式默认的网段,它的网关是10.0.2.2。默认也是可以ping通这个网段下的所有已创建的其他实例的,包括宿主机。

最后是ping外网。

PING www.baidu.com (14.119.104.254): 56 data bytes
64 bytes from 14.119.104.254: seq=0 ttl=51 time=18.812 ms
64 bytes from 14.119.104.254: seq=1 ttl=51 time=22.736 ms
64 bytes from 14.119.104.254: seq=2 ttl=51 time=18.838 ms
64 bytes from 14.119.104.254: seq=3 ttl=51 time=18.360 ms
^C
--- www.baidu.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 18.360/19.686/22.736 ms

按我上面的步骤来的话,ping百度一般都是能成功的,关键是创建外部网络的时候你的网关是否设置正确。

如果以上几个网段都ping成功了,恭喜你,离成功又进了一步。

问题7:我的真实主机ping不通云主机实例?

这个好理解,是因为openstack的外部网络,在宿主机上是采用网络地址转换(NET)方式连接到真实主机,这种NET方式,默认情况下宿主机可以ping通真机,真机ping不通宿主机的NET网段。之前部署openstack时是ssh连接的宿主机另一张HOST-ONLY的网卡来实现通信的,但是现在创建的云主机实例,为了联通外网用的是NET模式设定的网段,所以真机无法ping通实例。

为此,virtualbox提供了端口转发的方法来实现真机和NET模式宿主机的通信。点开宿主机的网络设置,找到NET网卡的“端口转发”选项:

在里面添加新的规则:

 这里的主机IP不填,默认为127.0.0.1,通过将主机的某个闲置端口转发到目标IP的子系统的22端口,也就是SSH端口,来实现真机和NET网段主机的间接SSH通信。

这里我设置了三个规则,其中rule1是宿主机的IP,rule2和rule3是云主机实例的IP,注意也是绑定的浮动IP地址。主机端口可以随便填,但是注意不要重复,同时也不要被其他程序占用。

接下来打开ssh连接的软件,我用的是SecureCRT,主机名称填127.0.0.1,端口填你设定的转发规则的主机端口,username一般是root,但也有例外,比如cirros主机的username是cirros。尝试连接一下我创建的cirros实例:

 

连接成功!

 现在就不用套娃在宿主机上用ssh连实例了,直接在真机上用ssh连接,非常方便。但是如果实例设置了密钥对,貌似这种方法就行不通,只能通过密钥对连接。

待续。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值