开头语

前段时间对公司测试环境进行了重构,将虚拟化技术从KVM改为了OpenStack集群,并结合了CEPH存储。目前整个集群承担着Dev和测试环境的运行,以及公司内部服务,如Wiki,Git等,目前已稳定运行了一段时间。在部署的整个过程以及使用的这段时间,产生了一些心得也积累了些经验,想分享给更多需要的朋友。考虑到OpenStack组件较多,一篇文章的篇幅不足以概括,所以会以系列专栏的形式呈现出来。

OpenStack是什么?

OpenStack 是一个适用于所有云环境、旨在实现简单、可扩展性强、功能丰富的开源云计算平台。自2010年NASA(美国国家航空航天局)和Rackspace共同发起后,到现在其开发人员遍及世界各地,已成长为全球第二大开源社区。

OpenStack通过一组相互关联的服务提供基础架构即服务(IaaS)解决方案。每个服务都提供了API来实现服务间调用。根据需要,您可以安装部分或全部服务。

服务与项目名称对照表

OpenStack的服务名和项目名称是不一样的,以下是笔者基于Queens版本梳理出的核心服务和项目对应关系及描述:

Service Project Name Description
Dashboard Horizon 提供基于 Web 的自助服务门户,以便与底层 OpenStack 服务进行交互,例如启动实例,分配IP地址和配置访问控制。
Compute Service Nova 在 OpenStack 环境中管理虚拟实例的生命周期。职责包括按需产生,调度和停用虚拟机。
Networking Service Neutron 为其他 OpenStack 服务组件启用网络连接服务,例如 OpenStack Compute。为用户提供一个API来定义网络及其附件。具有支持许多流行网络供应商和技术的可插拔架构。
Object Storage Service Swift 对象存储服务,通过基于HTTP的 RESTful API 来存储和检索任意的非结构化数据对象。高度的容错及多副本存储。
Block Storage Service Cinder 为运行的实例提供块存储。
Identity Service Keystone 为其他 OpenStack 服务提供认证和授权服务。能列出所有 OpenStack 服务的端点目录。也是需要最先部署的组件。
Image Service Glance 镜像存储检索服务。
Telemetry Service Ceilometer 计费服务。
Orchestration Service Heat 编排服务。
Database Service Trove 为关系数据库和非关系数据库引擎提供可伸缩和可靠的云数据库即服务功能。
Data Processing Service Sahara 通过指定 Hadoop 版本,集群拓扑和节点硬件信息等参数,提供在 OpenStack 中配置和扩展 Hadoop 群集的功能。

架构

介绍了核心服务功能,我们来看看 OpenStack 的架构,下图是 OpenStack 的概念架构:
要设计、部署和配置 OpenStack,运维人员必须了解它的逻辑体系结构。

OpenStack核心组件原理与应用一_第1张图片

如上图的概念架构所示,OpenStack 由几个独立部分共同组成了 OpenStack 服务。所有服务都通过 Keystone 组件进行身份验证。

在内部,OpenStack 服务由多个进程组成。所有服务都至少有一个API进程,它监听其他API的请求,预处理它们并将它们传递给服务的其他部分。除身份服务外,实际工作由不同的进程完成。进程间的通信采用消息队列,进程的状态存储在数据库中。

用户可以通过 Horizon Dashboard、命令行客户端以及浏览器插件或 curl 等工具发起请求来访问 OpenStack。对于应用程序,有几个 SDK 可用。最终,所有这些访问方法都会对各种 OpenStack 服务发出 REST API 调用。

下图是OpenStack最常见的体系结构:
OpenStack核心组件原理与应用一_第2张图片

大家可以按照图上列出的组件来定制部署自己的 OpenStack 环境,在部署 OpenStack 前,我们先来准备依赖环境。

兵马未动,粮草先行

在笔者的 OpenStack 环境中,操作系统均使用的 CentOS7 版本,OpenStack 为 Queens 版本。
CentOS中可以通过 redhat-release 文件查看操作系统版本:

[root@ct1 ~]# cat  /etc/redhat-release

OpenStack 最小化部署需要两台主机:一个 Controller 节点,一个 Computer 节点。所以,想尝试的同学,请至少准备好两个节点(可以是物理机,也可以是虚拟机),每个节点上至少两块网卡。本例中的主机信息如下:

Role Name Private IP Public IP
Controller ct1.vtlab.io 192.168.1.231 10.0.0.231
Computer cp1.vtlab.io 192.168.1.233 10.0.0.233

Controller 节点一般运行服务端的程序,Computer 节点运行客户端程序及VMS。接下来我们部署和配置环境。

配置主机名

#设置控制节点的主机名为 ct1.vtlab.io
[root@ct1 ~]# hostnamectl set-hostname ct1.vtlab.io
#设置计算节点的主机名为 cp1.vtlab.io
[root@cp1 ~]# hostnamectl set-hostname cp1.vtlab.io

配置各节点时区,统一为 Asia/Shanghai:

[root@ct1 ~]# timedatectl set-timezone Asia/Shanghai

配置各节点的编码
当编码为中文,启动 OpenStack 组件可能会报下面的错误,所以提前设置好主机编码均为 en_US.UTF-8

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 14: ordinal not in range(128)
[root@cp1 ~]# cat /etc/locale.conf 
LANG="en_US.UTF-8"

修改hosts文件,使彼此能通过主机名访问,如果环境中有DNS,可以使用DNS。

[root@ct1 ~]# cat /etc/hosts
192.168.1.231   ct1.vtlab.io
192.168.1.233   cp1.vtlab.io

关闭各节点防火墙和Selinux

[root@ct1 ~]# systemctl stop firewalld.service
[root@ct1 ~]# setenforce 0
#编辑selinux配置文件,替换一下内容
[root@ct1 ~]# vim /etc/selinux/config
SELINUX=disabled

NTP 服务:
在集体活动中,大家时间同步,才能保证行动一致、有条,显得像一个集体。集群环境更是如此。CentOS7.x 中,默认的时钟同步服务改为了 Chrony。 Chrony 可以同时作为NTP服务的客户端和服务端。默认安装后有两个程序chronyd 和 chronyc。chronyd 是一个在系统后台运行的守护进程,chronyc 是用来监控chronyd 性能和配置的工具。
Chrony 的优势包括:

  1. 更快的同步只需要数分钟而非数小时时间,从而最大程度减少了时间和频率误差,这对于并非全天 24 小时运行的台式计算机或系统而言非常有用
  2. 能够更好地响应时钟频率的快速变化,这对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节能技术而言非常有用。
  3. 在初始同步后,它不会停止时钟,以防对需要系统时间保持单调的应用程序造成影响。
  4. 在应对临时非对称延迟时(例如,在大规模下载造成链接饱和时)提供了更好的稳定性。
  5. 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。
    #安装 chrony,在所有OpenStack节点上执行
    yum install -y chrony
    #如果有 Ansible 等配置管理工具会更方便,只需要一条命令就能在所有节点上安装完成我们需要的程序包了。
    [root@ct1 ~]# ansible node -m yum -a "name=chrony state=present" 
    #在 Chrony 服务端执行
    #编辑配置文件 vim /etc/chrony.conf,添加下列部分
    allow 192.168.0.0/16
    allow 172.31.1.0/24
    allow 10.0.0.0/24
    #启动服务
    [root@ct1 ~]# systemctl start chronyd.service
    [root@ct1 ~]# systemctl enable chronyd.service
    #在 Chrony 客户端执行
    #编辑配置文件 vim /etc/chrony.conf,修改下列部分,其中 cp1.vtlab.io 为Chrony 服务端的地址,可以写主机名也可以写IP。
    server cp1.vtlab.io iburst  
    #启动服务
    [root@cp1 ~]# systemctl start chronyd.service
    [root@cp1 ~]# systemctl enable chronyd.service
    #执行命令验证
    [root@cp1 ~]# chronyc sources

准备网络环境

网络接口要求,双网卡,分为管理网络和专用网络,禁用DHCP功能,手动配置IP地址。
出于管理目的,例如:安装包,安全更新, DNS 和 NTP,所有的节点都需要可以访问互联网。在大部分情况下,节点应该通过管理网络接口访问互联网。为了更好的突出网络隔离的重要性,示例架构中为管理网络使用 "private address space"(192.168.1.x),并假定物理网络设备通过 "NAT" 或者其他方式提供互联网访问。示例架构使用可路由的IP地址隔离服务商(外部)网络并且假定物理网络设备直接提供互联网访问。

在提供者网络(10.0.0.x)架构中,所有实例直接连接到提供者网络。在自服务(私有)网络架构,实例可以连接到自服务或提供者网络。自服务网络可以完全在 OpenStack 环境中或者通过外部网络使用 “NAT ” 提供某种级别的外部网络访问。
OpenStack核心组件原理与应用一_第3张图片

示例网络架构如下:

  • 管理网络使用 192.168.1.0/24 带有网关 192.168.1.1 的网络段,这个网络需要一个网关为所有节点提供内部管理目的的访问,例如:包安装、安全更新、DNS、时钟同步。
  • 提供者网段 10.0.0.0/24,网关10.0.0.1
    这个网络需要一个网关来提供在环境中内部实例的访问。

控制节点网络配置:
1.将第一个接口配置为管理网络接口:

[root@ct1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno1
BOOTPROTO=static
DEVICE=eno1
ONBOOT=yes
IPADDR=192.168.1.231
GATEWAY=192.168.1.1
NETMASK=255.255.255.0

2.提供者网络接口使用一个特殊的配置,不分配给它IP地址。配置第二块网卡作为提供者网络:

[root@ct1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno2
BOOTPROTO=static
DEVICE=eno2
ONBOOT=yes
IPADDR=10.0.0.231
GATEWAY=10.0.0.1
NETMASK=255.255.255.0

3.重启网络服务,是配置生效

[root@ct1 ~]# systemctl restart network

计算节点网络配置:
1.将第一个接口配置为管理网络接口

[root@cp1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno1
BOOTPROTO=static
DEVICE=eno1
ONBOOT=yes
IPADDR=192.168.1.233
GATEWAY=192.168.1.1
NETMASK=255.255.255.0

2.配置第二块网卡作为提供者网络:

[root@cp1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno2
BOOTPROTO=static
DEVICE=eno2
ONBOOT=yes
IPADDR=10.0.0.233
GATEWAY=10.0.0.1
NETMASK=255.255.255.0

配置域名解析

  1. 通过修改/etc/hosts文件。
  2. 通过DNS 服务。

通过 yum 方式安装,启用 OpenStack 库

[root@ct1 ~]# yum -y install centos-release-openstack-queens
#升级包
[root@ct1 ~]# yum upgrade
#安装OpenStack客户端
[root@ct1 ~]# yum install -y python-openstackclient
#安装openstack-selinux 软件包以便自动管理OpenStack服务的安全策略
[root@ct1 ~]# yum install -y openstack-selinux

安装数据库服务
OpenStack服务使用MySQL数据库存储信息。本处使用MariaDB。
安装MariaDB并配置bind_address为控制节点管理网卡的IP地址。

[root@ct1 ~]# yum -y install mariadb mariadb-server python2-PyMySQL
[root@ct1 ~]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
skip-name-resolve
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8mb4
#启动
[root@ct1 ~]# systemctl enable mariadb.service
[root@ct1 ~]# systemctl start mariadb.service
#可选操作:
#检查空密码用户并删除
[root@ct1 ~]# mysql_secure_installation
delete from mysql.user where password="";  
flush privileges;
select user,host,password from mysql.user where password="";

安装NoSQL服务
Telemetry 服务使用 NoSQL 数据库来存储信息。这里选择 MongoDB数据库。
安装 MongoDB。配置 bind_ip 为控制节点管理网卡的IP地址。

[root@ct1 ~]# yum install mongodb-server mongodb -y
[root@ct1 ~]# vim /etc/mongod.conf
bind_ip = 192.168.1.231
smallfiles = true 
#启动服务
[root@ct1 ~]# systemctl enable mongod.service
[root@ct1 ~]# systemctl start mongod.service

安装消息队列
OpenStack使用消息队列协调操作和各服务的状态信息。消息队列服务一般运行在控制节点上。OpenStack 支持RabbitMQ、Qpid 和 ZeroMQ。我选用的 RabbitMQ。

[root@ct1 ~]# yum -y install rabbitmq-server
#设置开机启动并启动RabbitMQ
[root@ct1 ~]# systemctl enable rabbitmq-server.service
[root@ct1 ~]# systemctl start rabbitmq-server.service
#添加RabbitMQ用户并设置密码,需要把RABBIT_PASS修改为真实密码。
[root@ct1 ~]# rabbitmqctl add_user openstack RABBIT_PASS
#开启页面监控
[root@ct1 ~]# rabbitmq-plugins enable rabbitmq_management
#添加openstack用户配置、写入和读取的权限
[root@ct1 ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
[root@ct1 ~]# rabbitmqctl set_user_tags openstack  administrator management

安装缓存服务
认证服务的认证缓存使用 Memcached 缓存令牌。缓存服务 Memcached 运行在控制节点。在生产环境中,推荐联合启用防火墙、认证和加密保证它的安全。

[root@ct1 ~]# yum install -y memcached python-memcached
#编辑文件,修改监听地址
[root@ct1 ~]# vim  /etc/sysconfig/memcached 
OPTIONS="-l 127.0.0.1,::1,ct1.vtlab.io"
#设置开机启动并启动memcached
[root@ct1 ~]# systemctl enable memcached.service
[root@ct1 ~]# systemctl start memcached.service

安装ETCD服务

[root@ct1 ~]# yum install -y etcd
#修改etcd配置文件 /etc/etcd/etcd.conf
[root@ct1 ~]# vim /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.231:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.231:2379"
ETCD_NAME="ct1.vtlab.io"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.231:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.231:2379"
ETCD_INITIAL_CLUSTER="ct1.vtlab.io=http://192.168.1.231:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"
#设置开机启动并启动etcd
[root@ct1 ~]# systemctl enable etcd
[root@ct1 ~]# systemctl start etcd

到目前为止,OpenStack 依赖的环境已经准备完毕,下一篇文章,将介绍 OpenStack 的验证服务——keystone。