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

Enabling Kolla “dev mode”

https://docs.openstack.org/kolla-ansible/latest/contributor/kolla-for-openstack-development.html

          

“Tacker is an OpenStack service for NFV Orchestration with a general purpose VNF Manager to deploy and operate Virtual Network Functions (VNFs) and Network Services on an NFV Platform. It is based on ETSI MANO Architectural Framework.” For more details about Tacker, see OpenStack Tacker Documentation.

要想搭建其他服务的开发环境,如horizon可以按照tacker的例子进行修改


在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
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页