使用kolla-ansible搭建安装OpenStack 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 

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
CentOS 7开始用Systemd取代之前的SysVinit作为初始化系统,Ubuntu系统用的是upstart,参考官网配置时注意区分。
设置docker自启动
systemctl enable docker
systemctl start docker
安装docker python library
pip install -U docker
在实际多node部署时,时间同步很重要,但这里是all-in-one环境,所以NTP不是必须的。
配置时间同步服务
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 http://192.168.56.1:5000/v2/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 precheck -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文件。
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’"}
2.kolla-ansible版本跟依赖的Jinja2版本不匹配,错误提示找不到“equalto” filter。单就这个问题,可以手工将“equalto”替换为“match”。
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\”)
原因是上次keystone任务只执行了一半,mariadb中keystone数据库建立了,但是没有表。把keystone数据库删除后 重新跑就ok
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
用ip addr看看是否旧环境的接口还被占着,如果是,重启host,再部署
6.docker pull image时报“ invalid reference format”错误
这个问题很奇怪,查github上的bug,说是因为image命名有要求,但是我这里没这个问题,后来重启了一下registry问题解决,具体原因不明。
相关文章
相关标签/搜索