手记

Kolla 让 OpenStack 部署更贴心

Kolla 简介

长久以来 OpenStack 部署难、 升级难的问题经常为人诟病,简单、便捷、高效的部署升级方案是所有 OpenStack 用户(客户、云服务提供商、开发者)的共性刚需。Kolla 正是应需而生,它基于社区的最佳实践,提出了可靠、可扩展的生产级别 OpenStack Service Containers 部署方式。

简单来说,Kolla 就是充分应用容器特性,实现容器化部署 OpenStack 服务的 DevOps 工具。

Kolla 显著的特点是「开箱即用」「简易升级」,前者由编排工具(Ansible/Kubernetes)提供自动化支撑,后者则完全是 Container 的功劳。Kolla 追求为每一个 OpenStack Service 都构建相应的 Container,将升级/回滚的粒度(隔离依赖关系集)降维到 Service 或 Project 级别,实现升级/回滚的原子性。假若升级失败,则直接启动 Old Version Container 完成回滚。版本升级只需三步:

  1. Pull New Docker Image

  2. Stop Old Docker Container

  3. 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

部署须知

  1. 建议最小化安装 CentOS 7.4,并以 root 用户完成所有操作

  2. 有一些软件源没有国内镜像,建议科学上网

  3. 本文面向 Kolla 入门者和开发者,采用 centos+source 的 For development & All-In-One 部署方式

  4. eth1 被用于 Neutron Ext Network,被放到 Linux Network Namespace qrouter-XXXX 后,会导致网络断开

  5. 理论上 eth0 和 eth1 都需要连通外网,但根据部署需求 eth1 允许不通外网

  6. 需要始终保持 eth0 的内外网互通性,并建议使用 eth0 进行 ssh 连接

  7. 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

  1. 从上图可见,Service Container 实际上是由 kolla_start 脚本启动起来的

  2. 因为 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 不一致。

镜像分层示意图

原文出处

1人推荐
随时随地看视频
慕课网APP

热门评论

请问Bridge 模式:eth1 DHCP 这个代表什么呢

查看全部评论