OpenStack 从入门到放弃(Part 1)

分类:Linux 评论: 0

OpenStack 是一个开源的云计算管理平台,由几个主要的组件组合起来完成具体工作。OpenStack 支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。

什么是 OpenStack ? OpenStack 是一个可控制大型的计算、存储、网络等资源池的数据中心的云操作系统,管理元可以通过控制面板对所有的资源进行统一管理,且可以使用 Web 界面进行资源控制及修改。

What is OpenStack? OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a datacenter, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface.

OpenStack 由 Rackspace(全球三大云计算中心之一) 和 NASA(美国国家航空航天局)发起的一个试点项目,该项目在 2010 年 7 月立项,此项目旨在提供开源软件,使得任何组织都能在标准化的硬件上建立和提供云计算服务。

OpenStack 主体由 Python 语言编写,使用 Apache 2.0 License 开源协议。

组件

前面说过 OpenStack 只是一个平台,因此具体功能是由其内部的组件提供的,常用组件有以下几种。

名称 作用 介绍
Nova 计算服务 虚机管理服务。包括创建、管理、销毁虚拟机。
Zun 容器服务 容器调度服务。用于启动和管理由不同容器技术支持的容器。
Qingling 功能服务 提供一个平台用于无服务功能,如 AWS Lambda。
Neutron 网络服务 为实例提供网络连接,为用户提供 API 修改网络和配置。
Glance 镜像服务 为实例提供系统镜像,为虚拟机安装系统。
Keystore 认证服务 全部服务和接口必须经过此身份认证服务后才能执行。
Horizon 界面服务 为管理员操作提供 Web 入口,实现底层交互服务。
Cinder 块存储服务 为实例提供持续的快存储服务,可插入驱动程序体系结构促进块存储设备的创建和管理。
Swift 对象存储服务 通过RESTful HTTP API存储和检索任意非结构化数据对象。它是高度容错数据复制和扩展架构。它的实现并不是像一个文件服务器挂载目录。
Ceilometer 计费服务 通过检测实例状态来实现计费,基准测试、可伸缩性和统计目的。
Heat 编排服务 协调多个组合云应用程序通过使用AWS CloudFormation原生热模板格式或模板格式,通过OpenStack-native REST API和CloudFormation-compatible查询API。
Trove 数据库服务 提供可伸缩的、可靠的云Database-as-a-Service关系和非关系数据库引擎的功能。
Sahara 数据处理服务 通过指定参数如Hadoop版本,集群拓扑和节点硬件细节。提供功能来提供和规模在OpenStack Hadoop集群

小贴士:更多服务组件可在官网查阅文档,不同版本的服务组件可能存在区别(增删或改名)。

版本

OpenStack 每年推出一个新版本,版本号为英文单词,单词首字母按字母表顺序进行排序(A-Z),截至 2018 年 11 月,OpenStack 最新版为 Rocky

说明:为了描述简单,每个大版本号都以首字母为简称,比如 Mitaka 简称 M 版, Rocky 简称 R 版。

版本一览表

版本 时间
Austin October 2010
Bexar February 2011
Cactus April 2011
Diablo September 2011
Essex April 2012
Folsom September 2012
Grizzly April 2013
Havana October 2013
Icehouse April 2014
Juno October 2014
Kilo April 2015
Liberty October 2015
Mitaka April 2016
Newton October 2016
Ocata February 2017
Pike August 2017
Queens March 2018
Rocky August 2018
Stein April 2019
Train September 2019

预览

适配的系统

架构图

网络模型

供应商网络(二层网络 VLAN)

供应商网络是最简单的 OpenStack 网络模型,本质上说将虚拟机网络桥接至物理网络。并依赖物理网络设施来实现三层网络(路由)服务,此外, DHCP 服务来为虚拟机实例来提供 IP 地址。

自助服务网络(三层网络 VXLAN)

自助服务网络也称为私有网络,类似于阿里云等云服务厂商的 私有网络 VPC 。此种网络实质上使用 NAT 技术将虚拟网络路由至物理网络。

环境

为保证集群的性能及能开放出具有最简系统 CirrOS 示例,建议控制节点和计算节点都应符合以下条件。

控制节点和计算节点应如何理解,控制节点即是操作中心,用户通过面板或者命令将指令下发至控制节点,控制节点去统筹并调度计算节点孕育出实际对外服务的虚机。控制节点实际上也可作为计算节点使用,但是不推荐这样操作。

安全

OpenStack 服务的各个组件之间通讯都需要进行授权,因此不同服务间需要交换密令,建议安装配置组件时使用具有一定密码安全性的密码。但数据库等不支持 '@' 等特殊字符。

可以使用例如 pwgen 等生成密码。或者使用以下命令

$ openssl rand -hex 10

密码清单

Password name Description
Database password (no variable used) Root password for the database
ADMIN_PASS Password of user admin
CINDER_DBPASS Database password for the Block Storage service
CINDER_PASS Password of Block Storage service user cinder
DASH_DBPASS Database password for the Dashboard
DEMO_PASS Password of user demo
GLANCE_DBPASS Database password for Image service
GLANCE_PASS Password of Image service user glance
KEYSTONE_DBPASS Database password of Identity service
METADATA_SECRET Secret for the metadata proxy
NEUTRON_DBPASS Database password for the Networking service
NEUTRON_PASS Password of Networking service user neutron
NOVA_DBPASS Database password for Compute service
NOVA_PASS Password of Compute service user nova
PLACEMENT_PASS Password of the Placement service user placement
RABBIT_PASS Password of RabbitMQ user openstack

主机网络

部署 OpenStack 时必须使用网络,因为系统的服务部署、更新,DNS 和 NTP 等需要依赖网络,本文以官网部署方法为准,以私有网络为例进行部署,假设物理网络通过 NAT 方式提供网络连接,以下图为准。

示例机构使用以下网络:

注意:请注意 hosts 解析,若使用主机名连接其他节点,必须在全部节点中进行添加 hosts 记录。

控制节点

控制节点的网络地址规划如下:

RHEL / CentOS:

修改默认配置文件 /etc/sysconfig/network-scripts/ifcfg-xxx

DEVICE=INTERFACE_NAME
TYPE=Ethernet
ONBOOT="yes"
BOOTPROTO="none"

注意:若是物理机请勿修改 HWADDRUUID 项,若是虚拟机(特别是克隆产生的机器)需要删除这些项,防止地址冲突。

SUSE:

修改默认配置文件 /etc/sysconfig/network/ifcfg-xxx ,添加以下内容。

STARTMODE='auto'
BOOTPROTO='static'

Ubuntu:

修改默认配置文件 /etc/network/interfaces

# The provider network interface
auto INTERFACE_NAME
iface INTERFACE_NAME inet manual
up ip link set dev $IFACE up
down ip link set dev $IFACE down

主机名解析

修改控制节点 主机名为 controller

# hostnamectl set-hostname controller

修改主机配置 /etc/hosts 文件

# controller
10.0.0.11       controller

# compute1
10.0.0.31       compute1

# block1
10.0.0.41       block1

# object1
10.0.0.51       object1

# object2
10.0.0.52       object2

计算节点

计算节点的网络地址规划如下:

注意:其他计算节点的名称依次为 .32 .33 .34 等。

RHEL / CentOS:

修改默认配置文件 /etc/sysconfig/network-scripts/ifcfg-xxx

DEVICE=INTERFACE_NAME
TYPE=Ethernet
ONBOOT="yes"
BOOTPROTO="none"

注意:若是物理机请勿修改 HWADDRUUID 项,若是虚拟机(特别是克隆产生的机器)需要删除这些项,防止地址冲突。

SUSE:

修改默认配置文件 /etc/sysconfig/network/ifcfg-xxx ,添加以下内容。

STARTMODE='auto'
BOOTPROTO='static'

Ubuntu:

修改默认配置文件 /etc/network/interfaces

# The provider network interface
auto INTERFACE_NAME
iface INTERFACE_NAME inet manual
up ip link set dev $IFACE up
down ip link set dev $IFACE down

主机名解析

修改控制节点 主机名为 compute1

# hostnamectl set-hostname compute1

修改主机配置 /etc/hosts 文件

# controller
10.0.0.11       controller

# compute1
10.0.0.31       compute1
10.0.0.32       compute2
10.0.0.33       compute3

# block1
10.0.0.41       block1

# object1
10.0.0.51       object1

# object2
10.0.0.52       object2

块存储节点(可选)

块存储节点的网络地址规划如下:

注意:其他块存储节点的名称依次为 .42 .43 .44 等。

主机名解析

修改控制节点 主机名为 block1

# hostnamectl set-hostname block1

修改主机配置 /etc/hosts 文件

# controller
10.0.0.11       controller

# compute1
10.0.0.31       compute1

# block1
10.0.0.41       block1
10.0.0.42       block2
10.0.0.43       block3

# object1
10.0.0.51       object1

# object2
10.0.0.52       object2

网络验证

从控制节点测试网络:

# ping -c 4 openstack.org

PING openstack.org (174.143.194.225) 56(84) bytes of data.
64 bytes from 174.143.194.225: icmp_seq=1 ttl=54 time=18.3 ms
64 bytes from 174.143.194.225: icmp_seq=2 ttl=54 time=17.5 ms
64 bytes from 174.143.194.225: icmp_seq=3 ttl=54 time=17.5 ms
64 bytes from 174.143.194.225: icmp_seq=4 ttl=54 time=17.4 ms

--- openstack.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3022ms
rtt min/avg/max/mdev = 17.489/17.715/18.346/0.364 ms

从控制节点测试内网计算节点:

# ping -c 4 compute1

PING compute1 (10.0.0.31) 56(84) bytes of data.
64 bytes from compute1 (10.0.0.31): icmp_seq=1 ttl=64 time=0.263 ms
64 bytes from compute1 (10.0.0.31): icmp_seq=2 ttl=64 time=0.202 ms
64 bytes from compute1 (10.0.0.31): icmp_seq=3 ttl=64 time=0.203 ms
64 bytes from compute1 (10.0.0.31): icmp_seq=4 ttl=64 time=0.202 ms

--- compute1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.202/0.217/0.263/0.030 ms

从计算节点测试网络访问:

# ping -c 4 openstack.org

PING openstack.org (174.143.194.225) 56(84) bytes of data.
64 bytes from 174.143.194.225: icmp_seq=1 ttl=54 time=18.3 ms
64 bytes from 174.143.194.225: icmp_seq=2 ttl=54 time=17.5 ms
64 bytes from 174.143.194.225: icmp_seq=3 ttl=54 time=17.5 ms
64 bytes from 174.143.194.225: icmp_seq=4 ttl=54 time=17.4 ms

--- openstack.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3022ms
rtt min/avg/max/mdev = 17.489/17.715/18.346/0.364 ms

从计算节点测试控制节点的访问:

# ping -c 4 controller

PING controller (10.0.0.11) 56(84) bytes of data.
64 bytes from controller (10.0.0.11): icmp_seq=1 ttl=64 time=0.263 ms
64 bytes from controller (10.0.0.11): icmp_seq=2 ttl=64 time=0.202 ms
64 bytes from controller (10.0.0.11): icmp_seq=3 ttl=64 time=0.203 ms
64 bytes from controller (10.0.0.11): icmp_seq=4 ttl=64 time=0.202 ms

--- controller ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.202/0.217/0.263/0.030 ms

时间同步

时间同步在云计算集群中很重要,涉及到脑裂等问题,因此必须在网络中搭建时间同步服务。

控制节点

安装服务

# apt install chrony ## Ubuntu/Debian
# yum install chrony ## RHEL/CentOS
# dnf install chrony ## Fedora/CentOS 8+
# zypper install chrony ## SUSE

修改配置

# vim /etc/chrony.conf ## SUSE/RHEL/CentOS
# vim /etc/chrony/chrony.conf ## Debian/Ubuntu

推荐时间同步逻辑为配置控制节点向外部 NTP 服务器同步,控制节点为计算集群中的其他节点提供同步服务。

server ntp1.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp2.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp3.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp4.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp5.aliyun.com minpoll 4 maxpoll 10 iburst
server ntp6.aliyun.com minpoll 4 maxpoll 10 iburst

小贴士:默认情况下此配置中 server 段无需修改,海外机器直接可以使用,若机器在国内推荐修改为上述阿里云时间同步服务,提高准确率。

加入此段可以让内网的机器连接使用。

allow 10.0.0.0/24

重启服务

# systemctl restart chronyd ## SUSE/RHEL/CentOS
# systemctl restart chrony ## Debian/Ubuntu

计算节点

安装服务同上,注意配置修改处不同。

修改配置

# vim /etc/chrony.conf ## SUSE/RHEL/CentOS
# vim /etc/chrony/chrony.conf ## Debian/Ubuntu

修改此段配置如下,内网机器全部与控制节点进行同步,不与外网进行同步。

server controller iburst

注释掉如下字段

pool 2.debian.pool.ntp.org offline iburst

重启服务

# systemctl restart chronyd ## SUSE/RHEL/CentOS
# systemctl restart chrony  ## Debian/Ubuntu

启用开机自启

# systemctl enable chronyd.service ## SUSE/RHEL/CentOS
# systemctl enable chrony.service  ## Debian/Ubuntu

OpenStack 包管理

不同发行版的包管理器策略不同,因此需要根据发行版进行修改。

For SUSE

SUSE 系列有多个发行版,请根据其种类进行选择。

OpenStack Stein

# zypper addrepo -f obs://Cloud:OpenStack:Stein/openSUSE_Leap_15.0 Stein

OpenStack Rocky

# zypper addrepo -f obs://Cloud:OpenStack:Rocky/openSUSE_Leap_15.0 Rocky

OpenStack Queens

# zypper addrepo -f obs://Cloud:OpenStack:Queens/openSUSE_Leap_42.3 Queens

OpenStack Pike

# zypper addrepo -f obs://Cloud:OpenStack:Pike/openSUSE_Leap_42.3 Pike

小贴士:openSUSE 的包使用模式的概念来区分组合包,若使用的是 Minimal Server Selection (Text Mode) ,则在安装 OpenStack 时可能会报错,因此请先 移除 以下包。

# zypper rm patterns-openSUSE-minimal_base-conflicts

OpenStack Stein

# zypper addrepo -f obs://Cloud:OpenStack:Stein/SLE_15 Stein

OpenStack Rocky

# zypper addrepo -f obs://Cloud:OpenStack:Rocky/SLE_12_SP4 Rocky

OpenStack Queens

# zypper addrepo -f obs://Cloud:OpenStack:Queens/SLE_12_SP3 Queens

OpenStack Pike

# zypper addrepo -f obs://Cloud:OpenStack:Pike/SLE_12_SP3 Pike

完成安装

在所有节点上升级安装包

# zypper refresh && zypper dist-upgrade

安装 OpenStack 客户端

# zypper install python-openstackclient

For RHEL/CentOS

RHEL 包管理器需要授权才能使用,因此步骤与 CentOS 略有不同。

# subscription-manager repos --enable=rhel-7-server-optional-rpms \
  --enable=rhel-7-server-extras-rpms --enable=rhel-7-server-rh-common-rpms

安装需要先去红帽官网的订阅系统中进行订阅然后才能开启 rhel-7-server-rpms ,查看更多信息请点击 Red Hat Enterprise Linux 7 System Administrator’s Guide

配置完成后需要下载 RDO 仓库才能完成安装。

# yum install https://rdoproject.org/repos/rdo-release.rpm

配置完成后与 CentOS 操作步骤相同。

启用 OpenStack 仓库

CentOS 系统需要 extras 仓库才能正常使用,若仓库配置不正确请使用官方镜像等方式恢复仓库配置文件。

OpenStack Rocky

# yum install centos-release-openstack-rocky

OpenStack Queens

# yum install centos-release-openstack-queens

OpenStack Pike

# yum install centos-release-openstack-pike

完成安装

# yum upgrade

安装 OpenStack 客户端

# yum install python-openstackclient

RHEL/CentOS 系统都默认启动 SELinux 。若启动了此服务,请安装以下包进行自动配置。

# yum install openstack-selinux

For Ubuntu

Ubuntu 在每个版本库中都包含了最新的 OpenStack ,Ubuntu LTS 版本每两年更新一次。OpenStack 软件包通过 Ubuntu Cloud Archive 提供给过时的 Ubuntu LTS。

注意:官方仓库并不支持 Debian ,因此不保证兼容性。

Ubuntu 18.04 LTS 仓库中直接提供了 OpenStack Queens 版本,不需要使用额外的仓库。

启用 Ubuntu Cloud Archive 仓库

OpenStack Stein for Ubuntu 18.04 LTS

# add-apt-repository cloud-archive:stein

OpenStack Rocky for Ubuntu 18.04 LTS

# add-apt-repository cloud-archive:rocky

OpenStack Queens for Ubuntu 16.04 LTS

# apt install software-properties-common
# add-apt-repository cloud-archive:queens

OpenStack Pike for Ubuntu 16.04 LTS

# apt install software-properties-common
# add-apt-repository cloud-archive:pike

完成安装

# apt update && apt dist-upgrade

安装 OpenStack 客户端

# apt install python-openstackclient

SQL 数据库

大部分的 OpenStack 服务都需要使用数据库存储数据才能实现其功能。数据库一般运行在控制节点上,本文与官方文档相同,使用 MySQL 或 MariaDB 实现。实际上 OpenStack 支持多种数据库,包括 PostgreSQL 。

小贴士:如果看到 OpenStack 的报错日志中存在 Too many connectionsToo many open files 则需要修改数据库的最大连接数参数

SQL 数据库 for SUSE

安装数据库

# zypper install mariadb-client mariadb python-PyMySQL

创建配置文件

# vim /etc/my.cnf.d/openstack.cnf

添加如下参数

[mysqld]
bind-address = 10.0.0.11

default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

小贴士:监听地址请替换为控制节点的地址,若使用者的网络配置与本文不同,请自行修改。

启动数据库服务并配置自启动

# systemctl enable mysql.service
# systemctl start mysql.service

初始化数据库并设置

# mysql_secure_installation

SQL 数据库 for RHEL and CentOS

安装数据库

# yum install mariadb mariadb-server python2-PyMySQL

创建配置文件

# vim /etc/my.cnf.d/openstack.cnf

小贴士:创建 /etc/my.cnf.d/openstack.cnf 并备份 /etc/my.cnf.d/ 文件夹内的文件(如果有的话),以便保证配置生效。

添加如下参数

[mysqld]
bind-address = 10.0.0.11

default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

小贴士:监听地址请替换为控制节点的地址,若使用者的网络配置与本文不同,请自行修改。

启动数据库服务并配置自启动

# systemctl enable mysql.service
# systemctl start mysql.service

初始化数据库并设置

# mysql_secure_installation

SQL 数据库 for Ubuntu

从 Ubuntu 18.04 LTS 后在默认仓库中不再提供 MariaDB ,请根据官方文档添加仓库(也可以参考数据库从入门到放弃 MySQL 篇 - VVavE)或者使用 Universe 仓库进行安装。

安装数据库

# apt install mariadb-server python-pymysql

创建配置文件

# vim /etc/mysql/mariadb.conf.d/99-openstack.cnf

添加如下参数

[mysqld]
bind-address = 10.0.0.11

default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

小贴士:监听地址请替换为控制节点的地址,若使用者的网络配置与本文不同,请自行修改。

启动数据库服务并配置自启动

# systemctl enable mysqld.service
# systemctl start mysqld.service

初始化数据库并设置

# mysql_secure_installation

消息队列

OpenStack 使用消息队列来协调服务之间的操作和状态信息,消息队列服务通常运行在控制节点上,也可以单独部署于其他服务器或消息队列集群。 OpenStack 支持多种消息队列服务,包括 RabbitMQQpidZeroMQ 。大多数支持 OpenStack 的发行版都有指定的消息队列产品,本文与官方文档一致使用 RabbitMQ 若使用其他消息队列产品请查询相关使用文档。

Message queue for SUSE

Message queue for RHEL and CentOS

Message queue for Ubuntu

附录

相关链接

参考链接

回复