最小安装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
- systemctl disable firewalld
- vi /etc/sysconfig/selinux
- SELINUX=disabled
重启系统
安装epel源
- yum install epel-release
安装并升级pip
安装依赖
- yum install python-pip
- pip install -U pip
- yum install python-devel libffi-devel gcc openssl-devel libselinux-python
安装ansible
- pip install -U ansible
安装docker
- curl -sSL https://get.docker.io | bash
设置docker自启动
- systemctl enable docker
- systemctl start docker
安装docker python library
- pip install -U docker
配置时间同步服务
- yum install ntp
- systemctl enable ntpd.service
- systemctl start ntpd.service
强制同步
- ntpd -gq
设置时区
- timedatectl set-timezone Asia/Shanghai
修改时区的命令实际上是建立了一个链接文件
- [root@tacker-ansible ~]# ll /etc/localtime
- lrwxrwxrwx. 1 root root 35 Dec 8 17:20 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
按照官网说法,docker需要设置MountFlags为shared,否则neutron-dhcp-agent会部署失败
- # Create the drop-in unit directory for docker.service
- mkdir -p /etc/systemd/system/docker.service.d
- # Create the drop-in unit file
- tee /etc/systemd/system/docker.service.d/kolla.conf <<-'EOF'
- [Service]
- MountFlags=shared
- EOF
使用pip安装kolla-ansible
- pip install kolla-ansible
复制配置文件global.yml和password.yml到/etc/kolla/,global.yml是Kolla-ansible最主要的配置文件,password.yml包含keystone和数据库的全部密码。
- cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/kolla/
复制ansible的inventory文件到当前目录,inventory文件告诉ansible要在哪些node上执行命令,这里有all-in-one和multinode两种
- cp /usr/share/kolla-ansible/ansible/inventory/* .
使用下面的命令检查当前主机是否支持硬件加速,由于是在virtualbox的虚机上安装,所以这里返回是0
- egrep -c '(vmx|svm)' /proc/cpuinfo
在这种情况下要配置libvirt使用QEMU,而不能是KVM
- mkdir -p /etc/kolla/config/nova
- cat << EOF > /etc/kolla/config/nova/nova-compute.conf
- [libvirt]
- virt_type = qemu
- cpu_mode = none
- EOF
Kolla-ansible拥有快速搭建或重建整个OpenStack的能力,有人说十几分钟就可以搭建完成。但是这有一个重要的前提,即所有Kolla image都已经ready,否则在天朝直接从官网下载docker image很容易让人怨从心中起,恶向胆边生,安装过程大多数错误都是由于pull image引起的,所以推荐使用本地docker registry。考虑到今后可能多次重建整个虚机,我将docker registry搭建在OSX上,而不在虚机中。步骤:
1. 在OSX上从官网下载registry压缩包
- wget https://tarballs.openstack.org/kolla/images/centos-source-registry-pike.tar.gz
- mkdir /Users/alexli/kolla_registry
- sudo tar xzf centos-binary-registry-ocata.tar.gz -C /Users/alexli/kolla_registry
2. 在OSX上下载Kolla源码,并修改启动脚本
- git clone https://github.com/openstack/kolla
- vi tools/start-registry
- #!/bin/bash
- docker run -d \
- --name registry \
- --restart=always \
- -p 5000:5000 \
- -v /Users/alexli/kolla_registry:/var/lib/registry \
- registry:2
3.在OSX上启动registry,这里的前提是OSX上已经装好了docker
- cd kolla
- tools/start-registry
查看registry,192.168.56.1是OSX上的地址,也是虚机的网关地址
- curl -X GET http://192.168.56.1:5000/v2/_catalog
查看tag,这里应该显示的是5.0.1
- curl -X GET http://192.168.56.1:5000/v2/lokolla/centos-source-mongodb/tags/list
- {"name":"lokolla/centos-source-mongodb","tags":["5.0.1"]}
4.在虚机上配置docker允许连接不安全的registry
- vi /etc/sysconfig/docker
- INSECURE_REGISTRY="--insecure-registry 192.168.56.1:5000”
5.为避免拉镜像时出现“
server gave HTTP response to HTTPS client”的错误,修改虚机上的配置
- vi /etc/docker/daemon.json
- {
- "insecure-registries": ["192.168.56.1:5000"]
- }
6.最后统一重启一下虚拟机上的docker,让配置生效
- systemctl daemon-reload
- systemctl restart docker
不放心的话,可以手工pull一下image,看看有没有问题
- docker pull 192.168.56.1:5000/lokolla/centos-source-mongodb:5.0.1
下面关键的一步,修改global.yml配置文件,这里只包括修改过的配置项,其它不变
- vi /etc/kolla/global.yml
- kolla_install_type: “source” #开发用环境,用source
- openstack_release: “” # 留空,kolla会根据kolla-ansible版本自动填
- network_interface: “enp0s8” # 虚机上的host-only接口
- neutron_external_interface: “enp0s9” # 虚机上另外一个接口
- kolla_internal_vip_address: “192.168.56.254” #指定一个没有使用的IP,跟host-only接口在一个网段,UI访问用
- nova_compute_virt_type: “qemu"
- docker_registry: "192.168.56.1:5000” #刚刚配置的私有registry
- Docker_namespace: “lokolla” #官网下载的就是这个名字
- enable_tacker: “yes” # 这里是tacker相关的service
- enable_barbican: "yes"
- enable_mistral: "yes"
- enable_redis: "yes"
预检查配置是否有问题
- kolla-ansible prechecks -i ./all-in-one
生成密码,如果觉得生成的密码太复杂的话,可以手工改password.yml,改为容易记的密码
- kolla-genpw
执行ansible playbook部署OpenStack,这里花的时间会稍微长点,大概十几分钟吧
- kolla-ansible deploy -i ./all-in-one
如果一切顺利,这是OpenStack所有服务应该已经启动起来了,ansible结果:
- PLAY RECAP ************************************************************************************************************************************
- localhost : ok=267 changed=57 unreachable=0 failed=0
生成admin-openrc.sh,以后在命令行执行openstack命令之前要先source一下这个文件,就是更新环境变量。
- kolla-ansible post-deploy
安装openstack命令行
- pip install python-openstackclient
到这里实际上整个ansible部署就已经完成了,下面我们在这个环境基础上搭建Tacker开发环境。
现在Pike版本的已经支持开发模式,但是目前只支持heat、horizon等几个项目,要想让tacker也支持开发模式,其实也很简单,对照一下heat的ansible配置,修改下面Tacker的3个role文件。
现在Pike版本的已经支持开发模式,但是目前只支持heat、horizon等几个项目,要想让tacker也支持开发模式,其实也很简单,对照一下heat的ansible配置,修改下面Tacker的3个role文件。
1.增加变量定义及volume配置,/usr/share/kolla-ansible/ansible/roles/tacker/defaults/main.yml
- tacker_services:
- tacker-server:
- container_name: "tacker_server"
- group: "tacker-server"
- enabled: true
- image: "{{ tacker_server_image_full }}"
- volumes:
- - "{{ node_config_directory }}/tacker-server/:{{ container_config_directory }}/:ro"
- - "/etc/localtime:/etc/localtime:ro"
- - "{{ kolla_dev_repos_directory ~ '/tacker/tacker:/var/lib/kolla/venv/lib/python2.7/site-packages/tacker' if tacker_dev_mode | bool else '' }}"
- - "kolla_logs:/var/log/kolla/“
- …
- ####################
- # Kolla
- ####################
- tacker_git_repository: "{{ kolla_dev_repos_git }}/{{ project_name }}"
- tacker_dev_repos_pull: "{{ kolla_dev_repos_pull }}"
- tacker_dev_mode: "{{ kolla_dev_mode }}”
2.增加clone tacker代码的playbook,/usr/share/kolla-ansible/ansible/roles/tacker/tasks/clone.yml
- ---
- - name: Cloning source repositories for development
- git:
- repo: "{{ tacker_git_repository }}"
- dest: "{{ kolla_dev_repos_directory }}/{{ project_name }}"
- update: "{{ tacker_dev_repos_pull }}”
3.
将clone代码包含在deploy过程中,/usr/share/kolla-ansible/ansible/roles/tacker/tasks/deploy.yml
- - include: clone.yml
- when:
- - tacker_dev_mode | bool
- - inventory_hostname in groups['tacker-server’]
4.在global.yml配置文件最后增加如下配置项
- tacker_dev_mode: true
5.停止并删除tacker server container
6.重新运行部署kolla的命令,kolla-ansible -i ./all-in-one deploy,可以看到多了两个ansible的task
- TASK [tacker : include] ***********************************************************************************************************************
- included: /usr/share/kolla-ansible/ansible/roles/tacker/tasks/clone.yml for localhost
- TASK [tacker : Cloning source repositories for development] ***********************************************************************************
- changed: [localhost]
再查看/opt
- [root@tacker-ansible tacker]# ll /opt/stack/
- total 4
- drwxr-xr-x 13 root root 4096 Dec 16 20:01 tacker
到这里可以看出,kolla-ansible项目所说的开发环境就是讲相关项目的代码克隆在host中,然后mount到docker里,这样修改host中的代码,docker中的代码也会改变,当然如果希望生效,还需要重启docker。
清理环境
- docker stop $(docker ps -q)
- kolla-ansible -i ./all-in-one destroy --yes-i-really-really-mean-it
- reboot now
在使用kolla-ansible安装过程中,遇到各种各样的问题,简单记录一下。
1.没启动Docker daemon导致错误
- 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’"}
3.keystone的playbook失败
- TASK [keystone : Creating admin project, user, role, service, and endpoint]
- CRITICAL keystone [-] Unhandled error: ProgrammingError: (pymysql.err.ProgrammingError) (1146, u\"Table 'keystone.project' doesn't exist\”)
4.在Horizon中 启动云主机时,报“No valid host was found”错误。
检查nova的计算节点是否工作正常,查看“主机聚合”中的状态,通常因为nova scheduler找不到合适的主机
5.清理环境时执行下面的命令报错
- 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
6.docker pull image时报“ invalid reference format”错误
查遍网上资料说是要求路径全部小写,可是没有大写啊。后来终于发现还是由于粗心,pull的路径写的不对,对比一下:
错误的
- docker pull http://192.168.56.1:5000/v2/lokolla/centos-source-mongodb
正确的
- docker pull 192.168.56.1:5000/lokolla/centos-source-mongodb:5.0.1
7. cannot import name UnrewindableBodyError
解决办法
- pip uninstall urllib3
- pip install urllib3
修改/etc/hosts,增加
- 192.168.56.101 localhost
9. 服务启动失败
- TASK [*** : Running *** bootstrap container]
- fatal: [localhost]: FAILED! => {"changed": true, "msg": "Container exited with non-zero return code”}
重新执行deploy,可能是docker pull超时了
出处:https://blog.csdn.net/napolunyishi/article/details/78821884