Kolla 简介
长久以来 OpenStack 部署难、 升级难的问题经常为人诟病,简单、便捷、高效的部署升级方案是所有 OpenStack 用户(客户、云服务提供商、开发者)的共性刚需。Kolla 正是应需而生,它基于社区的最佳实践,提出了可靠、可扩展的生产级别 OpenStack Service Containers 部署方式。
简单来说,Kolla 就是充分应用容器特性,实现容器化部署 OpenStack 服务的 DevOps 工具。
Kolla 显著的特点是「开箱即用」和「简易升级」,前者由编排工具(Ansible/Kubernetes)提供自动化支撑,后者则完全是 Container 的功劳。Kolla 追求为每一个 OpenStack Service 都构建相应的 Container,将升级/回滚的粒度(隔离依赖关系集)降维到 Service 或 Project 级别,实现升级/回滚的原子性。假若升级失败,则直接启动 Old Version Container 完成回滚。版本升级只需三步:
Pull New Docker Image
Stop Old Docker Container
Start New Docker Container
除此之外,Kolla 还提供了定制化部署拓扑的能力,允许用户花费更小的学习和试错成本,逐渐摸索演变出适合自己的部署架构蓝图。
众所周知,容器技术具有非常优秀的应用部署敏捷性和效率,其中以 Docker 和 Kubernetes 作为构建容器化应用程序的主要标准,是最受欢迎的容器技术选型。Kolla 社区紧贴用户,将 Kolla Project 逐渐解耦成为了三个产品。由 Kolla 负责构建镜像,由 Kolla-ansible/Kolla-kubernetes 负责部署,而且 Kolla-kubernetes 还兼具着容器管理的能力。它们之间既互相配合又能自成一家,松耦合的架构更有利于最大限度的覆盖用户多方面需求。
Kolla:容器镜像构建
Kolla-ansible:容器部署
Kolla-kubernetes:容器部署,容器管理
在 Queens Release,Kolla-ansible 开始支持「开发者模式」,这的确是一个令人兴奋的消息。
支持开发模式。这个对 OpenStack 的开发者很是方便。以住,开发者可能要通过 devstack 搭建完整的 OpenStack 来开发,但是部署复杂,难度高。现在 kolla-ansible 已经支持了开发模式。通过配置要开发环境的 dev_mode, 如
horizon_dev_mode: true
, 那么 horizon 容器内的代码会从物理机上挂载进去,开发者对代码修改后,就可以直接看到修改后的效果。十分方便。
from:
99Cloud 雷神(Kolla PTL)
详细请参考:
https://docs.openstack.org/kolla-ansible/latest/contributor/kolla-for-openstack-development.html
虽然,现在开发模式支持的项目还比较有限,但社团贡献者已经提交了 BluePrint,相信很快就能支持大部分核心项目了。
BP:https://review.openstack.org/#/c/560969/
在本文中,我们以 Kolla & Kolla-ansible 的组合,介绍如何轻松的部署出一套 OpenStack 环境。
Kolla & Kolla-ansible 部署 OpenStack
部署环境:
平台:VMware Workstations
操作系统:CentOS 74,4C/8G
双网卡
Host 模式:eth0 192.168.1.13/24
Bridge 模式:eth1 DHCP
Kolla branch master
Kolla-ansible branch master
OpenStack Version 6.0.0
部署须知:
建议最小化安装 CentOS 7.4,并以 root 用户完成所有操作
有一些软件源没有国内镜像,建议科学上网
本文面向 Kolla 入门者和开发者,采用 centos+source 的 For development & All-In-One 部署方式
eth1 被用于 Neutron Ext Network,被放到 Linux Network Namespace qrouter-XXXX 后,会导致网络断开
理论上 eth0 和 eth1 都需要连通外网,但根据部署需求 eth1 允许不通外网
需要始终保持 eth0 的内外网互通性,并建议使用 eth0 进行 ssh 连接
Troubleshooting List 位于文末
准备操作系统基础环境
安装系统基础依赖包:
yum install epel-release -yyum update -yyum upgrade -yyum install python-pip python-devel libffi-devel gcc openssl-devel libselinux-python vim git wget -y
惯例开启 NTP 时间同步服务:
systemctl enable ntpd.service && systemctl start ntpd.service && systemctl status ntpd.service
惯例关闭防火墙服务:
systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld
禁用宿主机的 Libvirt 服务:
systemctl stop libvirtd.service && systemctl disable libvirtd.service && systemctl status libvirtd.service
Tips:建议此处上快照
准备 Python 基础环境
安装基础依赖包:
pip install -U pip pip install -U ansible pip install -U tox pip install -U python-openstackclient python-neutronclientpip install -U docker pip install -U jinja2
Tips:下列软件包版本是 ERROR 高发区,如果出现疑似依赖包版本的问题,不妨查看一番。
docker>=2.0
jinja 2>=2.10
ansible>= 2.0
确保没有安装 docker-py
ps:使用 docker 代替 docker-py
修改 ansible 配置文件:
mkdir /etc/ansible vim /etc/ansible/ansible.cfg [defaults]host_key_checking=Falsepipelining=Trueforks=100deprecation_warnings=False
准备 Docker 基础环境
安装 Docker:
curl -SSL https://get.docker.io | bash
开启 Docker 的 shared mount 共享挂载功能:
mkdir /etc/systemd/system/docker.service.d tee /etc/systemd/system/docker.service.d/kolla.conf << 'EOF'[Service] MountFlags=shared EOF
启动 Docker 服务:
systemctl daemon-reloadsystemctl enable docker systemctl restart docker
安装 kolla & kolla-ansible
Tips:这里使用两个沙盒环境,建议在不同的终端内操作,避免错乱
安装 Kolla:
virtualenv kolla_env source kolla_env/bin/activate git clone https://github.com/openstack/kollacd kolla pip install -r requirements.txt -r test-requirements.txt -e .tox -egenconfigmkdir /etc/kolla/cp etc/kolla/kolla-build.conf /etc/kolla/
编辑 kolla-build.conf:该配置文件用于控制 kolla build 的过程,这里设定 centos+source 部署方式
vim /etc/kolla/kolla-build.conf [DEFAULT]base = centosinstall_type = sourcenamespace = kollapush = false# The Docker Images tag (string value)tag = 6.0.0
安装 Kolla-ansible:
virtualenv kolla-ansible_envsource kolla-ansible_env/bin/activate git clone https://github.com/openstack/kolla-ansiblecd kolla-ansiblepip install -r requirements.txt -r test-requirements.txt -e .cp etc/kolla/globals.yml /etc/kolla/cp etc/kolla/passwords.yml /etc/kolla/
编辑 passwords.yml:该文件用于设定 OpenStack Services 的各种密码,这里仅设定 admin 管理员登陆密码
vim /etc/kolla/passwords.ymlkeystone_admin_password: fanguiju
编辑 globals.yml:这是最重要的配置文件,用于设定 Deploy 操作的细节
vim /etc/kolla/globals.yml kolla_dev_mode: "yes"network_interface: "eth0"neutron_external_interface: "eth1"kolla_internal_vip_address: "192.168.1.15"kolla_base_distro: "centos"kolla_install_type: "source"docker_registry: ""docker_namespace: "kolla"openstack_logging_debug: "true"enable_cinder: "no"enable_heat: "no"# Valid option is Docker repository tagopenstack_release: "6.0.0"
kolla_dev_mode: "yes"
:启用开发者模式
NOTE:passwords.yml tag
和 globals.yml openstack_release
的项目值必须保持一致,否则 Kolla Build 的 Images 不会被 Kolla-ansible Deploy 使用。
修改 Hypervisor Type:因为在 VirtualMachine 里部署 OpenStack,存在嵌套虚拟化不支持 KVM 的问题,如果你希望启动 OpenStack Instance,就需要把使用 QEMU(Default 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 Build Images
cd kolla/tools ./build.py -p default
参数项
-p default
对应 kolla-build.conf 的 [profiles] Sections,Default images 表示仅 Build 主要的 Images。
[profiles]# From kolla # Infra images (list value) #infra = ceph,certmonger,cron,elasticsearch,etcd,fluentd,haproxy,keepalived,kibana,kolla-toolbox,mariadb,memcached,mongodb,opendaylight,openvswitch,ptp,qdrouterd,rabbitmq,redis,rsyslog,skydive,tgtd # Main images (list value) #main = ceilometer,cinder,glance,heat,horizon,iscsi,keystone,neutron,nova-,swift # Aux Images (list value) #aux = almanach,aodh,blazar,cloudkitty,congress,designate,dragonflow,ec2-api,freezer,gnocchi,influxdb,ironic,kafka,karbor,kuryr,magnum,manila,mistral,monasca,murano,novajoin,octavia,panko,rally,redis,sahara,searchlight,senlin,solum,tacker,telegraf,trove,vitrage,zaqar,zookeeper,zun # Default images (list value) #default = chrony,cron,kolla-toolbox,fluentd,glance,haproxy,heat,horizon,keepalived,keystone,mariadb,memcached,neutron,nova-,openvswitch,rabbitmq # Gate images (list value) #gate = chrony,cron,fluentd,glance,haproxy,horizon,keepalived,keystone,kolla-toolbox,mariadb,memcached,neutron,nova-,openvswitch,rabbitmq
接下来需要一段漫长的镜像构建时间,如果出现异常中断现象,可重复执行。赖于 Docker Build 的 Cache 功能,能为 Re-Build 追回不少时间。
但有些情况,错误的配置参数可能也会被 Cache 住,这时建议执行 Clean 操作:
# 从系统中移除部署的容器tools/cleanup-containers# 移除由于残余网络变化引发 docker 启动的 neutron-agents 主机tools/cleanup-host# 从 Cache 中移除所有的 docker imagetools/cleanup-images
Build Successfully:
查看镜像列表:
从上图可见,Kolla Build 出来的 Images 通常具有四层,镜像分层可以更好地对环境依赖集进行抽象,降低依赖包重复率,提高镜像传输率。简而言之,有点 “代码复用” 的意味。
Base image:最基础的操作系统环境,几乎是所有 Images 的基础环境。
openstack-base image:OpenStack All Service 的基础环境,安装了 OpenStack Service 级别的依赖集。
<project>
-base image:OpenStack Service 的基础环境,安装了 Project 级别的依赖集。<service>
image:一个具体 Service 最后的特异性依赖集,并设置了服务启动入口。
Kolla 是根据 Jinja2 Template 语法生成的 Dockerfile 文件来引导镜像构建的,所以如果你有个性化的定制需求可以通过编辑镜像的 Dockerfile.j2 实现:
vim /root/kolla/docker/nova/nova-api/Dockerfile.j2
Kolla-ansible Deploy OpenStack
Kolla-ansible 通过提供一个完整的 Ansible Playbook 来引导部署这些 Images,并且同时提供了 all-in-one 和 multihost 两种部署模式。
cd kolla-ansible/cp ansible/inventory/* ~$ ll ~-rw-r--r-- 1 root root 8292 May 28 09:43 all-in-one-rw-r--r-- 1 root root 8766 May 28 09:43 multinode
在正式 Deploy 之前,还需要进行一些准备工作:
Step 1. 自动生成随机密码,填充 passwords.yml 文件配置项
kolla-genpwd
Step 2. 处理 bootstrap servers 所需要的依赖
cd kolla-ansible/tools./kolla-ansible -i ~/all-in-one bootstrap-servers
Step 3. Deploy 环境预检查
./kolla-ansible -i ~/all-in-one prechecks
Tips:做 prechecks 环境检查前需要完成 kolla-genpwd
正式开始 Deploy OpenStack:
./kolla-ansible -i ~/all-in-one deploy
成功 Deploy 之后,查看 Container 状态:
Tips:horizon project 通常是最后部署的。
NOTE:
从上图可见,Service Container 实际上是由 kolla_start 脚本启动起来的
因为 Kolla 使用的是 –net=host 网络,所以没有必要做端口映射
检验 & 使用
生成 /etc/kolla/admin-openrc.sh 文件:该文件用于 Export Keystone Auth 环境变量
./kolla-ansible post-deploy
初始化运行环境:会自动执行下列操作
Creating glance image.
Configuring neutron.
Generating ssh key.
Configuring nova public key and quotas.
NOTE:如果你希望 External Network 能够正常运行,还需要编辑初始化脚本 init-runonce 中的网络配置,设定为 eth1 的网络信息。
e.g. eth1 IP:172.16.0.10/24
# This EXT_NET_CIDR is your public network,that you want to connect to the internet via.EXT_NET_CIDR='172.16.0.0/24'EXT_NET_RANGE='start=172.16.0.100,end=172.16.0.200'EXT_NET_GATEWAY='172.16.0.1'
这样,Instance Floating IP 才能够利用 qrouter-XXXX 中的 iptables 进行 NAT 转发。
source /etc/kolla/admin-openrc.sh./init-runonce
创建虚拟机:
openstack server create \ --image cirros \ --flavor m1.tiny \ --key-name mykey \ --network demo-net \ demo1
**清理环境:完全清理部署好的 OpenStack Container
kolla-ansible destroy -i all-in-one --yes-i-really-really-mean-it
最后
NOTE 1:实际上,Kolla-ansible 和 Kolla-kubernetes 是支持独立部署的(不依赖 Kolla),它们实现了检测和构建 Images 的策略。如果 Deploy 时,镜像没有 Ready,则会远程 Pull Images。不过这样做的速度是比较慢的,而且 Pull 下来的 Images 未必包含有最新的 Commit,所以建议使用 Kolla 在本地构建镜像。查看 Kollaglue Repo 提供的 Docker 镜像:
docker search kollaglue
Building Container Images,请参考:
https://docs.openstack.org/kolla/latest/admin/index.html#building-container-images
Docker Hub,请参考:
https://hub.docker.com/u/kollaglue/
NOTE 2:如果你希望使用 Kolla 进行多节点部署,那么还需要依赖 Local Docker Register 服务器,构建 Docker 私有仓库,请参考:
https://docs.openstack.org/kolla-ansible/latest/user/multinode.html
参考文档
https://docs.openstack.org/kolla/latest/
http://xcodest.me/kolla-aio-install.html
http://www.chenshake.com/kolla-installation/
https://blog.csdn.net/karamos/article/details/80122218
https://my.oschina.net/LastRitter/blog/1617079
http://xcodest.me/kolla-queens-and-rocky.html
Troubleshooting List
ERROR 1:
Cannot uninstall 'requests'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall
TS 1:因为 requests
包被系统环境依赖,不能卸载,也不需要卸载,跳过即可。
pip install -U python-openstackclient python-neutronclient --ignore-installed requests
ERROR 2:
https://packagecloud.io/grafana/stable/el/7/x86_64/repodata/repomd.xml: [Errno 14] HTTPS Error 302 - Found
TS 2:网络不可达,请科学上网或随缘安装。
ERROR 3:
TASK [neutron : Checking tenant network types] ****************************************************************************************fatal: [controller]: FAILED! => {"msg": "The conditional check 'item not in type_drivers' failed. The error was: An unhandled exception occurred while templating '{{ neutron_type_drivers.replace(' ', '').split(',') | reject('equalto', '') | list }}'. Error was a <class 'jinja2.exceptions.TemplateRuntimeError'>, original message: no test named 'equalto'\n\nThe error appears to have been in '/root/venv/share/kolla-ansible/ansible/roles/neutron/tasks/precheck.yml': line 41, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Checking tenant network types\n ^ here\n”}
TS 3:Jinja2 版本过低不支持 reject,需要高于 2.8。
ERROR 4:Deploy 过程中重复 Build 镜像
TS 4:kolla 和 kolla-ansible 指定的 Docker Image Tag 不一致。
热门评论
请问Bridge 模式:eth1 DHCP 这个代表什么呢