那么,安装 OpenStack 都有哪些方法呢?对于很多刚接触 OpenStack 的新人而言,安装无疑是一大挑战,同时也直接提高了学习 OpenStack 云计算的技术门槛。
安装 OpenStack 有哪些方式
在相当长一段时间内,DevStack 仍将是众多开发者的首选安装工具。该方式主要是通过配置一个安装脚本,执行 Shell 命令来安装 OpenStack 的开发环境,支持 CentOS、Debian 等系列系统。
RDO 是由 Red Hat 红帽开源的一个自动化部署 OpenStack 的工具,支持单节点(All-in-One)和多节点(Multi-Node)部署。但 RDO 只支持 CentOS 系列操作系统。需要注意的是,该项目并不属于 OpenStack 官方社区项目。
按照社区官方提供的文档,可以使用手动方式部署单节点、多节点、HA 节点环境。
Puppet 由 Ruby 语言编写。Puppet 是进入 OpenStack 自动化部署中早期的一个项目。目前,它的活跃开发群体是 Red Hat、Mirantis、UnitedStack 等。
Mirantis 出品的 Fuel 部署工具,其大量的模块代码使用的便是 Puppet。
5. Ansible
Ansible 是一个自动化部署配置管理工具,已被 Red Hat 收购。它基于 Python 开发,集合了众多运维工具(Puppet、Chef、SaltStack 等)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。Ansible 一方面总结了 Puppet 设计上的得失,另一方面也改进了很多设计。比如基于 SSH 方式工作,故而不需要在被控端安装客户端。
6. SaltStack
SaltStack 也是一个开源的自动化部署工具,基于 Python 开发,实现了批量系统配置、批量程序部署、批量运行命令等功能,和 Ansible 很相似。不同之处是,由于 SaltStack 的 Master 和 Minion 认证机制及工作方式,因此需要在被控端安装 Minion 客户端。
7. TripleO
TripleO 项目最早由 HP 于2013年4月在 Launchpad 上注册 BP,用于完成 OpenStack 的安装与部署。TripleO 全称为“OpenStack On OpenStack”,意思为“云上云”,可以简单理解为利用 OpenStack 来部署 OpenStack,即首先基于 V2P(和 P2V 相反,指把虚拟机的镜像迁移到物理机上)的理念事先准备好一些 OpenStack 节点(计算、存储、控制节点)的镜像,然后利用已有 OpenStack 环境的 Ironic 裸机服务和软件安装部分的 diskimage-builder 部署裸机,最后通过 Heat 项目和镜像内的自动化部署工具(Puppet 或 Chef)在裸机上配置运行 OpenStack。和其他部署工具不同的是,TripleO 是利用 OpenStack 已有的基础设施来部署 OpenStack 的。
8. Fuel
Fuel 是针对 OpenStack 的一个可以通过“界面部署”的工具,它大量采用了 Python、Ruby 和 JavaScript 等语言。其功能涵盖了通过自动化 PXE 方式安装操作系统、DHCP 服务、Orchestration 编排服务和 Puppet 安装相关服务等,此外还有 OpenStack 关键业务健康检查和 log 实时查看等非常好用的功能。
9.Kolla
上面说了这么多,现在终于轮到主角上场了——Kolla。Kolla 是具有广阔应用前景和市场的一个自动化部署工具。相比于其他部署工具,Kolla 完全革新地使用了 Docker 容器技术,将每一个 OpenStack 服务运行在不同的 Docker 容器中。
以前,我们要想在 OpenStack 版本发布后或者在版本开发过程中,立即安装体验等只能使用 DevStack 源码方式安装。但现在更多了一种新的选择——即使用 Kolla。
该项目由思科于2014年9月提出,是 OpenStack 社区“Big Tent”开发模式下的项目。Kolla 的优势和使用场景体现在如下几个方面:
- 原子性升级或者回退 OpenStack 部署。
- 基于组件升级 OpenStack。
- 基于组件回退 OpenStack。
具体而言,Kolla 的最终目标是为 OpenStack 的每一个服务都创建一个对应的 Docker镜像,通过 Docker 镜像将升级的粒度减小到服务级别,从而在升级时对 OpenStack 的影响降到最小,并且一旦升级失败,也很容易回滚。
升级只需要三步:拉取新版本的容器镜像,停止老版本的容器服务,启动新版本的容器。回滚也不需要重新安装包,直接启动老版本的容器服务就行,非常方便。
Kolla 可以使用 Ansible、Kubernetes 或者 Mesos 来部署 OpenStack 环境,Kolla 负责容器化 OpenStack 各个服务;后者则负责部署这些容器,搭建出一个可用的 OpenStack 环境。来实现基于 Docker 容器的 OpenStack 服务全生命周期管理,如安装、升级、回滚、迁移等。
在部署 Docker 容器时,默认的网络配置都是 Host 模式。因为 Kolla 的 Docker 镜像粒度很小,它针对每个 OpenStack 服务都有特定的镜像,所以我们也可以通过 Docker 命令来操作某个具体的 OpenStack 服务。
Kolla项目,及其相关的其他项目,如下:
- Kolla 项目:负责Docker build OpenStack每个服务,如 nova-compute 容器等;
- Kolla-Ansible 项目:使用 Ansible 部署这些容器,搭建 OpenStack 环境;
- Kolla-Kubernetes 项目:使用 Kubernetes 部署这些容器,搭建 OpenStack 环境;
- Kolla-Mesos 项目:使用 Mesos 部署这些容器,搭建 OpenStack 环境。
简言而之,Kolla 就是 OpenStack 社区的一个用于Docker build容器化 OpenStack 服务的项目,最后,使用其他的社区项目,即 kolla-ansible 或者 kolla-kubernetes 执行部署任务。
Kolla 为 OpenStack 的部署提供了有效、快捷、方便、易于维护、方便版本更新与回退的方案。基于 Docker 容器部署和运维的 OpenStack 架构,如下图所示:
Kolla 所涉及到的技术点有:
- Docker
- Ansible
- Python
- docker-py
- Jinja2
Kolla 支持部署 HA 高可用性的 OpenStack 环境,如下图所示,大家应该一看就明白吧。是的,正如其他 OpenStack HA 部署方案一样,如 MySQL 采用的是 Galera 等。
目前,Kolla 提供的镜像支持部署如下 OpenStack 项目,包括但不限于:
- Aodh
- Ceilometer
- Cinder
- Designate
- Glance
- Gnocchi
- Heat
- Horizon
- Ironic
- Keystone
- Magnum
- Mistral
- Murano
- Nova
- Neutron
- Swift
- Tempest
- Zaqar
以及这些基础设施组件:
- Ceph 分布式存储
- Openvswitch 和 Linuxbridge
- MongoDB 数据库
- RabbitMQ 消息队列服务
- HAProxy 和 Keepalived 服务高可用组件
- MariaDB 数据库等
Kolla 的 Docker 镜像制作,支持红帽的 RPM 包,Ubuntu 和 Debian 的 Deb 包,还能支持源码的方式。理论上源码制作的镜像,可以运行在所有的支持容器的操作系统上。
我们可以选择 Ansible 来做容器的管理,也可以选择 Kubernetes 或 Mesos 来管理。目前 Ansible 已经比较完善,Kubernetes 和 Mesos 还在积极开发中。
但我个人感觉,Kubernetes 会是未来一段时间的新宠儿,但是它对使用/管理人员的要求会比较高。
Kolla解决的问题
过去,无论是个人还是公司尝试使用 OpenStack,在安装和部署,都花费和消耗大量的精力。这其实也是影响 OpenStack 推广的一个重要障碍。如何让大家从部署的枷锁中解放出来,用好 OpenStack,才能真正体现出 OpenStack 的价值。
一般安装好操作系统后,采用 Kolla 部署 OpenStack 环境,大概只需要30分钟的时间,就可以搭建完成 OpenStack。社区的各种最佳实践,高可用等都集成在上面。Kolla 让 OpenStack 的部署、升级变得更加的优雅。
所谓软件的升级就是把以前老的删掉,再装新的版本。如果你是采用包的安装,例如 Rdo,那就非常的痛苦了。如果没有其他定制化开发的需求,使用社区提供的已构建好的OpenStack 镜像即可。
kolla 容器化部署 OpenStack
OpenStack 官方建议:OpenStack 和 Ceph 管理网、外网使用 10Gig 网络;OpenStack 和 Ceph 数据集群、业务网使用高性能、高可用的网络,防止其成为环境的瓶颈,从而影响整个集群的数据一致性和性能。
部署环境,信息如下所示。
(1)Centos7.2 系统最小化安装;关闭 SElinux、Firewalld、NetworkManager(在所有节点上执行)。安装依赖
代码语言:javascript复制#systemctl stop NetworkManager && systemctl disable NetworkManager#sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config#systemctl disable firewalld#reboot
(2)加入 Docker 的 repo 源(在所有节点上执行):
代码语言:javascript复制# tee /etc/yum.repos.d/docker.repo << 'EOF'[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
(3)配置各节点的 /etc/hosts 文件,使各节点均能通过 hostname 互相 ping 通,如下(在所有节点上执行):
代码语言:javascript复制# cat /etc/hosts192.168.108.240 OpenStack_Control1-Ceph192.168.108.243 OpenStack_Compute1-Ceph192.168.108.249 OpenStack_Compute2-Ceph
(4)机器均做免密钥登录,在控制节点上,执行如下命令:
代码语言:javascript复制# ssh-keygen //一路回车# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.108.243# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.108.249
其他节点,依次类推。
安装和配置 Docker 服务
(1)安装基础包(在所有节点上执行):
代码语言:javascript复制yum -y install epel-releaseyum install python-devel libffi-devel gcc openssl-devel git ansible python-pip -y
pip install --upgrade pip
(2)安装 Docker 1.12.5(在所有节点上执行):
代码语言:javascript复制yum install docker-engine-1.12.5 docker-engine-selinux-1.12.5 -y
(3)设置 Docker(在所有节点上执行):
代码语言:javascript复制mkdir /etc/systemd/system/docker.service.d
tee /etc/systemd/system/docker.service.d/kolla.conf << 'EOF'[Service]
MountFlags=shared
EOF
(4)编辑 /usr/lib/systemd/system/docker.service 文件(在所有节点上执行):
代码语言:javascript复制#ExecStart =/usr/bin/dockerdExecStart=/usr/bin/dockerd --insecure-registry 192.168.108.240:4000
(5)重启 Docker 服务(在所有节点上执行):
代码语言:javascript复制systemctl daemon-reload && systemctl restart docker
systemctl enable docker
(6)在控制节点上,配置阿里云的 Docker 加速器,加快 pull registry 镜像。
代码语言:javascript复制mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://a5aghnme.mirror.aliyuncs.com"]
}
EOF
再重启下Docker服务:
代码语言:javascript复制systemctl daemon-reload && systemctl restart docker
(7)默认 Docker 的 Registry 是使用5000端口,对于 OpenStack 来说,有端口冲突,所以需要改成4000。在控制节点上,Pull 并启动 registry 镜像。
代码语言:javascript复制docker run -d -v /opt/registry:/var/lib/registry -p 4000:5000
--restart=always --name registry registry:2
安装和配置 Kolla-ansible
(1)这里,下载使用 Kolla 社区的 Ocata 版本镜像(免去在本地环境 Docker build 的过程,大大加快安装时间)。在控制节点上执行:
代码语言:javascript复制wget http://tarballs.openstack.org/kolla/images/centos- source-registry-ocata.tar.gz
tar zxvf centos-source-registry-ocata.tar.gz -C /opt/registry/
(2)安装 kolla 和 ansible。在控制节点上执行:
代码语言:javascript复制cd /home
git clone https://github.com/openstack/kolla-ansible -b stable/ocata
pip install kolla-ansible/
(3)复制相关文件,在控制节点上执行:
代码语言:javascript复制cp -r kolla-ansible/etc/kolla /etc/kolla/cp kolla-ansible/ansible/inventory/* /home/
说明:如果是在虚拟机里安装 Kolla,希望可以在 OpenStack 平台上创建虚拟机,那么你需要在 globals.yml 文件中把 novacomputevirt_type 配置项设置为 qemu,默认是 KVM。
(4)生成密码文件。在控制节点上执行:
代码语言:javascript复制kolla-genpwd
(5)编辑 /etc/kolla/passwords.yml 文件,配置 keystone 管理员用户的密码。在控制节点上执行:
代码语言:javascript复制keystone_admin_password: password
同时,也是登录 Dashboard,admin 使用的密码,你可以根据自己需要进行修改。
(6)编辑 /etc/kolla/globals.yml 配置文件。在控制节点上执行:
代码语言:javascript复制# egrep "^[^#]" /etc/kolla/globals.yml ---
kolla_install_type: "source"kolla_internal_vip_address: "192.168.108.240" //访问Dashboard的地址docker_registry: "192.168.108.240:4000"docker_namespace: "lokolla"network_interface: "eth2" //网卡IP地址为192.168.108.240neutron_external_interface: "eth0" //该网卡为外网不配置IP地址storage_interface: "eth2" //Ceph公共网络cluster_interface: "bond0" //Ceph集群/数据网络enable_aodh: "yes"enable_chrony: "yes"enable_ceilometer: "yes"enable_ceph: "yes"enable_ceph_rgw: "yes"enable_ceph_rgw_keystone: "yes"enable_cinder: "yes"enable_cloudkitty: "yes"enable_gnocchi: "yes"enable_horizon_cloudkitty: "{{ enable_cloudkitty | bool }}"enable_horizon_magnum: "{{ enable_magnum | bool }}"enable_horizon_murano: "{{ enable_murano | bool }}"enable_hyperv: "yes"enable_magnum: "yes"enable_mongodb: "yes"enable_murano: "yes"enable_neutron_lbaas: "yes"enable_neutron_fwaas: "yes"enable_neutron_qos: "yes"glance_backend_ceph: "yes"cinder_backend_ceph: "{{ enable_ceph }}"nova_backend_ceph: "{{ enable_ceph }}"
(7)将 Ceph 安装在 Docker 容器中,故此,对节点上的磁盘打标签。此处,将 SDB、SDC、SDE SATA 盘用于 Ceph OSD,SDD 盘则用于 Ceph Journal盘。Kolla 对 Ceph 的 OSD 及日志盘的识别是通过卷标来实现的。如 OSD 的卷标为 KOLLACEPHOSDBOOTSTRAP,Journal 的卷标为 KOLLACEPHOSDBOOTSTRAP_J。
将SDB、SDC 和 SDE盘,格式化为Ceph OSD盘,如下,在控制节点上执行:(注意:OSD 盘和 Journal 盘分区名称,在所有机器上,都不能同名,切记)
代码语言:javascript复制parted /dev/sdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_1 1 -1
parted /dev/sdc -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_2 1 -1
parted /dev/sde -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_3 1 -1
将 SDD 盘,格式化为 Ceph Journal 盘,每个分区对应于一个 OSD,每个分区大小为70G(根据 SDD 盘总容量来平均分摊)。如下,在控制节点上执行:
代码语言:javascript复制parted /dev/sdd -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_1_J 2048 70G
parted /dev/sdd -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_2_J 70G 140G
parted /dev/sdd -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_3_J 140G 220G
在其他节点上,也重复此操作,分区序号请依次递增。
查看命令的结果:
代码语言:javascript复制# parted /dev/sdd print
(8)配置 ceph.conf 文件,在控制节点上执行:
代码语言:javascript复制# mkdir /etc/kolla/config# vim /etc/kolla/config/ceph.conf[global]
osd pool default size = 2 //此处写2,表示2副本,如果只有一个OSD节点就写1osd pool default min size = 2
(9)可选。检查 Kolla 节点的镜像是否可用,从而验证 Kolla 环境部署成功。在控制节点上执行:
代码语言:javascript复制# curl http://192.168.108.240:4000/v2/_catalog
(10)编辑 ansible 的部署文件。在控制节点上执行:
代码语言:javascript复制# vim /home/multinode[control]
OpenStack_Control1-Ceph
[network]
OpenStack_Control1-Ceph
[compute]
OpenStack_Compute1-Ceph
OpenStack_Compute2-Ceph
[monitoring]
OpenStack_Control1-Ceph
[storage]
OpenStack_Control1-Ceph
OpenStack_Compute1-Ceph
OpenStack_Compute2-Ceph
[ceph-mon:children]
storage
执行 ansible 安装 OpenStack
建议,在执行安装命令前,先使用 kolla-ansible --help 命令,了解下kolla-ansible 支持的具体命令或参数。
以下步骤,均在控制节点上执行。
编辑 /usr/share/kolla-ansible/ansible/groupvars/all.yml 文件,设置enablehaproxy 参数为no。
代码语言:javascript复制enable_haproxy: "no"
(1)运行 prechecks 检查配置是否正确,如果有错误,可以先忽略。
代码语言:javascript复制# kolla-ansible prechecks -i /home/multinode -vvvv
(2)执行安装 OpenStack 的命令。
代码语言:javascript复制kolla-ansible deploy -i /home/multinode -vvvv
(3)安装结束后,创建环境变量文件。
代码语言:javascript复制kolla-ansible post-deploy
这样就创建了/etc/kolla/admin-openrc.sh 环境变量文件。
(4)安装 OpenStack Client 端。
代码语言:javascript复制pip install python-openstackclient
(5)根据官方建议,部署成功后,删除 Ceph 默认创建的 RDB 存储池。
代码语言:javascript复制docker exec ceph_mon ceph osd pool delete rbd rbd --yes-i-really-really-mean-it
(6)主机上,Ceph 的配置文件位于:
- /var/lib/docker/volumes/cephmonconfig
- /etc/kolla/ceph-xxx
(7)查看 Ceph 服务状态,看是否正常运行:
代码语言:javascript复制docker exec -it ceph_mon ceph -s
执行效果如下图所示:
代码语言:javascript复制docker exec -it ceph_mon ceph osd tree
执行效果如下图所示:
验证部署
登录 Dashboard,URL为:http://192.168.108.240,用户名为 admin,密码为 password。
(1)如果部署了 Ceph,则将镜像格式由 qcow2 改为 raw 格式:
代码语言:javascript复制# wget -c http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img# yum install qemu-img -y# qemu-img convert -f qcow2 -O raw cirros-0.3.4-x86_64-disk.img cirros-0.3.4-x86_64-disk.raw# qemu-img info cirros-0.3.4-x86_64-disk.raw
(2)运行命令:
代码语言:javascript复制# source /etc/kolla/admin-openrc.sh# glance image-create --name cirros --disk-format=raw --container-format=bare --visibility public --file=./cirros-0.3.4-x86_64-disk.raw
这个时候,你可以登录 Dashboard,创建网络、安全组、云硬盘和虚拟机等等了。结果如下图所示。
给虚拟机绑定 floating ip 后,ping 其 floating ip,如下图所示,可 ping 通。
部署经验
(1)如果,在部署过程中失败了,亦或是变更了配置信息,需要重新部署,则执行如下命令,清除掉已部署的 Docker 容器,即 OpenStack 服务。
代码语言:javascript复制kolla-ansible destroy -i /home/multinode --yes-i-really-really-mean-it
接着,umount 卸掉 Ceph OSD 挂载的目录,如 /dev/sdb1。
代码语言:javascript复制umount /dev/sdb1
删除掉 /var/lib/ceph 目录下的 OSD 文件:
代码语言:javascript复制rm -rf /var/lib/ceph/osd/*
删除掉 OSD 盘的分区,如 /dev/sdb:
代码语言:javascript复制parted /dev/sdb rm 1 rm 2
重新对 OSD 盘进行分区,如 /dev/sdb:
代码语言:javascript复制parted /dev/sdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_1 1 -1
最后,执行部署命令即可。
(2)除此外,还有一些小工具,在需要时,可以使用。
- kolla-ansible prechecks:在执行部署命令之前,先检查环境是否正确;
- tools/cleanup-containers:可用于从系统中移除部署的容器;
- tools/cleanup-host:可用于移除由于网络变化引发的 Docker 启动的neutron-agents 主机;
- tools/cleanup-images:可用于从本地缓存中移除所有的 Docker image。
最后,可以使用 docker ps -a
命令查看到安装的 OpenStack 所有服务的容器。
故障诊断与排除
通过 Kolla 和 Ansible 部署或运行 OpenStack 环境时,如果出现问题,通常可以使用如下一些方法来排查/解决。
(1)查看指定容器(即指定的服务)的输出日志信息。
代码语言:javascript复制docker logs container_name
(2)进入到 fluentd 日志收集容器里,查看指定服务的日志。
代码语言:javascript复制docker exec -it fluentd bash
接着,CD 到 /var/log/kolla/SERVICE_NAME 目录下。
(3)还可以,直接 CD 到主机的 /var/lib/docker/volumes/kollalogs/data/ 目录下,查看指定服务的日志信息。
(4)一些 Ceph的管理命令,如下:
- docker exec -it ceph_mon ceph osd pool ls
- docker exec -it ceph_mon ceph -s
- docker exec -it ceph_mon rbd ls images
- docker exec -it ceph_mon rbd ls volumes
- docker exec -it ceph_mon rbd ls vms
当然,也可以直接进入到 Ceph 容器中,直接执行相关命令,如下所示。
代码语言:javascript复制# docker exec -it -u root ceph_mon bash
查看OSD状态和Ceph集群状态:
代码语言:javascript复制ceph osd tree
ceph health
ceph -s
查看 Ceph 的实时运行状态:
代码语言:javascript复制ceph -w
查看 Ceph 存储空间:
代码语言:javascript复制ceph df
ceph osd df
查看 Ceph 集群monitor信息:
代码语言:javascript复制ceph mon statceph osd dump |grep pool
要检查监视器的法定人数状态,执行下面的命令:
代码语言:javascript复制ceph quorum_status
查看OSD Journal分区大小:
代码语言:javascript复制ceph --show-config|grep osd_journal_size
作者说:
OpenStack 是当下炽手可热的 IaaS 开源云计算项目,使用 OpenStack 可满足企业各种云服务需求,如私有云、混合云或公有云。通过本系列教程的学习,即使是一个初入云计算的行业者也能迅速熟悉和掌握 OpenStack 的相关技术,提高职业竞争力,成为一名复合型人才。