Linux 运维手册之 OpenStack 从入门到放弃(Part 1)
后知后觉 暂无评论

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 版。

版本一览表

版本时间
AustinOctober 2010
BexarFebruary 2011
CactusApril 2011
DiabloSeptember 2011
EssexApril 2012
FolsomSeptember 2012
GrizzlyApril 2013
HavanaOctober 2013
IcehouseApril 2014
JunoOctober 2014
KiloApril 2015
LibertyOctober 2015
MitakaApril 2016
NewtonOctober 2016
OcataFebruary 2017
PikeAugust 2017
QueensMarch 2018
RockyAugust 2018
SteinApril 2019
TrainSeptember 2019

预览

适配的系统

架构图

逻辑架构(!AVIF)

网络模型

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

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

二层网络 VLAN(!AVIF)

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

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

三层网络 VXLAN(!AVIF)

环境

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

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

安全

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

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

openssl rand -hex 10

密码清单

Password nameDescription
Database password (no variable used)Root password for the database
ADMIN_PASSPassword of user admin
CINDER_DBPASSDatabase password for the Block Storage service
CINDER_PASSPassword of Block Storage service user cinder
DASH_DBPASSDatabase password for the Dashboard
DEMO_PASSPassword of user demo
GLANCE_DBPASSDatabase password for Image service
GLANCE_PASSPassword of Image service user glance
KEYSTONE_DBPASSDatabase password of Identity service
METADATA_SECRETSecret for the metadata proxy
NEUTRON_DBPASSDatabase password for the Networking service
NEUTRON_PASSPassword of Networking service user neutron
NOVA_DBPASSDatabase password for Compute service
NOVA_PASSPassword of Compute service user nova
PLACEMENT_PASSPassword of the Placement service user placement
RABBIT_PASSPassword 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

sudo 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

sudo 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

sudo 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

时间同步

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

控制节点

安装服务

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

修改配置

sudo vim /etc/chrony.conf ## SUSE/RHEL/CentOS
sudo 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

重启服务

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

计算节点

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

修改配置

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

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

server controller iburst

注释掉如下字段

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

重启服务

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

启用开机自启

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

OpenStack 包管理

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

For SUSE

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

OpenStack Stein

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

OpenStack Rocky

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

OpenStack Queens

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

OpenStack Pike

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

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

sudo zypper rm patterns-openSUSE-minimal_base-conflicts

OpenStack Stein

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

OpenStack Rocky

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

OpenStack Queens

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

OpenStack Pike

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

完成安装

在所有节点上升级安装包

sudo zypper refresh && zypper dist-upgrade

安装 OpenStack 客户端

sudo zypper install python-openstackclient

For RHEL/CentOS

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

sudo 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 仓库才能完成安装。

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

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

启用 OpenStack 仓库

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

OpenStack Rocky

sudo yum install centos-release-openstack-rocky

OpenStack Queens

sudo yum install centos-release-openstack-queens

OpenStack Pike

sudo yum install centos-release-openstack-pike

完成安装

sudo yum upgrade

安装 OpenStack 客户端

sudo yum install python-openstackclient

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

sudo 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

sudo add-apt-repository cloud-archive:stein

OpenStack Rocky for Ubuntu 18.04 LTS

sudo add-apt-repository cloud-archive:rocky

OpenStack Queens for Ubuntu 16.04 LTS

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

OpenStack Pike for Ubuntu 16.04 LTS

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

完成安装

sudo apt update && apt dist-upgrade

安装 OpenStack 客户端

sudo apt install python-openstackclient

SQL 数据库

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

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

SQL 数据库 for SUSE

安装数据库

sudo zypper install mariadb-client mariadb python-PyMySQL

创建配置文件

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

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

sudo systemctl enable mysql.service
sudo systemctl start mysql.service

初始化数据库并设置

sudo mysql_secure_installation

SQL 数据库 for RHEL and CentOS

安装数据库

sudo yum install mariadb mariadb-server python2-PyMySQL

创建配置文件

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

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

sudo systemctl enable mysql.service
sudo systemctl start mysql.service

初始化数据库并设置

sudo mysql_secure_installation

SQL 数据库 for Ubuntu

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

安装数据库

sudo apt install mariadb-server python-pymysql

创建配置文件

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

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

sudo systemctl enable mysqld.service
sudo systemctl start mysqld.service

初始化数据库并设置

sudo mysql_secure_installation

附录

相关链接

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。