使用kolla-ansible搭建安装OpenStack Tacker开发环境

最小安装centos 7(只有330多个包),需安装net-tools,lvm2,python-six

在ETSI NFV ISG的参考模型中,MANO包含三大组件:NFVO、VNFM和VIM。由于ETSI标准化进程远落后于开源组织及设备制造商各自的开发进度,虽然各大开源MANO,如OSM、ONAP、OpenBaton等,都以ETSI的模型作为参考,但在参考点的定义和实现上仍然各自为战,实际上目前不能做到三层解耦,各厂商的MANO在某种程度上仍然是“软烟囱”。纵然如此,各厂商对于VIM的选择上,却不约而同的选择了OpenStack,OpenStack成为VIM的事实标准。从OpenStack Neutron项目拆分出来的Tacker项目也成为提供NFVO+VNFM解决方案的明星项目,OpenStack正全方位切入电信市场。

由于工作需要,我尝试了多种OpenStack的安装方式,比如前面文章讲过的RDO,以及DevStack,还有本文要介绍的Kolla-ansible项目。RDO并非OpenStack的官方项目,且只支持Redhat系列OS,而用过DevStack的同学可能又为其安装过程的烦杂易错且不易维护而苦恼。容器和OpenStack的结合正是大势所趋,不论生产环境还是开发环境,容器化部署带来的优势都是诱人的。Kolla-ansible在Pike版本中开始支持容器化的开发环境搭建,但目前仅包括heat等少数几个项目,其它项目还不支持,本文在结合工作实际的基础上,介绍使用Kolla-ansible来搭建Tacker开发环境。
主机环境是OSX,安装的virtualbox,上面运行CentOS 7虚拟机,4核、8G内存、30G硬盘。在网络选项上,增加3个接口,类型分别是NAT、Host-only和Bridged,NAT用于虚拟机访问外网,Host-only用于从OSX访问虚拟机,第三块网卡给Neutron用,其实类型无所谓,暂时用不上。

虚拟机安装好后,使用ip addr命令查看各接口状态,确保都已经up。
如果安装后主机名是bogon,使用 hostnamectl set-hostname xxx 命令来设置主机名。

先关掉防火墙和SELinux 

[plain]   view plain  copy
  1. systemctl disable firewalld  
  2. vi /etc/sysconfig/selinux  
  3. SELINUX=disabled  

重启系统 


安装epel源
[plain]   view plain  copy
  1. yum install epel-release  
安装并升级pip
[plain]   view plain  copy
  1. yum install python-pip  
  2. pip install -U pip  
安装依赖
[plain]   view plain  copy
  1. yum install python-devel libffi-devel gcc openssl-devel libselinux-python  
安装ansible
[plain]   view plain  copy
  1. pip install -U ansible  
安装docker
[plain]   view plain  copy
  1. curl -sSL https://get.docker.io | bash  
CentOS 7开始用Systemd取代之前的SysVinit作为初始化系统,Ubuntu系统用的是upstart,参考官网配置时注意区分。
设置docker自启动
[plain]   view plain  copy
  1. systemctl enable docker  
  2. systemctl start docker  
安装docker python library
[plain]   view plain  copy
  1. pip install -U docker  
在实际多node部署时,时间同步很重要,但这里是all-in-one环境,所以NTP不是必须的。
配置时间同步服务
[plain]   view plain  copy
  1. yum install ntp  
  2. systemctl enable ntpd.service  
  3. systemctl start ntpd.service  
强制同步
[plain]   view plain  copy
  1. ntpd -gq  
设置时区
[plain]   view plain  copy
  1. timedatectl set-timezone Asia/Shanghai  
修改时区的命令实际上是建立了一个链接文件
[plain]   view plain  copy
  1. [root@tacker-ansible ~]# ll  /etc/localtime  
  2. lrwxrwxrwx. 1 root root 35 Dec  8 17:20 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai  
按照官网说法,docker需要设置MountFlags为shared,否则neutron-dhcp-agent会部署失败
[plain]   view plain  copy
  1. # Create the drop-in unit directory for docker.service  
  2. mkdir -p /etc/systemd/system/docker.service.d  
  3.   
  4. # Create the drop-in unit file  
  5. tee /etc/systemd/system/docker.service.d/kolla.conf <<-'EOF'  
  6. [Service]  
  7. MountFlags=shared  
  8. EOF  
使用pip安装kolla-ansible
[plain]   view plain  copy
  1. pip install kolla-ansible  
复制配置文件global.yml和password.yml到/etc/kolla/,global.yml是Kolla-ansible最主要的配置文件,password.yml包含keystone和数据库的全部密码。
[plain]   view plain  copy
  1. cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/kolla/  
复制ansible的inventory文件到当前目录,inventory文件告诉ansible要在哪些node上执行命令,这里有all-in-one和multinode两种
[plain]   view plain  copy
  1. cp /usr/share/kolla-ansible/ansible/inventory/* .  
使用下面的命令检查当前主机是否支持硬件加速,由于是在virtualbox的虚机上安装,所以这里返回是0
[plain]   view plain  copy
  1. egrep -c '(vmx|svm)' /proc/cpuinfo  
在这种情况下要配置libvirt使用QEMU,而不能是KVM
[plain]   view plain  copy
  1. mkdir -p /etc/kolla/config/nova  
  2. cat << EOF > /etc/kolla/config/nova/nova-compute.conf  
  3. [libvirt]  
  4. virt_type = qemu  
  5. cpu_mode = none  
  6. EOF  

Kolla-ansible拥有快速搭建或重建整个OpenStack的能力,有人说十几分钟就可以搭建完成。但是这有一个重要的前提,即所有Kolla image都已经ready,否则在天朝直接从官网下载docker image很容易让人怨从心中起,恶向胆边生,安装过程大多数错误都是由于pull image引起的,所以推荐使用本地docker registry。考虑到今后可能多次重建整个虚机,我将docker registry搭建在OSX上,而不在虚机中。步骤:
1. 在OSX上从官网下载registry压缩包
[plain]   view plain  copy
  1. wget https://tarballs.openstack.org/kolla/images/centos-source-registry-pike.tar.gz  
  2. mkdir /Users/alexli/kolla_registry  
  3. sudo tar xzf centos-binary-registry-ocata.tar.gz -C /Users/alexli/kolla_registry  
2. 在OSX上下载Kolla源码,并修改启动脚本
[plain]   view plain  copy
  1. git clone https://github.com/openstack/kolla  
  2. vi tools/start-registry  
  3. #!/bin/bash  
  4.   
  5. docker run -d \  
  6.     --name registry \  
  7.     --restart=always \  
  8.     -p 5000:5000 \  
  9.     -v /Users/alexli/kolla_registry:/var/lib/registry \  
  10.     registry:2  
3.在OSX上启动registry,这里的前提是OSX上已经装好了docker
[plain]   view plain  copy
  1. cd kolla  
  2. tools/start-registry  
查看registry,192.168.56.1是OSX上的地址,也是虚机的网关地址
[plain]   view plain  copy
  1. curl -X GET http://192.168.56.1:5000/v2/_catalog  
查看tag,这里应该显示的是5.0.1
[plain]   view plain  copy
  1. curl -X GET http://192.168.56.1:5000/v2/lokolla/centos-source-mongodb/tags/list  
  2. {"name":"lokolla/centos-source-mongodb","tags":["5.0.1"]}  
4.在虚机上配置docker允许连接不安全的registry
[plain]   view plain  copy
  1. vi /etc/sysconfig/docker  
  2. INSECURE_REGISTRY="--insecure-registry 192.168.56.1:5000”  
5.为避免拉镜像时出现“ server gave HTTP response to HTTPS client”的错误,修改虚机上的配置
[plain]   view plain  copy
  1. vi /etc/docker/daemon.json  
  2. {  
  3.     "insecure-registries": ["192.168.56.1:5000"]   
  4. }  
6.最后统一重启一下虚拟机上的docker,让配置生效
[plain]   view plain  copy
  1. systemctl daemon-reload   
  2. systemctl restart docker  
不放心的话,可以手工pull一下image,看看有没有问题
[plain]   view plain  copy
  1. docker pull 192.168.56.1:5000/lokolla/centos-source-mongodb:5.0.1  

下面关键的一步,修改global.yml配置文件,这里只包括修改过的配置项,其它不变
[plain]   view plain  copy
  1. vi /etc/kolla/global.yml  
  2. kolla_install_type: “source”                  #开发用环境,用source  
  3. openstack_release: “”                          # 留空,kolla会根据kolla-ansible版本自动填  
  4. network_interface: “enp0s8”                # 虚机上的host-only接口  
  5. neutron_external_interface: “enp0s9”  # 虚机上另外一个接口  
  6. kolla_internal_vip_address: “192.168.56.254”   #指定一个没有使用的IP,跟host-only接口在一个网段,UI访问用  
  7. nova_compute_virt_type: “qemu"  
  8. docker_registry: "192.168.56.1:5000”   #刚刚配置的私有registry  
  9. Docker_namespace: “lokolla”               #官网下载的就是这个名字  
  10.   
  11. enable_tacker: “yes”                           # 这里是tacker相关的service  
  12. enable_barbican: "yes"  
  13. enable_mistral: "yes"  
  14. enable_redis: "yes"  

预检查配置是否有问题
[plain]   view plain  copy
  1. kolla-ansible prechecks -i ./all-in-one  
生成密码,如果觉得生成的密码太复杂的话,可以手工改password.yml,改为容易记的密码
[plain]   view plain  copy
  1. kolla-genpw  
执行ansible playbook部署OpenStack,这里花的时间会稍微长点,大概十几分钟吧
[plain]   view plain  copy
  1. kolla-ansible deploy -i ./all-in-one  
如果一切顺利,这是OpenStack所有服务应该已经启动起来了,ansible结果:
[plain]   view plain  copy
  1. PLAY RECAP ************************************************************************************************************************************  
  2. localhost                  : ok=267  changed=57   unreachable=0    failed=0  
生成admin-openrc.sh,以后在命令行执行openstack命令之前要先source一下这个文件,就是更新环境变量。
[plain]   view plain  copy
  1. kolla-ansible post-deploy  
安装openstack命令行
[plain]   view plain  copy
  1. pip install python-openstackclient  

到这里实际上整个ansible部署就已经完成了,下面我们在这个环境基础上搭建Tacker开发环境。
现在Pike版本的已经支持开发模式,但是目前只支持heat、horizon等几个项目,要想让tacker也支持开发模式,其实也很简单,对照一下heat的ansible配置,修改下面Tacker的3个role文件。
1.增加变量定义及volume配置,/usr/share/kolla-ansible/ansible/roles/tacker/defaults/main.yml
[plain]   view plain  copy
  1. tacker_services:  
  2.   tacker-server:  
  3.     container_name: "tacker_server"  
  4.     group: "tacker-server"  
  5.     enabled: true  
  6.     image: "{{ tacker_server_image_full }}"  
  7.     volumes:  
  8.       - "{{ node_config_directory }}/tacker-server/:{{ container_config_directory }}/:ro"  
  9.       - "/etc/localtime:/etc/localtime:ro"  
  10.       - "{{ kolla_dev_repos_directory ~ '/tacker/tacker:/var/lib/kolla/venv/lib/python2.7/site-packages/tacker' if tacker_dev_mode | bool else '' }}"  
  11.       - "kolla_logs:/var/log/kolla/“  
  12. …  
  13. ####################  
  14. # Kolla  
  15. ####################  
  16. tacker_git_repository: "{{ kolla_dev_repos_git }}/{{ project_name }}"  
  17. tacker_dev_repos_pull: "{{ kolla_dev_repos_pull }}"  
  18. tacker_dev_mode: "{{ kolla_dev_mode }}”  
2.增加clone tacker代码的playbook,/usr/share/kolla-ansible/ansible/roles/tacker/tasks/clone.yml
[plain]   view plain  copy
  1. ---  
  2. - name: Cloning source repositories for development  
  3.   git:  
  4.     repo: "{{ tacker_git_repository }}"  
  5.     dest: "{{ kolla_dev_repos_directory }}/{{ project_name }}"  
  6.     update: "{{ tacker_dev_repos_pull }}”  
3. 将clone代码包含在deploy过程中,/usr/share/kolla-ansible/ansible/roles/tacker/tasks/deploy.yml
[plain]   view plain  copy
  1. - include: clone.yml  
  2.   when:  
  3.     - tacker_dev_mode | bool  
  4.     - inventory_hostname in groups['tacker-server’]  
4.在global.yml配置文件最后增加如下配置项
[plain]   view plain  copy
  1. tacker_dev_mode: true  
5.停止并删除tacker server container
6.重新运行部署kolla的命令,kolla-ansible -i ./all-in-one deploy,可以看到多了两个ansible的task
[plain]   view plain  copy
  1. TASK [tacker : include] ***********************************************************************************************************************  
  2. included: /usr/share/kolla-ansible/ansible/roles/tacker/tasks/clone.yml for localhost  
  3.   
  4. TASK [tacker : Cloning source repositories for development] ***********************************************************************************  
  5. changed: [localhost]   
再查看/opt
[plain]   view plain  copy
  1. [root@tacker-ansible tacker]# ll /opt/stack/  
  2. total 4  
  3. drwxr-xr-x 13 root root 4096 Dec 16 20:01 tacker  
到这里可以看出,kolla-ansible项目所说的开发环境就是讲相关项目的代码克隆在host中,然后mount到docker里,这样修改host中的代码,docker中的代码也会改变,当然如果希望生效,还需要重启docker。


清理环境
[plain]   view plain  copy
  1. docker stop $(docker ps -q)  
  2. kolla-ansible -i ./all-in-one destroy --yes-i-really-really-mean-it  
  3. reboot now  

在使用kolla-ansible安装过程中,遇到各种各样的问题,简单记录一下。
1.没启动Docker daemon导致错误
[plain]   view plain  copy
  1. fatal: [localhost]: FAILED! => {"changed": true, "msg": "'Traceback (most recent call last):\\n  File \"/tmp/ansible_S7JoMg/ansible_module_kolla_docker.py\", line 795, in main\\n    dw = DockerWorker(module)\\n  File \"/tmp/ansible_S7JoMg/ansible_module_kolla_docker.py\", line 218, in __init__\\n    self.dc = get_docker_client()(**options)\\n  File \"/usr/lib/python2.7/site-packages/docker/api/client.py\", line 149, in __init__\\n    self._version = self._retrieve_server_version()\\n  File \"/usr/lib/python2.7/site-packages/docker/api/client.py\", line 176, in _retrieve_server_version\\n    \\'Error while fetching server API version: {0}\\'.format(e)\\nDockerException: Error while fetching server API version: (\\'Connection aborted.\\', error(2, \\'No such file or directory\\'))\\n’"}  
2.kolla-ansible版本跟依赖的Jinja2版本不匹配,错误提示找不到“equalto” filter。单就这个问题,可以手工将“equalto”替换为“match”。
3.keystone的playbook失败
[plain]   view plain  copy
  1. TASK [keystone : Creating admin project, user, role, service, and endpoint]  
  2. CRITICAL keystone [-] Unhandled error: ProgrammingError: (pymysql.err.ProgrammingError) (1146, u\"Table 'keystone.project' doesn't exist\”)  
原因是上次keystone任务只执行了一半,mariadb中keystone数据库建立了,但是没有表。把keystone数据库删除后 重新跑就ok
4.在Horizon中 启动云主机时,报“No valid host was found”错误。
检查nova的计算节点是否工作正常,查看“主机聚合”中的状态,通常因为nova scheduler找不到合适的主机
5.清理环境时执行下面的命令报错
[plain]   view plain  copy
  1. docker exec kolla_toolbox openstack --os-interface internal --os-auth-url http://192.168.56.254:35357 --os-identity-api-version 3 --os-project-domain-name default --os-tenant-name admin --os-username admin --os-password xEZhAqFwlM8LPf55OH6a3lTaHa6QV0TYcQcB1lUe  --os-user-domain-name default compute service list  
用ip addr看看是否旧环境的接口还被占着,如果是,重启host,再部署
6.docker pull image时报“ invalid reference format”错误
查遍网上资料说是要求路径全部小写,可是没有大写啊。后来终于发现还是由于粗心,pull的路径写的不对,对比一下:

错误的

[plain]   view plain  copy
  1. docker pull http://192.168.56.1:5000/v2/lokolla/centos-source-mongodb  

正确的

[plain]   view plain  copy
  1. docker pull 192.168.56.1:5000/lokolla/centos-source-mongodb:5.0.1  

7. cannot import name UnrewindableBodyError

解决办法

[plain]   view plain  copy
  1. pip uninstall urllib3   
  2. pip install urllib3  
8. Hostname has to resolve to IP address of api_interface
修改/etc/hosts,增加
[plain]   view plain  copy
  1. 192.168.56.101 localhost  

9.  服务启动失败

[plain]   view plain  copy
  1. TASK [*** : Running *** bootstrap container]  
  2. fatal: [localhost]: FAILED! => {"changed": true, "msg": "Container exited with non-zero return code”}  
重新执行deploy,可能是docker pull超时了


出处:https://blog.csdn.net/napolunyishi/article/details/78821884

你可能感兴趣的:(openstack)