尚硅谷Linux虚拟化教程(OpenStack)

1 云计算概述

1.1 为何需要云计算这种 “新事物”

云计算基础是虚拟化,前身是网格计算;

虚拟化就是在物理主机上虚拟出多个不同的主机。

  • 证点

Oracle 版本发布时间表

  • 技术需求的变迁-1

单主机多用户

单主机多用户

  • 技术需求的变迁-2

单主机多虚拟机

单主机多虚拟机

  • 技术需求的变迁-3

多主机多虚拟机

多主机多虚拟机

  • 实现目标

云的愿景:使用计算资源使用网络资源向使用自来水意义按需自由有偿

时间 版本号
1998.09 8i
2001.06 9i
2003.09 10g
2007.07 11g
2013.06 12C
  1. - 资源依赖
  2. - 互相影响
  3. - 无隔离
优点:
- 资源共享
- 互相隔离

缺点:
- 申请资源时间长
- 适合业务的密集度低
- 资源调度
- 特性扩展
  • 云计算的定义

美国国家标准与技术研究院(NIST)定义:云计算是一种按使用量付费的模式,这种模式提供可用的,便捷的,按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速的提供,只需投入很少的管理工作,或者与服务供应商进行很少的交互。

1.2 云计算的分类

架构设计

云计算架构设计

供给方式

01.尚硅谷Linux虚拟化教程(OpenStack) - 图5

  • IAAS:基础设施即服务,例如阿里云,华为云,AWS(亚马逊云)
  • PAAS:平台即服务,例如新浪云
  • SAAS:软件即服务,例如微软云 Office365
- KAAS:Kubernetes 即服务
- DAAS:容器即服务

1.3 OpenStack

代表厂家:

选择标准

各大厂家支持

发展迅速

OpenStack发展版本

- cloudstack
- openNebula
- openstack
- API 接口的广泛性
- 使用何种的开源协议进行编写
- 平台的成熟度
厂商的支持
- 有超过200家厂家加入 OpenStack 项目,包括:
- AMD,Brocade Communications Systems,Canonical
- Cisco,Dell,EMC,Ericsson,Groupe Bull,HP,IBM,Inktank
- Intel,NEC,Rackspace Hosting,
- Red Hat,SUSE Linux,VMware and Yahoo!

OpenStack ?

  • OpenStack 是一个美国国家航天局和 RackSpace 合作研发的,以 Apache 许可证授权的,并且是一个自由软件
  • OpenStack 是一个云平台管理的项目,它不是一个软件。这个项目由几个主要的组件组合起来完成一些工作
  • OpenStack 通过一个通过 web 界面提供资源管理,通过一个仪表盘管理整个数据中心的计算存储网络资源等(提供一个B/S架构)

OpenStack 特性

  • API 对接 亚马逊云平台
  • 使用 Apache 协议进行开源
  • 最火爆的开源项目
  • 一个框架
  • 使用 Python 进行开发
  • 混合云

2 OpenStack

2.1 OpenStack 当前版本的核心组件

  • Compute(Nova):计算服务,OpenStack的核心所在(Client CLI -> Nova -> libvirt -> KVM),与虚拟化进行交互的组件
  • Image Service(Glance):镜像服务,OpenStack 的操作系统镜像供给
  • Object Storage(Swift):对象存储,OpenStack 分布式存储
  • Block Storage(Cinder):块存储,底层使用iSCSI技术
  • Networking(Neutron):网络服务,华为,Cisco牵头的Neuturn组件
  • Dashboard(Horizon):仪表板,B/S的提供者
  • Identity Service(KeyStone):认证服务,用户的认证登录入口以及OpenStack的组件的认证体系
  • Orchestration(Heat):编排,跟着用户创建 YAML 文件创建虚拟机
  • Telemetry(Ceilometer):监控,OpenStack 虚拟机的计算资源
  • Database Service(Trove):数据库服务,OpenStack 统一的数据库的接入的标准
  • Data Processing(Sahara):数据处理

2.2 安装结构说明

大致情况

  • 操作系统:CentOS 7
  • OpenStack 版本:JUNO
  • 关闭防火墙和SLINUX
  • Controller Node:1 processor,2GB Memory,and 5 GB storage
  • Network Node:1 processor,512 MB Memory,and 5 GB storage
  • Computer Node:1 processor,2GB Memory,and 10 GB storage

OpenStack网络结构拓扑情况

IP 地址规划参考

  • Controller
    • M:192.168.222.5
  • Network
    • M:192.168.222.6
    • I:172.16.0.6
    • E:100.100.100.10
  • Computer
    • M:192.168.222.10
    • I:172.16.0.10
  • Block
    • M:192.168.222.20
Management Network:管理网络,OpenStack 组件之间的数据交换
Instance Tunnels Network:实例网络,OpenStack 虚拟机与虚拟机之间的通信
External Network:外部网络,OpenStack 虚拟机需要跟公网进行通信

2.3 OpenStack 基础环境搭建

2.3.1 先决条件

# Step 1:关闭 Network Manager
systemctl stop NetworkManager
systemctl disable NetworkManager

# Step 2:关闭防火墙和SELINUX
systemctl stop firewalld
systemctl disable firewalld

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# Step 3:设置主机名
hostnamectl set-hostname xx.xx.xx

# Step 4:配置各个机器的IP地址

2.3.2 配置 DNS 服务器或者使用 hosts 进行主机名的 IP 对应

controller.nice.com        192.168.x.5
network.nice.com        192.168.x.6
computer1.nice.com        192.168.x.10
computer2.nice.com        192.168.x.11
block1.nice.com            192.168.x.20
block2.nice.com            192.168.x.21
object.nice.com            192.168.x.30
object.nice.com            192.168.x.31

范例:

$ vim /etc/hosts
10.0.0.21   controller.nice.com
10.0.0.22   computer1.nice.com
10.0.0.23   block1.nice.com
10.0.0.24   network.nice.com

2.3.3 配置时间同步服务器以及安装 OpenStack 预备包

# 配置时间同步服务器
controller.nice.com ntp server controller
other server         ntp client
# 安装 OpenStack 预备包
# 1.安装 yum-plugin-priorities 包,防止高优先级软件被低优先级软件覆盖
yum install -y yum-plugin-priorities

# 2.安装 Base YUM,epel扩展YUM源
curl -k -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 3.安装 OpenStack YUM 源
# yum install -y http://rdo.fedorapeople.org/openstack-juno/rdo-release-juno.rpm
tee > /etc/yum.repos.d/CentOS-OpenStack.repo <<-'EOF'
# [openstack-queens]
# name=openstack-queens
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-queens/
# enabled=1
# gpgcheck=0
# [openstack-stein]
# name=openstack-stein
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-stein
# enabled=1
# gpgcheck=0
# [openstack-train]
# name=openstack-train
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-train
# enabled=1
# gpgcheck=0

[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0

[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF
# 4.更新操作系统
yum upgrade -y

# 5.安装 OpenStack-selinux 自动管理 SElinux
yum install -y openstack-selinux

2.4 KeyStone -认证服务

2.4.1 组件说明

KeyStone 存在的意义

一、什么是 KeyStone

KeyStone 是 OpenStack Identity Service 的项目名称,是一个负责身份管理与授权的组件

主要功能:实验用户的身份认证,基于角色(权限的集合)的权限管理,及 OpenStack 其他组件的访问地址和安全策略管理

二、为什么需要 KeyStone

KeyStone 项目的主要目的是给整个 OpenStack 的各个组件(nova,cinder,glance......)提供一个统一的验证方式
因为整个 OpenStack 是一个框架,是一组项目,而不是单个项目,我们需要给这一组项目提供一个统一的验证方式。

KeyStone 的功能

  • 用户管理(3A服务)
    • Account 账号
    • Authentication 身份认证
    • Authorization 授权
  • 服务目录管理
    • KeyStone 将当前所有的服务功能展现出来

认证服务中的关键字

  • User(用户)一个人,系统或者服务在 OpenStack 中的数字表示。已经登录的用户分配令牌环(是一组字符串)以访问资源。用户可以直接分配给特定的租户,就像隶属于每个组
  • Credentials(凭证)用于确认用户身份的数据。例如:用户名和密码,用户名和API key,或者由认证服务提供的身份验证令牌
  • Authentication(验证)确认用户身份的过程
  • Token(令牌)一个用于访问 OpenStack API 和资源的字母数字字符串。一个令牌可以随时撤销,并且持续一段时间有效
  • Tenant(租户)一个组织或者孤立资源的容器。租户和可以组织或者隔离认证对象。根据服务运营的要求,一个租户可以映射到客户,账户,组织或者项目
  • Service(服务)OpenStack 服务,例如计算服务(Nova),对象存储服务(Swift),或者镜像服务(Glance)。它提供了一个或者多个端点,供用户访问资源和执行操作。
  • Endpoint(端点)一个用于某个服务的可以通过网络进行访问的地址,通常是一个 URL 地址。一个端点可以有多个URL,一个URL只能有一个端点。
  • Role(角色)定制化的包含特定用户权限和特权的权限集合
  • KeyStone Client(KeyStone 命令行工具)KeyStone 的命令行工具。通过该工具可以创建用户,角色,服务和端点等……

名词解释

用户    -     张三
凭证     -    身份证
验证    -    验证身份证
令牌    -     房卡
租户/项目    -    宾馆
服务    -    住宿,餐饮
端点    -    路径
角色    -    VIP等级

2.4.2 组件之间沟通方式

2.4.2.1 用户认证过程

keystone用户认证流程

2.4.2.2 组件之间的交互过程

01.尚硅谷Linux虚拟化教程(OpenStack) - 图9

2.4.2.3 用户 - 角色 - 服务 交互图

用户 - 角色 - 服务 交互图

2.4.3 构建实验:OpenStack-Juno 安装

  • 所有节点安装时间同步软件
$ vim /etc/hosts
# Starting OpenStack Host #
10.0.0.21   controller.nice.com
10.0.0.22   computer1.nice.com
10.0.0.23   block1.nice.com
10.0.0.24   network.nice.com
# End OpenStack Host # 

$ yum install -y ntp
$ vim /etc/ntp.conf
restrict 10.0.0.0 mask 255.255.255.0 nomodify notrap

server controller.nice.com
fudge controller.nice.com stratum 10
# 开启时间同步
$ systemctl start ntpd && systemctl enable ntpd

2.4.3.1 controller 节点安装数据库
# Step1:安装 Mariadb 软件包
yum install -y mariadb mariadb-server MySQL-python

# Step2:编辑 /etc/my.cnf 软件,设置绑定IP,默认数据库引擎及默认字符集为UTF-8
[mysqld]
bind-address = 10.0.0.21
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8

# Step3:启动数据库并设置为开机自启动
systemctl enable --now mariadb

# Step4:初始化数据库脚本
mysql_secure_installation
## 输入root密码,这里初始化没有root密码
Enter current password for root (enter for none):
OK, successfully used password, moving on...
## 设置root密码
Set root password? [Y/n] y
New password: Admin@h3c
Re-enter new password: Admin@h3c
## 是否移除匿名用户
Remove anonymous users? [Y/n] y
## 是否不允许root进行远程登录
Disallow root login remotely? [Y/n] y
## 是否移除测试的数据库
Remove test database and access to it? [Y/n] y
## 是否现在刷新权限表
Reload privilege tables now? [Y/n] y

2.4.3.2 controller 节点安装 Messaing Server 服务
# 消息队列
# Step1:功能为协调操作和状态信息服务

# Step2:常用的消息代理软件
RabbitMQ
Qpid
ZeroMQ

# Step3:在 controller 节点安装 RabbitMQ
# a.安装 RabbitMQ 软件包
yum install -y rabbitmq-server

# b.启动服务并设置开机自启动
systemctl enable --now rabbitmq-server

# c.RabbitMQ 默认用户名和密码是 guest,可以通过下列命令进行修改
# rabbitmqctl change_password guest guest
rabbitmqctl change_password guest Admin@h3c

2.4.3.3 controller KeyStone 认证服务配置
  • 配置先决条件
# Step1:创建认证服务数据库
# a.使用root登录mysql数据库
mysql -uroot -pAdmin@h3c

# b.创建keystone数据库
CREATE DATABASE keystone;

# c.创建keystone数据库用户,使其可以对keystone数据库有完全控制权限
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';

# Step2:生成一个随机值作为管理令牌在初始配置
openssl rand -hex 10
# 生成字符串例如:713ce51d5716255c3e78
  • 安装并配置认证服务组件
# Step1:安装软件包
yum install -y openstack-keystone python-keystoneclient
# 注意:有可能会出现以下报错
# Error: Package: python2-qpid-proton-0.22.0-1.el7.x86_64 (openstack-rocky)
# 解决方案:yum install -y python2-qpid-proton-0.22.0-1.el7.x86_64

# Step2:编辑/etc/keystone/keystone.conf文件并做下列修改
# a.修改[DEFAULT]小节,定义初始管理令牌
vim /etc/keystone/keystone.conf
[DEFAULT]
...
admin_token = 刚才生成的随机值
admin_token = 713ce51d5716255c3e78

# b.修改[database]小节,配置数据库访问
[database]
...
connection = mysql://keystone:KEYSTONE_DBPASS@controller.nice.com/keystone

# c.修改[token]小节,配置UUID提供者和SQL驱动
[token]
...
provider = keystone.token.providers.uuid.Provider
driver = keystone.token.persistence.backends.sql.Token

# d.(可选择)开启详细日志,协助故障排除
[DEFAULT]
...
verbose = True

# Step3:常见通用证书的密钥,并限制相关文件的访问权限
keystone-manage pki_setup --keystone-user keystone --keystone-group keystone
chown -R keystone:keystone /var/log/keystone/
chown -R keystone:keystone /etc/keystone/
chown -R o-rwx /etc/keystone/ssl

# Step4:初始化KeyStone数据库
su -s /bin/sh -c "keystone-manage db_sync" keystone
# 查看KeyStone数据库是否初始化
mysql -uroot -pAdmin@h3c
MariaDB [(none)]> use keystone;
MariaDB [keystone]> show tables;
  • 完成安装
# Step1:启动 identity 服务并设置开机启动
systemctl enable openstack-keystone.service
systemctl start openstack-keystone.service

# Step2:默认情况下,服务器会无限存储到期的令牌,在资源有限的情况下会严重影响服务器的性能。建议用计划任务,每小时删除过期的令牌
(crontab -l -u keystone 2>&1 | grep -q token_flush) || \
echo '@hourly /usr/bin/keystone-manage token_flush > /var/log/keystone/keystone-tokenflush.log 2>&1' >> /var/spool/cron/keystone

cat /var/spool/cron/keystone

2.4.3.4 创建tenants(租户/项目),users(用户)和roles(角色)
  • 配置先决条件
# Step1:配置管理员令牌
export OS_SERVICE_TOKEN=刚才生成的字符串
export OS_SERVICE_TOKEN=713ce51d5716255c3e78

# Step2:配置端点
export OS_SERVICE_ENDPOINT=http://controller.nice.com:35357/v2.0
  • 创建租户、用户和角色
# a.创建admin租户
keystone tenant-create --name admin --description "Admin Tenant"
openstack project create --domain default --description "Admin Project" admin

# b.创建admin用户
keystone user-create --name admin --pass ADMIN_PASS --email EMAIL_ADDRESS
openstack user create --domain admin --password demo demo

# c.创建admin角色
keystone role-create --name admin
openstack role create user

# d.添加admin租户和用户到admin角色
keystone user-role-add -tenant admin --user admin --role admin

# e.创建用于dashboard访问的"_member_"角色
keystone role-create --name _member_

# f.添加admin租户和用户到_member_角色
keystone user-role-add --tenant admin --user admin --role _member_
  • 创建一个用于演示的demo租户和用户
# a.创建demo租户
keystone tenant-create --name demo --description "Demo Tenant"

# b.创建demo用户
keystone user-create --name demo --pass DEMO_PASS --email EMAIL_ADDRESS

# c.添加demo租户和demo用户到_member_角色
keystone user-role-add --tenant demo --user demo --role _member_
  • OpenStack 服务也需要一个租户,用户和角色和其他服务进行交互,因此我们创建一个service的租户。任何一个OpenStack服务都要和它关联
keystone tenant-create --name service --description "Service Tenant"

2.4.3.5 创建服务实体和API端点
# Step1:在OpenStack 环境中,identity服务管理一个服务目录,并使用这个目录在 OpenStack 环境中定位其他服务。
# 为identity 服务创建一个服务实体
keystone service-create --name keystone --type identity --description "OpenStack Identity"

# Step2:OpenStack环境中,identity服务管理目录以及与服务相关API端点。服务使用这个目录
# OpenStack 为每个服务提供了三个API端点:admin(管理),internal(内部),public(公共)为identity服务创建API端点
keystone endpoint-create \
--service-id ${keystone service-list | awk '/identity /{print $2}'} \
--publicurl http://controller.nice.com:5000/v2.0 \
--internalurl http://controller.nice.com:5000/v2.0 \
--adminurl http://controller.nice.com:35357/v2.0 \
--region regionOne

2.4.3.6 确认操作
# Step1:删除OS_SERVICE_TOKEN 和 OS_SERVICE_ENDPOINT 临时变量
unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

# Step2:使用admin租户和用户请求认证令牌
keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS --os-auth-url http://controller.nice.com:35357/v2.0 token-get

# Step3:以admin租户和用户的身份查看租户列表
keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS --os-auth-url http://controller.nice.com:35357/v2.0 tenant-list

# Step4:以admin租户和用户的身份查看用户列表
keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS --os-auth-url http://controller.nice.com:35357/v2.0 user-list

2.4.3.7 创建 OpenStack 客户端环境脚本
# 为了方便使用上面的环境变量和命令选项,为admin和demo租户和用户创建环境脚本
# 编辑admin-openrc.sh
vim admin-openrc.sh
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller.nice.com:35357/v2.0

# 编辑demo-openrc.sh
vim demo-openrc.sh
export OS_TENANT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=DEMO_PASS
export OS_AUTH_URL=http://controller.nice.com:5000/v2.0

# 加载客户端环境脚本
source admin-openrc.sh
source demo-openrc.sh

2.5 Glance 组件说明

2.5.1 组件说明

Glance 服务功能

  • OpenStack 镜像服务(Glance)使用户能够发现,注册并检索虚拟机镜像(.img文件)
  • 它提供了一个 REST API 接口,使用户可以查询虚拟机镜像元数据和检索一个实际的镜像文件
  • 不论是简单的文件系统还是 OpenStack 对象存储,都可以通过镜像服务在不同的位置存储虚拟机镜像
  • 默认情况下,上传的虚拟机镜像存储路径为 /var/lib/glance/images

Glance 组件说明

  • glance-api:一个用来接收镜像发现,检索和存储的 API 接口
  • glance-registry:用来存储,处理和检索镜像的元数据。元数据包括对象的大小和类型。glance-registry 是一个 OpenStack 镜像服务使用的内部服务,不要透露给用户
  • Database:用于存储镜像的元数据的大小,类型,支持大多数数据库,一般选择 MySQL 或者 SQLite
  • Storage repository for image files:镜像文件的存储仓库。支持包括普通文件系统在内的各种存储类型。包括对象存储,块设备,HTTP,Amazon S3,但是有些存储只支持只读访问

基本概念

  • Image Identifiers:就是 Image URL,格式 /images/ 全局唯一
  • Image Status 镜像状态:
    • Queued:镜像 ID 已经被保留,镜像还没有上传
    • Saving:镜像正在被上传
    • Active:镜像可以使用了
    • Killed:镜像损坏或者不可用
    • Deleted:镜像被删除
  • Disk Format 磁盘格式:
    • Raw:This is unstructured disk image format
      磁盘镜像实例(二进制存储的方式),优点:访问速度非常快;缺点:不支持动态扩容,前期耗时比较大
    • Vhd:VMware、XEN、Microsoft、VirtualBox
      Microsoft 公司提出的虚拟化格式
    • Vmdk:common format
      VMware 公司提出的虚拟化格式
    • Vdi:VirtualBox、QEMU emulator
      VirtualBox 公司提出的虚拟化格式
    • ISO:optical disc
      基本的镜像存储类型
    • Qcow2:QEMU emulator
      QEMU 支持的类型
    • Aki:Amazon Kernel image
      亚马逊对于 Kernel 推出的镜像类型
    • Ari:Amazon ramdisk image
      亚马逊对于 Ramdisk 推出的镜像类型
    • Ami:Amazon machine image
      亚马逊对于 Machine 推出的镜像类型
  • Container Format 容器格式:
    • Bare
    • Ovf
    • Aki
    • Ami
    • Ari

组件工作流

01.尚硅谷Linux虚拟化教程(OpenStack) - 图11

2.5.2 构建实验

2.5.2.1 在 controller 节点安装并配置 OpenStack 镜像服务 Glance
  • 配置先决条件
  • 完成并配置镜像服务组件
  • 完成安装

2.5.2.2 安装先决条件
# Step1:创建数据库
# a.以数据库管理员root的身份登录数据库
mysql -uroot -pAdmin@h3c

# b.创建glance数据库
CREATE DATABASE IF NOT EXISTS glance;

# c.创建数据库用户glance,并授予其对glance数据库的管理权限
GRANT ALL PRIVILEGES ON keystone.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';

# d.退出数据库连接
exit;

# Step2:启动admin环境脚本
source admin-openrc.sh

# Step3:创建认证服务凭证,完成下列步骤:
# a.创建glance用户
keystone user-create --name glance --pass GLANCE_PASS

# b.将glance用户链接到service租户和admin用户
keystone user-role-add --user glance --tenant service --role admin

# c.创建glance服务
keystone service-create --name glance --type image --description "OpenStack image Service"

# Step4:为OpenStack镜像服务创建认证服务端口
keystone endpoint-create \
--service-id $(keystone service-list | awk '/image / {print $2}') \
--publicurl http://controller.nice.com:9292 \
--internalurl http://controller.nice.com:9292 \
--adminurl http://controller.nice.com:9292 \
--region regionOne

2.5.2.3 安装并配置镜像服务组件
# Step1:安装软件包
yum install -y openstack-glance python-glanceclient

# Step2:编辑/etc/glance/glance-api.conf文件,并完成下列操作
# a.修改[database]小节,配置数据库链接
[database]
...
connection = mysql://glance:GLANCE_DBPASS@controller.nice.com/glance

# b.修改[keystone_authtoken]和[paste_deploy]小节,配置认证服务访问
[keystone_authtoken]
...
auth_url = http://controller.nice.com:5000/v2
identity_url = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = glance
admin_password = GLANCE_PASS
...

[paste_deploy]
...
flavor = keystone

# c.(可选择)在[DEFAULT]小节中配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

# Step3:编辑/etc/glance/glance-registry.conf 文件,并完成下列配置
# a.在[database]小节中配置数据库连接
[database]
...
connection = mysql://glance:GLANCE_DBPASS@controller.nice.com/glance

# b.在[keystone_authtoken]和[paste_deploy]小节中配置日志服务访问
[keystone_authtoken]
...
auth_url = http://controller.nice.com:5000/v2
identity_url = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = glance
admin_password = GLANCE_PASS
...

[paste_deploy]
...
flavor = keystone

# c.在[glance_store]小节中配置本地文件系统存储和镜像文件的存放路径
[glance_store]
...
default_store = file
filesystem_store_datadir = /var/lib/glance/images

# d.(可选择)在[DEFAULT]小节中配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

# Step4:初始化镜像服务的数据库
su -s /bin/sh -c "glance-manager db_sync" glance

# 查看glance数据库信息
mysql -uroot -pAdmin@h3c
> use glance;
> show tables;

2.5.2.4 完成安装
# 启动镜像服务并设置开机自动启动
systemctl enable openstack-glance-api openstack-glance-registry
systemctl start openstack-glance-api openstack-glance-registry

&& 
systemctl enable --now openstack-glance-api openstack-glance-registry

2.5.2.5 验证安装
# 本节演示如何使用 CirrOS 验证镜像服务是否安装成功。CirrOS 是一个小 Linux 镜像,可以帮你验证镜像服务
# 1.创建一个临时目录    
mkdir -pv /tmp/images
cd /tmp/images

# 2.下载CirrOS镜像文件到临时目录
wget http://cdn.download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img (真实环境)
wget ftp://ftp服务器IP/cirros-0.3.3-x86_64-disk.img (实验室环境)

# 3.运行admin环境脚本,以便执行管理命令
source admin-openrc.sh

# 4.上传镜像文件到镜像服务器
glance image-create --name "cirros-0.3.3-x86_64" --file cirros-0.3.3-x86_64-disk.img \
--disk-format qcow2 --container-format bare --is-public True --progress

# 5.查看镜像文件上传并验证属性
glance image-list

# 6.删除临时目录
rm -rf /tmp/images
  • glance image-create 相关选项含义:
--name <NAME>
    镜像名称
-- file <FILE>
    要上传文件及路径
--disk-format <DISK_FORMAT>
    镜像的磁盘格式。可以支持:ami,aki,vhd,vmdk,raw,qcow2,vdi,iso格式
--container-format <CONTAINER_FORMAT>
    镜像容器格式。可以支持:ami,ari,aki,bare,ovf格式
--is-public {True , False}
    镜像是否可以被公共访问
--progress
    显示上传速度

2.6 Nova Compute 组件说明

2.6.1 Nova 是什么

OpenStack 是由 RackSpace 和 NASA 共同开发的云计算平台(管理底层的虚拟化;提供虚拟化管理服务)

类似于 Amazon EC2 和 S3 的云基础架构服务

Nova 在 OpenStack 中提供云计算服务

超过 140 家企业及 18470 位开发者参与开发

  • 参与开发的厂家

现在已经有来自100多个国家的数万名个人和200多家企业参与到OpenStack的开发,如 NASA、华为、谷歌、惠普HP、Intel、IBM、微软、红帽RedHat、新浪微博等。

2.6.2 组件说明 - API

nova-api service 接收并响应终端用户计算 API 调用。该服务支持 OpenStack 计算 API,Amazon EC2 和特殊的管理特权 API

nova-api-metadata service 接受从实例元数据发来的请求。该服务通常与 nova-network 服务在安装多主机模式下运行(需要安装在每台 Computer 节点上)

2.6.3 组件说明 - Core

nove-computer service 一个守护进程,通过虚拟化层API接口创建和终止虚拟机实例。例如:XenAPI for XenServer/XCP,libvirt for KVM or QEMU,VMwareAPI for VMware

nova-scheduler service 从队列中获取虚拟机实例请求,并确认由哪台计算服务运行该虚拟机

nove-conductor module 协调 nove-computer 服务和 database 之间的交互数据。避免 nova-compute 服务这直接访问云数据库。不要将该模块部署在 nove-compute 运行的节点上

2.6.4 组件说明 - Networking

nova-network worker daemon 类似于nova-computer 服务,接收来自队列的网络任务和操控网络。比如这只网卡桥接或者改变iptables 规则

nova-consoleauth daemon 在控制台代理提供用户授权令牌

nova-novncporxy daemon 提供了一个通过 VNC 连接来访问运行的虚拟机实例的代理。支持基于浏览器的 novnc 客户端

nova-spicehtml5proxy daemon 提供一个通过 spice 连接来访问运行的虚拟机实例的代理。支持基于浏览器的 HTML 5 客户端

nova-xvpnvncproxy daemon 提供了一个通过 VNC 连接来访问运行的虚拟机实例的代理。支持 OpenStack-specific Java 客户端

nova-cert daemon x509 证书

2.6.5 组件说明 - Other

nova-objectstore daemon 一个 Amazon S3 接口,用于将 Amazon S3 的镜像注册到 OpenStack euca2ools client 用于兼容于 Amazon E2 接口的命令行工具

nova client nova 命令行工具

The queue 在进程之间传递消息的中心,通常使用 RabbitMQ

SQL database 保存云基础设置建立和运行时的状态信息

2.6.6 组件说明 - 位置顺序

01.尚硅谷Linux虚拟化教程(OpenStack) - 图12

2.6.7 Nova 内部沟通

01.尚硅谷Linux虚拟化教程(OpenStack) - 图13

2.6.8 Nova 同其他组件沟通

Nova同其他组件沟通

2.6.9 虚拟机启动流程

虚拟机启动流程

2.6.10 构建实验 - Computer 组件安装

  • 在 Computer 节点初始化环境
# Step 1:关闭 Network Manager
systemctl stop NetworkManager
systemctl disable NetworkManager

# Step 2:关闭防火墙和SELINUX
systemctl stop firewalld
systemctl disable firewalld

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# Step 3:设置主机名
hostnamectl set-hostname xx.xx.xx

# Step 4:配置各个机器的IP地址

$ vim /etc/hosts
10.0.0.21   controller.nice.com
10.0.0.22   computer1.nice.com
10.0.0.23   block1.nice.com
10.0.0.24   network.nice.com

# Step 5:配置时间同步服务器
controller.nice.com ntp server controller
other server         ntp client
$ yum install -y ntpdate
$ /sbin/ntpdate -u controller.nice.com
$ /sbin/ntpdate -u controller.nice.com &> /dev/null
# 设置定时任务
$ crontab -e 
*/1 * * * * /sbin/ntpdate -u controller.nice.com &> /dev/null
$ systemctl enable --now crond
# 安装 OpenStack 预备包
# 1.安装 yum-plugin-priorities 包,防止高优先级软件被低优先级软件覆盖
yum install -y yum-plugin-priorities

# 2.安装 Base YUM,epel扩展YUM源
curl -k -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 3.安装 OpenStack YUM 源
# yum install -y http://rdo.fedorapeople.org/openstack-juno/rdo-release-juno.rpm
tee > /etc/yum.repos.d/CentOS-OpenStack.repo <<-'EOF'
# [openstack-queens]
# name=openstack-queens
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-queens/
# enabled=1
# gpgcheck=0
# [openstack-stein]
# name=openstack-stein
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-stein
# enabled=1
# gpgcheck=0
# [openstack-train]
# name=openstack-train
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-train
# enabled=1
# gpgcheck=0

[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0

[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF
# 4.更新操作系统
yum upgrade -y

# 5.安装 OpenStack-selinux 自动管理 SElinux
yum install -y openstack-selinux

2.6.10.1 安装和配置 controller 节点
  • 配置先决条件
  • 安装和配置计算控制组件
  • 完成安装

2.6.10.2 配置先决条件(在 Controller 节点)
# Step1:创建数据库,完成下列步骤:
# a.使用数据库管理员 root 登录数据库
mysql -uroot -pAdmin@h3c

# b.创建 nova 数据库
CREATE database nova;

# c.创建数据库用户 nova,并授予nova用户对nova数据库的完全控制权限
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';

# d.退出数据库连接
exit

# Step2:执行admin环境脚本
# 编辑admin-openrc.sh
vim admin-openrc.sh
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller.nice.com:35357/v2.0

source admin-openrc.sh

# Step3:在认证服务中创建计算服务的认证信息。完成下列步骤:
# a.创建nova 用户
keystone user-create --name nova --pass NOVA_PASS

# b.链接nova 用户到service租户和admin角色
keystone user-role-add --user nova --tenant service --role admin

# c.创建nova 服务
keystone serivce-create --name nova --type compute --description "OpenStack Compute"

# Step4:创建计算服务端点
keystone endpoint-create \
--service-id ${keystone service-list | awk '/ compute / {print $2}'} \
--publicurl http://controller.nice.com:8774/v2/%\(tenant_id\)s \
--internalurl http://controller.nice.com:8774/v2/%\(tenant_id\)s \
--adminurl http://controller.nice.com:8774/v2/%\(tenant_id\)s \
--region regionOne

2.6.10.3 安装和配置计算控制组件
# Step1:安装软件包
yum install -y openstack-nova-api openstack-nova-cert openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler python-novaclient

# Step2:编辑/etc/nova/nova.conf 文件,完成如下操作:
# a.编辑[database]小节,配置数据库访问:
[database]
...
connection = mysql://nova:NOVA_DBPASS@controller.nice.com/nova

# b.编辑[DEFAULT]小节,配置RabbitMQ消息队列访问:
[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# c.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = nova
admin_password = NOVA_PASS

# d.编辑[DEFAULT]小节,配置my_ip选项为controller节点的管理接口IP
[DEFAULT]
...
my_ip = 10.0.0.21

# e.编辑[DEFAULT]小节,配置VNCdialing服务的使用controller节点的管理接口IP
[DEFAULT]
...
vncserver_listen = 10.0.0.21
vncserver_proxyclient_address = 10.0.0.21

# f.编辑[glance]小节,配置镜像服务器的位置
[glance]
...
host = controller.nice.com

# g.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

# Step3:初始化计算数据库
su -s /bin/sh -c "nova-manage db sync" nova

mysql -uroot -pAdmin@h3c
> use nova;
> show tables

2.6.10.4 完成安装
# 完成计算服务并配置开机自动启动
systemctl start openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
systemctl enable openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service

# 或者使用
systemctl enable --now openstack-nova-api.service openstack-nova-cert.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service

2.6.10.5 安装配置一个 computer 节点
  • 完成并配置计算虚拟化组件
  • 完成安装

2.6.10.6 完成并配置计算虚拟化组件
# Step1:安装软件包
yum install -y openstack-nova-computer sysfsutils

# Step2:编辑/etc/nova/nova.conf 文件,完成下列步骤:
# a.编辑[DEFAULT]小节,配置RabbitMQ消息队列访问:
[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# b.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = nova
admin_password = NOVA_PASS

# c.编辑[DEFAULT]小节,配置my_ip选项为controller节点的管理接口IP
[DEFAULT]
...
my_ip = MANAGREMENT_INTERACE_IP_ADDRESS

# d.编辑[DEFAULT]小节,开启并配置远程控制台访问
[DEFAULT]
...
vnc_enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = MANAGREMENT_INTERACE_IP_ADDRESS
novncproxy_base_url = http://controller.nice.com:6080/vnc_auto.html

# e.编辑[glance]小节,配置镜像服务器位置
[glance]
...
host = controller.nice.com

# f.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

2.6.10.7 完成安装
# Step1:确认计算节点是否支持硬件虚拟化
$ egrep -c '(vmx|svm)' /proc/cpuinfo
# 如果返回值>=1,则说明你的计算节点硬件支持虚拟化,无需额外配置
# 如果返回值=0,则说明你的计算节点硬件不支持虚拟化,你必须配置libvirt由使用KVM改为QEMU
# 在/etc/nova/nova.conf 文件中编辑[libvirt]小节
[libvirt]
...
virt_type = qemu

# Step2:启动计算服务以及依赖访问,并配置开机自动启动
systemctl enable libvirtd.service openstack-nova-computer.service
systemctl start libvirtd.service openstack-nova-computer.service
# 或者使用
systemctl enable --now libvirtd.service openstack-nova-computer.service

2.6.10.8 在Controller 节点上验证安装
# Step1:启动admin环境脚本
vim admin-openrc.sh
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller.nice.com:35357/v2.0

source admin-openrc.sh

# Step2:列出服务组件确认每一个进程启动成功
nova service-list

# Step3:列出镜像服务中的镜像列表,确认连接认证服务器和镜像服务器成功
nova image-list

2.7 网络基础说明

  • OSI 七层模型 & TCP / IP

01.尚硅谷Linux虚拟化教程(OpenStack) - 图16

  • 集成网络

01.尚硅谷Linux虚拟化教程(OpenStack) - 图17

  • 存在区别
  • 工作层次不同

L2(交换机工作在数据链路层) / L3(路由器工作在网络层)

  • 数据转发依据对象不同

数据帧(MAC) / 数据包(IP)

  • 解决问题不同

同网段互通 / 不同网段互通

  • 路由表
route
  • 防火墙
ip netns exec router-ns iptables -t nat -nL
  • 混杂模式
  • 接受所有经过设备的数据包
  • 一般用于网络抓包
  • Floating IP(浮动IP) 功能实现
  • 网络名字命名空间

01.尚硅谷Linux虚拟化教程(OpenStack) - 图18

Network NameSpace

  • 叠加网络

1.一个数据包(或者帧)封装在另一个数据包内;被封装的包转发到隧道端点后再被拆装

2.叠加网络就是使用这种所谓”包内之包”的技术安全的将一个网络隐藏在另一个网络中,然后将网段进行迁移

  • Vlan ==> L2 over L2
  • GRE ==> L3 over L3 (UDP)
  • Vxlan ==> L2 over L3 (UDP)

3.在Docker中叠加网络是重新封装数据包只需转发到对应的网卡中拆封;在OpenStack中重新封装数据包只需转发到隧道端点后再被拆装

  • GRE SDN 网络优缺点

优点:不用变更底层网络架构重建 L2、L3 通信,实现不同 Host 之间网络互通,方便迁移,支持网络数量扩大

缺点:大规模部署问题,性能问题

01.尚硅谷Linux虚拟化教程(OpenStack) - 图20

  • 叠加网络所解决问题

数据中心网络数量限制:

  • 1 > 4096 > 1600W

物理网络基础设施限制:

  • 不改变物理网络变更 VM 网络拓扑
  • VM 迁移

多租户:

  • 支持 IP 地址重叠
  • Open vswitch
  • 网络隔离:Vlan GRE Vxlan
  • Qos 配置(流量配置)
  • 流量监控
  • 数据包分析

2.8 Neutron 网络说明

Nova-network

  • FLAT
  • FlatDHCP
  • Vlan

01.尚硅谷Linux虚拟化教程(OpenStack) - 图21

2.8.1 FLAT

  • 指定一个子网,规定虚拟机能使用的 IP 地址范围
  • 创建实例时,从有效 IP 地址池获取一个 IP,为虚拟机实例分配,然后在虚拟机启动的时候注入虚拟机镜像(文件系统)
  • 手动配置好网桥,所有的系统实例都是和同一个网桥连接;网桥连接到网桥的实例组成一个虚拟网络
  • 网络控制器对虚拟机实例进行NAT 转换,实现与外部的通信
  • 目前配置注入只能对类 UNIX 操作系统正常工作

2.8.2 FLATDHCP

  • 在 FLAT 网络模式下添加了 DHCP 功能
  • 网络控制器运行 DNSmasp作为 DHCP 服务器监听这个网桥

2.8.3 VLAN

  • 每个用户分配一个 VLAN,每个用户创建的 网络接口在同一个 VLAN 中
  • 每个用户分配一个网段,网络控制器上的 DHCP 服务器为所有的 VLAN 分配地址
  • 解决了隔离问题,但是 VLAN 限制为 4096 个,符合私有云

2.8.4 Nova-network 存在的问题

  • 传统桥接模式
  • 用户不能自定义网络
  • 网络隔离
  • 大规模不合适

2.8.5 需求

  • 基础需求
    • 高密度
    • 多租户
    • 大规模扩展
    • 虚拟机的可移动性
    • 资源管理自动化
    • 低成本实现
  • 企业级需求
    • 自定义网络
    • Qos 保证
    • 防火墙
    • 监控,审计

2.8.6 Neutron 基本概念

Neutron 网络连接服务

面向租户 API 接口,用于创建虚拟网络,路由器,负载均衡,关联网络接口至指定网络和路由

通过API 接口管理虚拟或者物理交换机

提供 Plugin 架构来支持不同的技术平台

Neutron Private Network - 提供固定私网地址

Neutron Public Network - 提供浮动 IP 地址

2.8.7 Neutron 关键概念

  • Network
    • 一个 L2 网络单元
    • 租户可通过 Neutron API 创建自己的网络
  • Subnet
    • 一段 IPV4 / IPV6 地址段
    • 为 Instance 提供私网或者公网地址
  • Router
    • 三层路由器(虚拟)
    • 为租户的 Instance 提供路由功能
  • Port
    • 虚拟交换机上的端口
    • 管理 Instance 的网卡
  • 概念间的对应关系

    01.尚硅谷Linux虚拟化教程(OpenStack) - 图22

2.8.8 Neutron 组件架构

Neutron组件架构

Neutron 是通过插件管理器(Neutron Plugin)去构建的

01.尚硅谷Linux虚拟化教程(OpenStack) - 图24

从Neutron的架构图不难看出Neutron的大体服务构成以及各个服务组件的职能,而它一般的工作流程如下:

  • Neutron Server接收用户请求,把请求存放到消息队列中;
  • Neutron Plugin从MQ中获得请求,在DB中维护网络的状态信息,然后把请求存放到MQ等待Neutron Agent处理;
  • Neutron Agent从MQ中获取Plugin的请求,交由Network Provider处理具体的网络请求;

2.8.9 Neutron Plugin(插件管理器)

  • Open VSwitch
  • Linux Bridge
  • Ciso NX1000
  • Nicira NVP
  • Ryu
  • NEC OpenFlow
  • Floodnight

2.8.10 Neutron + Nova 架构

Neutron + Nova架构

首先会有Horizon项目中 Dashboard的仪表盘套件,仪表盘套件输入对应的指令会自动工具的整理,通过每个租户的自己的API接口去访问不同的服务。如果是网络服务的访问,会通过 Neutron API 接口接收到后,再通过 Neutron Plugin 去实现。这个实现的过程是需要通过消息队列 代理(通知)至 Vswitch 中,Vswtich 在当前节点做相应的操作。

如果是计算服务的访问,会通过 Nova API 接口接收到,Nova API 如果是创建主机的话,会被Nova scheduler 调度到,然后调度到对应的Nova computer进行代理。Nova computer去触发 libvirt 之后触发 Hypervisor 进行创建 VM

2.8.11 Neutron 组件

01.尚硅谷Linux虚拟化教程(OpenStack) - 图26

Neutron Server

  • 实现 Neutron API 和 API 扩展
  • 管理 Network、Subnet、Pod
  • 管理 Port 的 IP地址

ML2 agent

  • 运行在每个计算节点上(实现IP地址通信)
  • 连接虚拟机到网络端口

DHCP agent

  • 负责 DHCP 配置,为虚拟机分配 IP
  • 开始 / 停止 DHCP 服务器以及相关配置

L3-agent

  • 负责公网浮动 IP 地址和 NAT
  • 负责其他三层特性,例如:负载均衡等
  • 每个 Network 对应一个 L3 agent

Metadata-agent

  • 提供元数据服务

Neutron组件通信过程

  • ML2

ML2

  • ML2 构建模式

ML2构建模式

  • Neutron 部署类型

Single FLAT Network

  • 类似 Flat manager
  • FlatDHCP Manager
  • 不支持 Floating IP

01.尚硅谷Linux虚拟化教程(OpenStack) - 图30

Multi FLAT Network

Muliple FLAT Network

  • 类似 Flat manager
  • FlatDHCP Manager
  • 不支持 Floating IP

Muliple FLAT Network

Mixed FLAT and Private Network

  • 类似 Flat manager
  • FlatDHCP Manager
  • 支持 Floating IP

Mixed FLAT and Private Network

Provider Routers with Private Network

  • 类似 Flat manager
  • FlatDHCP Manager
  • 支持 Floating IP
  • 不同的租户使用的是同一个路由器。

Provider Routers with Private Network

*Per-tenant Routers with Private Network

  • 类似 Flat manager
  • FlatDHCP Manager
  • 支持 Floating IP
  • 不同的租户使用的是各自的路由器。一个租户下可以存在多个网段

Per-tenant Routers with Private Network

2.9 Neutron 代码构建

  • 在 Neutron 节点初始化环境
# Step 1:关闭 Network Manager
systemctl stop NetworkManager
systemctl disable NetworkManager

# Step 2:关闭防火墙和SELINUX
systemctl stop firewalld
systemctl disable firewalld

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# Step 3:设置主机名
hostnamectl set-hostname xx.xx.xx

# Step 4:配置各个机器的IP地址

$ vim /etc/hosts
10.0.0.21   controller.nice.com
10.0.0.22   computer1.nice.com
10.0.0.23   block1.nice.com
10.0.0.24   network.nice.com

# Step 5:配置时间同步服务器
controller.nice.com ntp server controller
other server         ntp client
$ yum install -y ntpdate
$ /sbin/ntpdate -u controller.nice.com
$ /sbin/ntpdate -u controller.nice.com &> /dev/null
# 设置定时任务
$ crontab -e 
*/1 * * * * /sbin/ntpdate -u controller.nice.com &> /dev/null
$ systemctl enable --now crond
# 安装 OpenStack 预备包
# 1.安装 yum-plugin-priorities 包,防止高优先级软件被低优先级软件覆盖
yum install -y yum-plugin-priorities

# 2.安装 Base YUM,epel扩展YUM源
curl -k -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 3.安装 OpenStack YUM 源
# yum install -y http://rdo.fedorapeople.org/openstack-juno/rdo-release-juno.rpm
tee > /etc/yum.repos.d/CentOS-OpenStack.repo <<-'EOF'
# [openstack-queens]
# name=openstack-queens
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-queens/
# enabled=1
# gpgcheck=0
# [openstack-stein]
# name=openstack-stein
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-stein
# enabled=1
# gpgcheck=0
# [openstack-train]
# name=openstack-train
# baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-train
# enabled=1
# gpgcheck=0

[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0

[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF
# 4.更新操作系统
yum upgrade -y

# 5.安装 OpenStack-selinux 自动管理 SElinux
yum install -y openstack-selinux

2.9.1 安装并配置 controller 节点

  • 配置先决条件
  • 安装网络服务组件
  • 配置网络服务组件
  • 配置Modular Layer2(ML2)插件
  • 配置计算服务使用 Neutron
  • 完成安装
  • 验证

2.9.2 配置先决条件

# Step1:创建数据库,完成下列步骤
# a.使用 root 用户连接mysql数据库
mysql -uroot -pAdmin@h3c

# b.创建neutron 数据库
CREATE DATABASE neutron

# c.创建数据库用户neutron ,并授予neutron 用户对neutron 数据库完全控制权限
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';

# d.退出数据库连接
exit

# Step2:执行 admin 环境变量脚本
source admin-openrc.sh

# Step3:在认证服务中创建网络服务的认证信息,完成下列步骤
# a.创建neutron 用户
keystone user-create --name neutron --pass NEUTRON_PASS

# b.连接neutron 用户到 service租户和admin角色
keystone user-role-add --user neutron --tenant service --role admin

# c.创建neutron 服务
keystone service-create --name neutron --type network --descripte "OpenStack Networking"

# d.创建neutron 服务端点
keystone endpoint-create \
--service-id ${keystone service-list | awk '/ network / {print $2}'} \
--publicurl http://controller.nice.com:9696 \
--internalurl http://controller.nice.com:9696 \
--adminurl http://controller.nice.com:9696 \
--region regionOne

2.9.3 安装网络服务组件

yum install -y openstack-neutron openstack-neutron-ml2 python-neutronclient which

2.9.4 配置网络服务组件

# Step1:编辑 /etc/neutron/neutron.conf 文件,并完成下列操作:
# a.编辑[database]小节,配置数据库访问
[database]
...
connection = mysql://neutron:NEUTRON_DBPASS@controller.nice.com/neutron

# b.编辑[DEFAULT],配置RabbitMQ消息队列访问
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# c.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS

# d.编辑[DEFAULT]小节,配置启用Modular Layer(ML2)插件,路由服务和重叠IP地址功能
[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

# e.编辑[DEFAULT]小节,配置当网络拓扑结构发生变化时通知计算服务
[DEFAULT]
...
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controller.nice.com:8774/v2
nova_admin_auth_url = http://controller.nice.com:35357/v2.0
nova_region_name = regionOne
nova_admin_username = nova
nova_admin_tenant_id = SERVICE_TENANT_ID
nova_admin_password = NOVA_PASS
# 注意:可以通过keystone tenant-get service,获取service 租户的ID

# f.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

2.9.5 配置Modular Layer 2(ML2) plugin

# Step1:编辑/etc/neutron/plugins/ml2/ml2_conf.ini 文件,并完成下列操作:
# a.编辑[ml2]小节,启用flat 和 generic routing encapsulation(GRE)网络类型驱动,配置GRE租户网络和OVS驱动机制
[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openswitch

# b.编辑[ml2_type_gre]小节,配置隧道标识范围
[ml2_type_gre]
...
tunnel_id_ranges = 1:1000

# c.编辑[securitygroup]小节,启用安全组,启用ipset并配置 OVS 防火墙驱动
[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables.OVSHybridIptablesFirewallDriver

2.9.6 配置计算服务使用 Neutron

  • 默认情况下,计算服务使用的是传统网络,我们需要重新配置。
# 编辑/etc/nova/nova.conf 文件,并完成下列操作:
# a.编辑[DEFAULT]小节,配置 API 接口和驱动程序
[DEFAULT]
...
network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver
firewalld_driver = nova.virt.firewall.NoopFirewallDriver

# b.编辑[neutron]小节,配置访问参数:
[neutron]
...
url = http://controller.nice.com:9696
auth_strategy = keystone
admin_auth_url = http://controller.nice.com:35357/v2.0
admin_tenant_name = service
admin_username = neutron
admin_password = NEUTRON_PASS

2.9.7 完成配置

# Step1:为ML2插件配置文件创建连接文件
ln -sv /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

# Step2:初始化数据库
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade juno" neutron

# Step3:重新启动计算服务
systemctl restart openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service

# Step4:启动网络服务并配置开机自动启动
systemctl enable neutron-server.service
systemctl start neutron-server.service

2.9.8 验证

# Step1:执行 admin 环境变量脚本
source admin-openrc.sh

# Step2:列出加载的扩展模块,确认成功启动 neutron-server 进程
neutron ext-list

2.9.9 安装并配置 network 节点

  • 配置先决条件
  • 安装网络组件
  • 配置网络通用组件
  • 配置Modular Layer 2(ML2) plugin
  • 配置 Layer-3(L3) agent
  • 配置 DHCP agent
  • 配置metadata agent
  • 配置 Open vSwitch(OVS)服务
  • 完成安装
  • 验证

2.9.10 配置先决条件

# Step1:编辑/etc/sysctl.conf 文件,包括下列参数
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

# Step2:使其更改生效
sysctl -p

2.9.11 安装网络组件

yum install -y openstack-neutron openstack-neutron-ml2 openstack-neutron-openvswitch

2.9.12 配置网络通用组件

网络通用组件配置包括认证机制,消息队列以及插件

# 编辑 /etc/neutron/neutron.conf 文件并完成下列操作:
# a:编辑[database]小节,注释任何connection 选项,因为network节点不能直接连接数据库

# b:编辑[DEFAULT]小节,配置RabbitMQ消息队列访问
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# c.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS

# d.编辑[DEFAULT]小节,配置启用Modular Layer(ML2)插件,路由服务和重叠IP地址功能
[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

# e.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

2.9.13 配置Modular Layer 2(ML2) plugin

ML2 插件使用Open vSwitch (OVS)机制为虚拟机实例提供网络框架。

# Step1:编辑/etc/neutron/plugins/ml2/ml2_conf.ini 文件,并完成下列操作:
# a.编辑[ml2]小节,启用flat 和 generic routing encapsulation(GRE)网络类型驱动,配置GRE租户网络和OVS驱动机制
[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openswitch

# b.编辑[ml2_type_flat]小节,配置外部网络
[ml2_type_flat]
...
flat_networks = external

# c.编辑[ml2_type_gre]小节,配置隧道标识范围
[ml2_type_gre]
...
tunnel_id_ranges = 1:1000

# d.编辑[securitygroup]小节,启用安全组,启用ipset并配置 OVS 防火墙驱动
[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables.OVSHybridIptablesFirewallDriver

# e.编辑[ovs]小节,配置 Open vSwitch(OVS)代理
[ovs]
...
local_ip = INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS(172.16.0.6)
tunnel_type = gre
enable_tunneling = True
bridge_mappings = external:br-ex

2.9.14 配置 Layer-3(L3) agent

# 编辑 /etc/neutron/l3_agent.ini 文件并完成下列配置:
# a.编辑[DEFAULT]小节,配置驱动,启用网络命名空间,配置外部网络桥接
[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge = br-ex

# b.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
debug = True

2.9.15 配置DHCP agent

# Step1:编辑 /etc/neutron/dhcp_agent.ini 文件并完成下列配置:
# a.编辑[DEFAULT]小节,配置驱动和启用网络命名空间
[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True

# b.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
debug = True

# Step2:(可选择)在VMware虚拟机中可能是必要的!配置DHCP选项,将MTU改为1454bytes,以改善网络性能
# a.编辑/etc/neutron/dhcp_agent.ini 文件并完成下列步骤
# 编辑[DEFAULT]小节,启用Dnsmasq配置
[DEFAULT]
...
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

# b.创建并编辑 /etc/neutron/dnsmasq-neutron.conf 文件中完成下列的配置:
# 启用 DHCP MTU选项(26)并配置值为1454bytes
dhcp-option-force = 26,1454
user = neutron
group = neutron

# c.终止任何已经存在的 dnsmasq 进行
pkill dnsmasq

2.9.16 配置 metadata agent

# Step1:编辑/etc/neutron/metadata_agent.ini文件并完成下列配置
# a.编辑[DEFAULT]小节,配置访问参数
[DEFAULT]
...
auth_uri http://controller.nice.com:5000/v2.0
auth_region = regionOne
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS

# b.编辑[DEFAULT]小节,配置元数据主机
[DEFAULT]
...
nova_metadata_ip = controller.nice.com

# c.编辑[DEFAULT]小节,配置元数据代理共享机密暗号
[DEFAULT]
...
metadata_proxy_shared_secret = METADATA_SECRET

# d.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
debug = True

# Step2:在controller节点,编辑/etc/nova/nova.conf 文件并完成下列配置
# 编辑[neutron]小节,启用元数据代理并配置机密暗号
[neutron]
...
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET

# Step3:在controller节点,重新启动 compute API服务
systemctl restart openstack-nova-api.service

2.9.17 配置 Open vSwitch(OVS)服务

# Step1:启动OVS服务并配置开机自动启动
systemctl enable openvswitch.service
systemctl start openvswitch.service

# Step2:添加外部网桥(external bridge)
ovs-vsctl add-br br-ex

# Step3:添加一个端口到外部网桥,用于连接外部物理网络
ovs-vsctl add-port br-ex INTERFACE_NAME
# 注意:将INTERFACE_NAME换成实际连接外部网卡接口名。如:eth2或者eno50332208

2.9.18 完成安装

# Step1:创建网络服务初始化脚本的符号连接
ln -sv /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

cp /usr/lib/systemd/system/neutron-openvswitch-agent.service /usr/lib/systemd/system/neutron-openvswitch-agent.service.orig

sed -i 's,plugins/openvswitch/ovs_neutron_plugin.ini,plugin.ini,g' /usr/lib/systemd/system/neutron-openvswitch-agent.service

# Step2:启动网络服务并设置开机自动启动
systemctl enable neutron-openvswitch-agent.service neutron-l3-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-ovs-cleanup.service
systemctl start neutron-openvswitch-agent.service neutron-l3-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-ovs-cleanup.service

2.9.19 验证(在Controller 节点执行下列命令)

# Step1:执行 admin 环境变量脚本
source admin-openrc.sh

# Step2:列出neutron代理,确认启动neutron agents成功
neutron agent-list

2.9.20 安装并配置 computer1 节点

  • 配置先决条件
  • 安装网络组件
  • 配置网络通用组件
  • 配置Modular Layer 2(ML2) plugin
  • 配置 Open vSwitch(OVS)service
  • 配置计算服务使用网络
  • 完成安装
  • 验证

2.9.21 配置先决条件

# Step1:编辑/etc/sysctl.conf 文件,使其包括下列参数:
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.default.rp_filter = 0

# Step2:使其更改生效
sysctl -p

2.9.22 安装网络组件

yum install -y openstack-neutron-ml2 openstack-neutron-openvswitch

2.9.23 配置网络通用组件

# 编辑 /etc/neutron/neutron.conf 文件并完成下列操作
# a.编辑[database]小节,注释任何connection 选项,因为计算节点不能直接连接数据库

# b:编辑[DEFAULT]小节,配置RabbitMQ消息队列访问
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# c.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = neutron
admin_password = NEUTRON_PASS

# d.编辑[DEFAULT]小节,配置启用Modular Layer(ML2)插件,路由服务和重叠IP地址功能
[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

# e.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

2.9.24 配置Modular Layer 2(ML2) plugin

# Step1:编辑/etc/neutron/plugins/ml2/ml2_conf.ini 文件,并完成下列操作:
# a.编辑[ml2]小节,启用flat 和 generic routing encapsulation(GRE)网络类型驱动,配置GRE租户网络和OVS驱动机制
[ml2]
...
type_drivers = flat,gre
tenant_network_types = gre
mechanism_drivers = openswitch

# b.编辑[ml2_type_gre]小节,配置隧道标识范围
[ml2_type_gre]
...
tunnel_id_ranges = 1:1000

# c.编辑[securitygroup]小节,启用安全组,启用ipset并配置 OVS 防火墙驱动
[securitygroup]
...
enable_security_group = True
enable_ipset = True
firewall_driver = neutron.agent.linux.iptables.OVSHybridIptablesFirewallDriver

# d.编辑[ovs]小节,配置 Open vSwitch(OVS)代理
[ovs]
...
local_ip = INSTANCE_TUNNELS_INTERFACE_IP_ADDRESS(172.16.0.10)
tunnel_type = gre
enable_tunneling = True

2.9.25 配置Open vSwitch(OVS)Service

# 启动OVS服务并设置开机自动启动
systemctl enable openvswitch.service
systemctl start openvswitch.service

2.9.26 配置计算服务使用网络

# 编辑/etc/nova/nova.conf 文件并完成下列操作
# a.编辑[DEFAULT]小节,配置API接口和驱动
[DEFAULT]
...
network_api_class = nova.network.neutronv2.api.API
security_group_api = neutron
linuxnet_interface_driver = nova.network.linux_net.LinuxOVSInterfaceDriver
firewalld_driver = nova.virt.firewall.NoopFirewallDriver

# b.编辑[neutron]小节,配置访问参数:
[neutron]
...
url = http://controller.nice.com:9696
auth_strategy = keystone
admin_auth_url = http://controller.nice.com:35357/v2.0
admin_tenant_name = service
admin_username = neutron
admin_password = NEUTRON_PASS

2.9.27 完成安装

# Step1:创建网络服务初始化脚本的符号连接
ln -sv /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

cp /usr/lib/systemd/system/neutron-openvswitch-agent.service /usr/lib/systemd/system/neutron-openvswitch-agent.service.orig

sed -i 's,plugins/openvswitch/ovs_neutron_plugin.ini,plugin.ini,g' /usr/lib/systemd/system/neutron-openvswitch-agent.service

# Step2:启动网络服务并设置开机自动启动
systemctl enable neutron-openvswitch-agent.service 
systemctl start neutron-openvswitch-agent.service

2.9.28 验证(在Controller节点执行下列命令)

# Step1:执行 admin 环境变量脚本
source admin-openrc.sh

# Step2:列出加载的扩展模块,确认成功启动 neutron-server 进程
neutron ext-list

2.9.29 创建第一个网络

创建第一个网络

2.9.30 配置外部网络(在Controller节点执行下列命令)

  • 创建一个外部网络
  • 创建一个外部网络的子网

2.9.31 创建一个外部网络

# Step1:执行 admin 环境变量脚本
source admin-openrc.sh

# Step2:创建网络
neutron net-create ext-net --shared --router:external True --provider:physical_network external --provider:network_type flat

2.9.32 创建一个外部网络的子网

# Step1:创建子网
neutron subnet-create ext-net --name ext-subnet \
--allocation-pool start=FLOATING_IP_START,end=FLOATING_IP_END \
--disable-dhcp --gateway EXTERNAL_NETWORK_GATEWAY EXTERNAL_NETWORK_CIDR

FLOATING_IP_START        :起始IP
FLOATING_IP_END            :结束IP
EXTERNAL_NETWORK_GATEWAY:外部网络网关
EXTERNAL_NETWORK_CIDR    :外部网络网段

# 例如:外网网段为10.0.0.0/24,浮动地址范围为:10.0.0.100 ~ 10.0.0.200,网关为:10.0.0.1
neutron subnet-create ext-net --name ext-subnet \
--allocation-pool start=10.0.0.100,end=10.0.0.200 \
--disable-dhcp --gateway 10.0.0.1 10.0.0.0/24

2.9.33 配置租户网络(在Controller节点执行下列命令)

  • 创建租户网络
  • 创建租户网络的子网
  • 在租户网络创建一个路由器,用来连接外部网和租户网

2.9.34 创建租户网络

# Step1:执行 admin 环境变量脚本
source admin-openrc.sh

# Step2:创建租户网络
neutron net-create demo-net

2.9.35 创建租户网络的子网

# 创建子网
neutron subnet-create demo-net --name demo-subnet \
--gateway TENANT_NETWORK_GATEWAY TENANT_NETWORK_CIDR

TENANT_NETWORK_GATEWAY:租户网的网关
TENANT_NETWORK_CIDR      :租户网的网段

# 例如:租户网的网段为192.168.2.0/24,网关为192.168.2.1(网关通常默认为.1)
neutron subnet-create demo-net --name demo-subnet \
--gateway 192.168.2.1 192.168.2.0/24

2.9.36 在租户网络创建一个路由器,用来连接外部网和租户网

# Step1:创建路由器
neutron router-create demo-router

# Step2:附加路由器到demo租户的子网
neutron router-interface-add demo-router demo-subnet

# Step3:通过设置网关,使得路由器附加的外部网
neutron router-gateway-set demo-router ext-net

2.9.37 确认连接

# Step1:查看路由器获取到的IP
neutron router-list

2.10 Horizon - 仪表盘套件

OpenStack B/S 结构搭建

2.10.1 先决条件

  • 安装 OpenStack compute(Nova)和 identity(Keystone)Service
  • 安装 Python 2.6 或者 2.7,并必须支持 Django
  • 浏览器必须支持 HTML5 并启用 cookies 和 JavaScript 功能

2.10.2 代码构建

# 查看服务是否正常
nova service-list
# neutron 代理端情况
neutron agent-list

2.10.2.1 安装仪表盘组件
yum install -y openstack-dashboard httpd mod_wsgi memcached python-memcached

2.10.2.2 配置仪表盘
# Step1:编辑/etc/openstack-dashboard/local_settings 文件并完成下列配置
# a.配置 dashboard 使用 controller 节点上的OpenStack 服务
OPENSTACK_HOST = "contoller.nice.com"
# b.设置允许来自所有网络的主机访问dashboard
ALLOWED_HOSTS = ['*']
# c.配置memcached会话存储服务(将原有CACHES区域注释)
CHCHES = {
    'default': {
        'BACKEDN': 'django.core.cache.backends.memcached,MemcachedCache',
        'LOCATION': '127.0.0.1:11211'
    }
}
# d.(可选择)配置时区
TIME_ZONE = "TIME_ZONE"
# 地球人一般配置成:
TIME_ZONE = "Asia/Shanghai"

2.10.2.3 完成安装
# Step1:在RHEL或者CentOS上,配置SELinux去允许web服务器访问OpenStack服务(如果你每关SELinux)
setsebool -P httpd_can_network_connect on

# Step2:修改相关文件归属,使得dashboard CSS可以被加载
chown -R apache:apache /usr/share/openstack-dashboard/static

# Step3:启动 web 服务和会话保存服务,并设置开机自动启动
systemctl enable httpd.service memcached.service
systemctl start httpd.service memcached.service

2.10.2.4 验证
  1. 访问 dashboard,在浏览器输入 http://controller.nice.com/dashboard
  2. 使用 admin 或者 demo 用户登录

2.11 Cinder 块存储

2.11.1 组件说明

  • OpenStack 块存储服务为云主机提供块存储设备。支持不同的后端(操作系统类型)
  • The Block Storage API 和 Scheduler 服务运行在 controller 节点
  • The volume service 运行在一个或者多个存储节点
  • 存储节点可以通过本地磁盘,SAN / NAS 等后端设备为云主机提供卷存储
  • cinder-api:允许API请求,并路由它们到 cinder-volume
  • cinder-volume:直接与块存储服务交互。处理像 cinder-scheduler 这样的服务。通过消息队列相互通信。支持多种存储类型
  • cinder-scheduler daemon:选择最优的存储节点创建卷。类似于 novascheduler
  • Messagin queue:在块存储进程中传递消息(RabbitMQ)

2.11.2 代码构建

2.11.2 安装并配置 controller 节点

  • 配置先决条件
  • 安装并配置块存储控制组件
  • 完成安装

2.11.2.1 配置先决条件
# Step1:创建数据库,并完成下列步骤:
# a.使用 root 用户连接mysql数据库
mysql -uroot -pAdmin@h3c

# b.cinder 数据库
CREATE DATABASE cinder;

# c.创建数据库用户cinder ,并授予cinder 用户对cinder 数据库完全控制权限
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';

# d.退出数据库连接
exit

# Step2:执行 admin 环境变量脚本
source admin-openrc.sh

# Step3:在认证服务中创建块存储服务的认证信息,完成下列步骤
# a.创建cinder 用户
keystone user-create --name cinder --pass CINDER_DBPASS

# b.连接cinder 用户到 service租户和admin角色
keystone user-role-add --user cinder --tenant service --role admin

# c.创建cinder 服务
keystone service-create --name cinder --type volume --descripte "OpenStack Block Storage"
keystone service-create --name cinderv2 --type volumev2 --descripte "OpenStack Block Storage"

# d.创建块存储 服务端点
keystone endpoint-create \
--service-id ${keystone service-list | awk '/ volume / {print $2}'} \
--publicurl http://controller.nice.com:8776/v1/%\(tenant_id\)s \
--internalurl http://controller.nice.com:8776/v1/%\(tenant_id\)s \
--adminurl http://controller.nice.com:8776/v1/%\(tenant_id\)s \
--region regionOne

keystone endpoint-create \
--service-id ${keystone service-list | awk '/ volumev2 / {print $2}'} \
--publicurl http://controller.nice.com:8776/v2/%\(tenant_id\)s \
--internalurl http://controller.nice.com:8776/v2/%\(tenant_id\)s \
--adminurl http://controller.nice.com:8776/v2/%\(tenant_id\)s \
--region regionOne

2.11.2.2 安装并配置块存储控制组件
# Step1:安装软件包
yum install -y openstack-cinder python-cinderclient python-oslo-db

# Step2:编辑/etc/cinder/cinder.conf 文件并完成下列操作:
# a.编辑[database]小节,配置数据库连接
[database]
...
connection = mysql://cinder:CINDER_DBPASS@controller.nice.com/cinder

# b.编辑[DEFAULT]小节,配置RabbitMQ 消息代理访问:
[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# c.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = cinder
admin_password = CINDER_PASS

# d.(可选择)在[DEFAULT]小节中配置my_ip选项使用 controller 节点的控制端口IP
[DEFAULT]
...
my_ip = 10.0.0.21

# e.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

# Step3:初始化块存储服务数据库
su -s /bin/sh -c "cinder-manage db sync" cinder

2.11.2.3 完成安装
# 启动块存储服务并设置开机自动启动
systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service

2.11.3 安装并配置 block1 节点

  • 配置先决条件
  • 安装并配置块存储卷组件
  • 完成安装

2.11.3.1 配置先决条件
# Step1:添加一个新的硬盘(如:sdb),并分将全部空间分成一个主分区
# Step2:配置网卡信息
IP Address:10.0.0.23
Network Mask:255.255.255.0(or /24)
Default Gateway:10.0.0.2

# Step3:设置主机名为block1.nice.com,并添加对应的DNS记录。设置NTP服务
# Step4:安装 LVM 软件包(根据自身情况)
yum install -y lvm2

# Step5:启动LVM服务并在机器开机自动启动(根据自身情况)
systemctl enable lvm2-lvmetad.service
systemctl start lvm2-lvmetad.service

# Step6:创建物理卷/dev/sdb1
pvcreate /dev/sdb1

# Step7:创建卷组cinder-volumes(名字不要改)
vgcreate cinder-volumes /dev/sdb1

# Step8:编辑/etc/lvm/lvm.conf文件,使得系统只扫描启用LVM的磁盘,防止识别其他非LVM磁盘对块存储服务造成影响。
# 编辑devices小节,添加过滤器允许/dev/sdb磁盘,拒绝其他设备
devices {
...
filter = ["a/sdb","r/.*/"]
}
# 警告:如果你的系统磁盘使用了LVM,则必须添加系统盘到过滤器中
filter = ["a/sda","a/sdb","r/.*/"]
# 同样,如果computer节点的系统盘也使用了LVM,则也需要修改/etc/lvm/lvm.conf文件。并到过滤器中
filter = ["a/sda","r/.*/"]

2.11.3.2 安装并配置块存储卷组件
# Step1:安装软件包
yum install -y openstack-cinder targetcli python-oslo-db MySQL-python 
# Step2:编辑/etc/cinder/cinder.conf文件并完成下列操作:
# a.编辑[database]小节,配置数据库连接
[database]
...
connection = mysql://cinder:CINDER_DBPASS@controller.nice.com/cinder

# b.编辑[DEFAULT]小节,配置RabbitMQ 消息代理访问:
[DEFAULT]
...
rpc_backend = rabbit
rabbit_host = controller.nice.com
rabbit_password = RABBIT_PASS

# c.编辑[DEFAULT]和[keystone_authtoken]小节,配置认证服务
[DEFAULT]
...
auth_strategy = keystone

[keystone_authtoken]
...
auth_uri http://controller.nice.com:5000/v2.0
identity_uri = http://controller.nice.com:35357
admin_tenant_name = service
admin_user = cinder
admin_password = CINDER_PASS

# d.编辑在[DEFAULT]小节中配置my_ip选项
[DEFAULT]
...
my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS(10.0.0.23)

# e.编辑在[DEFAULT]小节中配置镜像服务器位置
[DEFAULT]
...
glance_host = controller.nice.com

# f.编辑在[DEFAULT]小节中配置块存储服务使用lioadm iSCSI服务
[DEFAULT]
...
iscsi_helper = lioadm

# g.(可选择)在[DEFAULT]小节,配置详细日志输出,方便排错
[DEFAULT]
...
verbose = True

2.11.3.3 完成安装
# 启动块存储volume服务和iSCSI服务并设置开机自动启动
systemctl enable openstack-cinder-volume.service target.service
systemctl start openstack-cinder-volume.service target.service

# 查看块存储情况
cinder list

2.12 实例创建

  • 创建密钥对
  • 启动一个实例
  • 通过虚拟控制台访问你的实例
  • 远程访问你的实例
  • 为实例添加额外的云硬盘

2.12.1 创建密钥对

大多数云镜像使用公钥认证,这有别于传统的用户名 / 密码认证。在启动一个实例之前,必须使用 ssh-keygen命令生成一个密钥对,并将公钥添加到OpenStack环境中。

# 在 Controller 节点运行
# Step1:执行 demo 环境变量脚本
source demo-openrc.sh

# Step2:生成密钥对
ssh-keygen

# Step3:添加公钥到 OpenStack 环境
nova keypair-add --pub-key ~/.ssh/id_rsa.pub demo.key

# Step4:验证公钥是否添加成功
nova keypair-list

2.12.2 启动一个实例

要启动一个实例,必须最少指定 flavor( 云主机类型 ),image name( 镜像名 ),network( 网络 ),security group( 安全组 ),key( 密钥 )和instance name( 实例名 )。

  1. flavor 用来指定一个虚拟的独立分配的资源。包括CPU,内存和存储。

查看可用的 flavor:

nova flavor-list
  1. 列出可用的镜像
nova image-list
  1. 列出可用的网络
neutron net-list
  1. 列出可用的安全组
nova secgroup-list
  1. 启动实例
nova boot --flavor m1.tiny --image cirros-0.3.3-x86_64 --inc net-id=DEMO_NET_ID --security-group default --key-name demo-key demo-instance1

# 例如:
nova boot --flavor m1.tiny --image cirros-0.3.3-x86_64 --inc net-id=d36f6eb0-e59a-42b9-9209-5547e022484b --security-group default --key-name demo-key demo-instance1

2.12.3 通过虚拟控制台访问你的实例

获取用于访问你的实例的 Virtual Network Computing(VNC) 会话URL,并通过浏览器访问

nova get-vnc-console demo-instance1 novnc 
# 确保你的客户端能够解析 controller 节点的FADN名

确认能够连接到 demo-net 租户网络的网关

ping -c 4 192.168.2.1

确认能够连接到 ext-net 外部网络

ping -c 10.0.0.1

2.12.4 远程访问你的实例

  1. 添加规则到名为 default 的安全组:
# a.允许ICMP协议(ping)
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0

# b.允许ssh协议
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
  1. 在 ext-net 外部网络创建一个浮动IP地址:
neutron floatingip-create ext-net
  1. 分配浮动IP地址到你的实例
nova floating-ip-associate demo-instance1 10.0.0.110
  1. 检查你的浮动IP地址状态
nova list
  1. 从任何一个可以和 ext-net 网络通信的主机测试联通性
ping -c 10.0.0.110
  1. 从任何一个可以和 ext-net 网络通信的主机上通过ssh访问实例
ssh cirros@10.0.0.110
# 或者私钥文件复制到外部客户端,通过密钥对验证登录
ssh -i id_rsa cirros@10.0.0.110

2.12.5 为实例添加额外的云硬盘

如果你的环境中包含块存储服务,则你可以为你的实例添加云硬盘。

  1. 执行 demo 环境变量脚本
# Step1:执行 demo 环境变量脚本
source demo-openrc.sh
  1. 列出卷
nova volume-list
  1. 附加 demo-instance1 卷到 demo-instance1 实例
nova volume-attach demo-instance1 <云盘的ID号>
  1. 列出卷
nova volume-list

3 构建实验:OpenStack-rocky 安装

Reference:

查看OpenStack版本列表

OpenStack Releases: OpenStack Releases

官方安装站点:

https://docs.openstack.org/install-guide/

参考地址:

https://blog.51cto.com/liuleis/2094190 (重点:安装OpenStack Queens)
https://blog.csdn.net/qq_38773184/article/details/82391073 (重点:安装OpenStack Rocky)