私有云Openstack Rocky版部署与使用测试

一、先说说云计算的前世今生

IT系统架构的发展到目前为止大致可以分为3个阶段:

  • 1、 物理机架构阶段:

    应用部署和运行在物理机上。 比如企业要上一个ERP系统,如果规模不大,可以找3台物理机,分别部署Web服务器、应用服务器和数据库服务器。 如果规模大一点,各种服务器可以采用集群架构,但每个集群成员也还是直接部署在物理机上。 早期都是这种架构,一套应用一套服务器,通常系统的资源使用率都很低,达到20%的都是好的。

  • 2、虚拟化架构阶段:

    决定了物理服务器的计算能力越来越强,虚拟化技术的发展大大提高了物理服务器的资源使用率。 这个阶段,物理机上运行若干虚拟机,应用系统直接部署到虚拟机上。 虚拟化的好处还体现在减少了需要管理的物理机数量,同时节省了维护成本。

  • 3、云计算架构阶段:

    虚拟化提高了单台物理机的资源使用率,随着虚拟化技术的应用,IT环境中有越来越多的虚拟机,这时新的需求产生了,"如何对IT环境中的虚拟机进行统一和高效的管理"。有需求就有供给,云计算登上了历史舞台。

什么是云计算?

云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 通过互联网进入可配置的计算资源共享池(资源包括网络,计算,存储,应用软件,服务)

云计算的服务类型

二、OpenStack介绍

1. 项目起源

  • OpenStack是一个开源的 IaaS 云计算平台,是一系列软件开源项目的组合。由NASA(美国国家航空航天局)和Rackspace(一家美国的云计算厂商)合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证)授权的开源代码项目。
  • 2010年 Openstack项目成立,虽然诞生时间不长,但其发展之迅速,在云计算领域的影响力扩展迅速成为业内所有人都不得不关注的焦点。
  • OpenStack覆盖了网络、虚拟化、操作系统、服务器等各个方面。它是一个正在开发中的云计算平台项目,根据成熟及重要程度的不同,被分解成核心项目、孵化项目,以及支持项目和相关项目。每个项目都有自己的委员会和项目技术主管,而且每个项目都不是一成不变的,孵化项目可以根据发展的成熟度和重要性,转变为核心项目。

2. 选择OpenStack的原因

  • OpenStack 提供了一个非常好的有关如何来打造类似于主要公有云比如亚马逊( AWS )和 Google Cloud Platform ( GCP )的弹性私有云的样板。OpenStack 将 AWS/GCP 式样的的基础架构即服务( IaaS )推向了每个用户。它就是能实现企业内部 DevOps 的终极平台。

  • OpenStack 能在企业内部提供类似的平台。私有云可以基于公有云模型来构造,使得开发者同时拥有集中式 IT 控制和支配。本质上,它是两者融合的最佳平台,这也是 OpenStack 驱动的私有云的真正价值。

  • 社区活跃,学习资料较多,有问题很容易能找到帮助。

  • 使用python开发,遵循apache 2.0开源协议,只需修改一个Logo,都能拿来商业化。

  • 架构非常的灵活,可扩展性强。

3. OpenStack和其他虚拟化技术的区别?

OpenStack云管理平台框架,有很多功能组件,比如说包含计算虚拟化、存储虚拟化、网络虚拟化、Image管理、身份认证管理、计费管理、前端展示模块等等。

KVM、XenServer、VMware只是计算虚拟化模块调用的后台实现技术而已。

4. OpenStack主要的组件服务

项目名称 核心服务 描述
仪表盘 Horizon 提供了一个基于web的操作界面门户,通过web界面与OpenStack底层服务交互,就可以实现 建云主机,分配网络,配安全组,加云盘等功能。
计算服务 Nova 是OpenStack云计算架构控制器,管理 OpenStack 云里的计算资源、网络、授权、和扩展需求。是OpenStack中最核心的服务。
对象存储服务=========== Swift 为OpenStack提供分布式的、最终一致的虚拟对象存储服务;适用于一次写入,多次使用。例如百度网盘, 这个服务不是必须的,是可选服务。Swift 有能力存储数十亿计的对象, Swift 具有内置冗余、容错管理、存档、流媒体的功能。并且高度扩展,不论大小(多个 PB 级别)和能力(对象的数量)。
镜像服务 Glance 存储和检索虚拟机磁盘镜像系统,OpenStack计算会在实例部署时使用此服务。管理镜像模板的仓库,为虚机提供镜像模板。
网络服务 Neutron 确保为其它OpenStack服务提供网络服务,为虚拟机提供网络连接服务,就像物理的交换机和路由器。
块存储服务 Cinder 为OpenStack运行实例而提供的持久性块存储服务。它的可插拔驱动架构的功能有助于创建和管理块存储设备。为虚拟机提供额外的硬盘。
认证服务 Keystone 为OpenStack各服务组件提供认证和授权服务,为所有的OpenStack服务提供一个端点目录。
监控计费服务 Ceilometer 为OpenStack的监控计费服务、基准、扩展性以及统计等目的提供监测和计量。为公有云准备的,私有云不需要。属于高级服务。
编排服务 Heat 为OpenStack编排服务,基于模板自动化部署服务,属于高级服务。类似于ansible的playbook剧本。
数据库服务 Trove 为用户在OpenStack的环境提供可扩展和可靠的关系和非关系数据库引擎服务。
项目名称 共享服务
数据库服务 MariaDB ; MongoDB
消息传输 RabbitMQ
缓存 Memcached ; NTP
存储 CEPH、GFS、LVM、ISICI
高可用和负载均衡 Haproxy、Keepalive、LVS

Ceph是当前非常流行的开源分布式存储系统,具有高扩展性、高性能、高可靠性等优点,同时提供块存储服务(rbd)、对象存储服务(rgw)以及文件系统存储服务(cephfs)。目前也是OpenStack的主流后端存储,和OpenStack亲如兄弟,为OpenStack提供统一共享存储服务。使用Ceph作为OpenStack后端存储。
https://baijiahao.baidu.com/s?id=1647154167041527591&wfr=spider&for=pc

5. OpenStack的版本

OpenStack是按照A B C D E F G ...的顺序发布版本的,截止到目前19年12月份最新的发行版是 Train

6. 企业级OpenStack需要些什么呢?

企业级OpenStack的要求 参考资料

  • 99.999%的API可用性以及可扩展的控制平面

    有高可靠性要求的应用需要高可靠的云API向全新的云和 DevOps 模型转型的一个关键能力是提供云原生应用在弹性云中的容错能力。要使一个应用能实时地适应不同组件的出错,云 API 需要有更高的可用性。

  • 健壮的管理和安全模型

    安装只是管理 OpenStack 的开端。一个真正的云操作系统将提供一个从设计上就能保证基础设施团队能成功交付服务的以运维为核心的云管理工具套件。

    • 可重用的架构模型,通常使用参考网络架构将小集群或者组连接在在一起
    • 初始云安装和部署
    • 典型的日常云运维工具,包括日志、系统测量值和相关度分析
    • 供运维人员使用的用来做整合和自动化的 CLI(命令行界面)和 API(应用程序编程接口)
    • 用于可视化和分析的运维图形界面
  • 开放的架构

    OpenStack 的开放架构,能够减少厂商锁定,进而降低风险。

  • 混合云兼容性

    • 目前环境下,混合云兼具私有云安全性与公有云的弹性扩展能力,混合云必然成为企业云部署的第一选择。根据应用类别和业务特点,将关键应用、性能敏感型、中高密级应用部署在私有云,其他应用部署在公有云;将同一个应用的不同层部署在不同云中,时延敏感业务就近用户部署,提升最终用户体验。

    • 混合云的难点在于解决应用的移植性问题。如果你需要一个公有云和私有云组合而成的混合云,不管应用在某个云中被开发,还是要在两个云之间做迁移,或者从一个云到另一个云,应用的可移植性都是必须的。当你选定一个应用以及它的云原生的自动化框架,并将它们从一个云移动到另一个云中,一些关键的东西必须保持一致:

      • 性能相对平稳

      • 底层的存储、网络和计算架构保持一致或者近似

      • 应用的自动化框架必须和两个云中的 API 都兼容

      • 每个云中,运行应用的总所有成本( TCO)都应该在1/2-2倍的范围之内

      • 还有行为上的兼容性,意味着非 API 功能也需要吻合

      • 支持与相关公有云 API 的兼容

  • 可扩展的弹性架构

    • 当在系统中增加资源后,其性能会按照所增加资源的某种比例增加时,我们就可以说其服务是可扩展的。

    • 从多方面看, OpenStack 自身就是个高扩展性的系统。它被设计为松耦合、基于消息通信的架构,这些技术已经在各种中级到高级扩展的系统中得到应用和验证,它们也可以适应小规模的部署。问题在于配置和部署OpenStack时所做的设计上的决定。

    • 一部分默认的配置,以及许多厂商的插件和方案在设计时并没有考虑扩展性。

    • 基础架构从来没有真正的弹性过,可是它的特性能支持弹性的应用在它上面运行。一个弹性云,需要被设计为每个资源,比如虚机、块存储和对象存储,其成本尽可能的低。

  • 全面的支持和服务

    OpenStack 作为一个可扩展的、打造下一代弹性云的基础架构,尽管它还不是很完美。但作为一个开源项目,它的吸引力确实不容小视。基于平台开放,会有越来越多的力量促使它更完善和强大,采用 OpenStack 意味着企业云平台会更加自主可控,并实现技术沉淀和自动化运维水平的提升。

7. OpenStack社区与文档的链接

社区: www.openstack.org ; wiki.openstack.org
邮件列表: http://wiki.openstack.org/MailingLists#General_List
贡献代码: http://wiki.openstack.org/HowToContribute
源代码管理: http://wiki.openstack.org/GerritWorkflow
文档: http://docs.openstack.org


二、OpenStack的部署

1. 环境准备

准备两台优化好的虚拟机

CPU 支持 intel64 或 AMD64 CPU扩展,并启用AMD-H或intel VT硬件虚拟化支持的64位x86处理器
系统版本 CentOS7.6 版本
内存 根据实际测试环境选择 >=2G
硬盘容量 根据实际测试环境选择 >=50G
防火墙 需要关闭
SELINUX 需要关闭
YUM源 阿里云的Yum源

虚拟机分配情况

主机 IP地址 主机名 注意事项
控制节点 NAT网络 192.168.1.10 controller 至少4G,要开虚拟化
计算节点 NAT网络 192.168.1.20 computel 至少2G,要开虚拟化

配置域名解析

[root@computel ~]# cat /etc/hosts
192.168.1.10 controller 
192.168.1.20 compute1

测试各节点连通性

ping -c 4 controller
ping -c 4 compute1

插件密码参考(测试)

密码名称 描述
123456 数据库的根密码
123456 admin 用户密码
123456 块设备存储服务的数据库密码
123456 块设备存储服务的 cinder 密码
123456 demo 用户的密码
123456 镜像服务的数据库密码
123456 镜像服务的 glance 用户密码
123456 认证服务的数据库密码
123456 网络服务的数据库密码
123456 网络服务的 neutron 用户密码
123456 计算服务的数据库密码
123456 计算服务中 nova 用户的密码
123456 RabbitMQ的guest用户密码

2. 部署OpenStack R版

2.1 安装 NTP 时间同步服务

  • 在controller控制节点安装配置chrony

    Chrony是一个开源的自由软件,像CentOS 7或基于RHEL 7操作系统,已经是默认服务,默认配置文件在 /etc/chrony.conf 它能保持系统时间与时间服务器(NTP)同步,让时间始终保持同步。相对于NTP时间同步软件,占据很大优势。其用法也很简单

yum install chrony -y

vim /etc/chrony.conf
server ntp1.aliyun.com iburst   //向外网同步时间
allow 192.168.1.0/24        //设置时间同步网段

systemctl restart chronyd.service
systemctl enable chronyd.service 
  • 在compute计算节点安装配置chrony
yum install chrony -y

vim /etc/chrony.conf    
server 192.168.1.10 iburst  //所有计算节点向controller节点同步时间

systemctl restart chronyd.service
systemctl enable chronyd.service 
  • 进行时间同步服务验证
[root@computel ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
=========================================================================
^* controller            3   6    17     6  -4061ns[ +163us] +/-   34ms

在安装过程中可以发现,OpenStack项目全程都是用Python开发的。

2.2 启用 OpenStack 存储库

在CentOS上,extras资源库提供 rpm包,以启用OpenStack资源库。CentOS extras默认包含该存储库,因此只需安装该软件包即可启用OpenStack存储库。

  • 所有节点安装最新版openstack-rocky ,安装其他版本修改后缀名即可
yum install centos-release-openstack-rocky -y

#安装后可以使用命令直接修改配置文件内容
yum install openstack-utils -y
  • 所有节点修改yum源到国内清华源
cd /etc/yum.repos.d/
#修改openstack-rocky的源
vim CentOS-OpenStack-rocky.repo
[centos-openstack-rocky]
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7.7.1908/cloud/x86_64/openstack-rocky/
#修改ceph源
vim CentOS-Ceph-Luminous.repo
[centos-ceph-luminous]
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/7.7.1908/storage/x86_64/ceph-luminous/
  • 所有节点**安装OpenStack客户端
yum install python-openstackclient -y

2.3 安装 SQL数据库-controller

只在控制节点上运行!根据实际要求使用MariaDB或MySQL;也支持其他数据库。

  • 安装数据库软件包
yum install mariadb mariadb-server python2-PyMySQL -y
  • 创建和编辑/etc/my.cnf.d/openstack.cnf文件
#创建一个[mysqld]部分,并将bind-address 密钥设置为控制器节点的管理IP地址,以允许其他节点通过管理网络进行访问。设置其他键以启用有用的选项和UTF-8字符集:
-----------------------------------------------------
[root@controller ~]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 192.168.1.10     #监听地址
default-storage-engine = innodb #默认存储引擎
innodb_file_per_table = on      #独立表空间文件
max_connections = 4096          #最大连接数
collation-server = utf8_general_ci  #默认字符集为UTF8
character-set-server = utf8
  • 启动数据库,并设置开机自启
systemctl restart mariadb.service
systemctl enable mariadb.service
  • 运行mysql_secure_installation安全初始化。为数据库root帐户选择合适的密码
[root@controller ~]# mysql_secure_installation
Enter current password for root (enter for none): <回车>
Set root password? [Y/n]    <n>         #设数据库密码
Remove anonymous users? [Y/n]   <y>     #移除匿名用户
Disallow root login remotely? [Y/n]  <y> #禁止root用户远程登录
Remove test database and access to it? [Y/n]  <y> #移除test数据库和访问权限
Reload privilege tables now? [Y/n]  <y>  #重新加载权限表

2.4 安装消息队列服务-controller

消息队列服务通常在控制器节点上运行;OpenStack支持多种消息队列服务,包括RabbitM, Qpid和ZeroMQ

  • 安装软件包
yum install rabbitmq-server -y
  • 启动消息队列,并设置开机自启
systemctl restart rabbitmq-server.service
systemctl enable rabbitmq-server.service
  • 添加OpenStack用户
rabbitmqctl add_user openstack 123456
  • 授权用户的配置写入和读取权限
#三个 ".*" 表示可读可写可配置
rabbitmqctl set_permissions openstack ".*" ".*" ".*"    
  • 扩展:启用 rabbitmq的管理插件,为了方便日后做监控
#启动后的端口是 15672
systemctl enable rabbitmq-server.service
systemctl restart rabbitmq-server.service
rabbitmq-plugins enable rabbitmq_management 

#插件启动以后会监控两个端口(5672、25672)
[root@controller ~]# netstat -lntup|egrep '5672|25672'
tcp        0      0 0.0.0.0:25672      0.0.0.0:*        LISTEN      56252/beam.smp 
tcp6       0      0 :::5672            :::*             LISTEN      56252/beam.smp
tcp        0      0 0.0.0.0:15672      0.0.0.0:*        LISTEN      56252/beam.smp
  • 浏览器访问

2.5 安装Memcached缓存-controller

memcached服务通常在控制器节点上运行。对于生产部署,建议启用防火墙,身份验证和加密的组合以保护其安全。

  • 安装软件包
yum install memcached python-memcached -y
  • 修改/etc/sysconfig/memcached文件为控制节点IP,也可改为 0.0.0.0
sed -i 's#127.0.0.1#0.0.0.0#g' /etc/sysconfig/memcached

#配置服务以使用控制器节点的管理IP地址。这是为了允许其他节点通过管理网络进行访问
OPTIONS="-l 0.0.0.0,::1"
  • 启动服务,并设置开机自启
systemctl restart memcached.service
systemctl enable memcached.service

2.6 安装 etcd 分布式存储-controller

在控制器节点上运行。etcd是一个分布式,一致的键值存储,用于共享配置和服务发现,特点是,安全,具有可选客户 端证书身份验证的自动TLS;快速,基准测试10,000次/秒;可靠,使用Raft正确分发。

  • 安装软件包
yum install etcd -y
  • 编辑/etc/etcd/etcd.conf文件
[root@controller ~]# vi /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.10:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.10:2379"
ETCD_NAME="controller"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.10:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.10:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.1.10:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"
  • 启动服务,并设置开机自启
systemctl restart etcd.service
systemctl enable etcd.service 

3. 安装 keystone 认证服务-控制节点

Keystone的详解01

Keystone的详解02

官方R版 Keystone安装文档

keystone是OpenStack的身份服务,暂且可以理解为一个与权限有关'的组件。

Keystone项目的主要目的是为访问openstack的各个组件(nova,cinder,glance...)提供一个统一的验证方式,具体的:

openstack是由众多组件构成的一套系统,该系统的功能是对外提供服务,因而我们可以将其定义为一个庞大的软件,没有软件不考虑安全因素,Keystone对于通常的应用场景所不同的是他要解决分布式环境下的统一认证。

  • 功能:认证管理,授权管理,服务目录

  • 身份验证服务包括以下组件:服务器、驱动、模块

当安装OpenStack自身服务时,用户必须将之注册到其OpenStack安装环境的每个服务。身份服务才可以追踪到哪些OpenStack服务已经安装,以及在网络中定位它们。

  • 创建keystone数据库

每个组件都有自己的数据库,能抗的压力更大

mysql -uroot -p
create database keystone;
  • 对keystone数据库授权
grant all privileges on keystone.* to 'keystone'@'localhost' identified by '123456';
grant all privileges on keystone.* to 'keystone'@'%' identified by '123456';
flush privileges;

安装和配置的部件

  • 安装keystone相关的软件包
yum install openstack-keystone httpd mod_wsgi -y

#wsgi:python项目, 类似于php的fastcgi
#相关资料链接 https://www.cnblogs.com/xiaoyuanqujing/articles/11838819.html
  • 编辑/etc/keystine/keystone.conf文件
  • 注意:controller在此示例中,主机必须是可解析的。
#备份原配置文件,过滤出模块名覆盖到配置文件中
cp /etc/keystone/keystone.conf{,.bak}
egrep -v '^$|^#' /etc/keystone/keystone.conf.bak >/etc/keystone/keystone.conf

[root@controller ~]# vim /etc/keystone/keystone.conf
[database]
connection = mysql+pymysql://keystone:123456@controller/keystone    #配置数据库访问
[token]
provider = fernet   #配置Fernet令牌提供者
  • 填充身份服务数据库
su -s /bin/sh -c "keystone-manage db_sync" keystone
#查看表
mysql keystone -p123456 -e 'show tables'
  • 初始化Fernet密钥存储库
#命令行直接复制执行
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
keystone-manage bootstrap --bootstrap-password 123456 \
--bootstrap-admin-url http://controller:5000/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id RegionOne

配置Apache HTTP服务器

  • 编辑 /etc/httpd/conf/httpd.conf 文件
[root@controller ~]# vim /etc/httpd/conf/httpd.conf
ServerName controller   #修改主机名
  • 创建/usr/share/keystone/wsgi-keystone.conf文件的软链接
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
  • 启动Apache HTTP服务,并设置开机自启动
systemctl restart httpd.service
systemctl enable httpd.service

[root@controller ~]# netstat -lntup|grep httpd
tcp6       0   0 :::5000      :::*           LISTEN      17417/httpd         
tcp6       0   0 :::80        :::*           LISTEN      17417/httpd         
  • 设置环境变量
[root@controller ~]# vim admin-openrc
export OS_USERNAME=admin
export OS_PASSWORD=123456
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
#使变量脚本生效
[root@controller ~]# source ~/admin-openrc
[root@controller ~]# env|grep OS
  • 创建域、项目用户和角色
#创建域
openstack domain create --description "An Example Domain" example
#创建项目
openstack project create --domain default --description "Service Project" service
#创建平台demo项目
openstack project create --domain default --description "Demo Project" demo
#创建demo用户
openstack user create --domain default --password 123456 demo
#创建user角色
openstack role create user
#将user角色添加到myproject项目和demo用户
openstack role add --project demo --user demo user  //该步骤没有返回值
  • 验证keystone
#取消环境变量
unset OS_AUTH_URL OS_PASSWORD
#admin用户返回的认证token
openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name admin --os-username admin token issue

#demo用户返回的认证token
openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name demo --os-username demo token issue
  • 创建变量环境脚本并认证
#再创建一个demo-openrc脚本
[root@controller ~]# vim demo-openrc
export OS_PROJECT_DOMAIN_NAME=Default 
export OS_USER_DOMAIN_NAME=Default 
export OS_PROJECT_NAME=demo 
export OS_USERNAME=demo 
export OS_PASSWORD=123456 
export OS_AUTH_URL=http://controller:5000/v3 
export OS_IDENTITY_API_VERSION=3 
export OS_IMAGE_API_VERSION=2

#使用脚本验证返回值,查看admin用户的token信息
source ~/admin-openrc //使环境变量生效
source ~/demo-openrc
#认证
openstack token issue

4. 安装 Glance 镜像服务-控制节点

官方R版 glance安装文档

OpenStack镜像服务对于基础架构即服务(IaaS)至关重要。它接受来自磁盘或服务器镜像的API请求,以及来自最终用户或OpenStack Compute组件的元数据定义。它还支持在各种存储库类型(包括OpenStack对象存储)上存储磁盘或服务器映像。

OpenStack Image服务上运行许多定期进程以支持缓存。复制服务可确保整个群集的一致性和可用性。其他定期过程包括审核员,更新者和收获者。

OpenStack镜像服务包括以下组件:

  • glance-api

    接受用于图像发现,检索和存储的Image API调用。

  • glance-registry(浏览注册表)

    存储,处理和检索有关图像的元数据。元数据包括大小和类型等项目。 警告注册表是供OpenStack Image服务使用的私有内部服务。不要将此服务提供给用户。

  • Database(数据库)

    存储图像元数据,您可以根据自己的喜好选择数据库。大多数部署使用MySQL或SQLite。

  • Storage repository for image files(图像文件的存储库)

    支持各种存储库类型,包括普通文件系统,对象存储,RADOS块设备,HTTP和Amazon S3。请注意,某些存储库将仅支持只读用法。

  • Metadata definition service(元数据定义服务)

    供应商,管理员,服务和用户的通用API,可以有意义地定义他们自己的自定义元数据。该元数据可用于不同类型的资源,例如图像,伪像,体积,风味和聚合。定义包括新属性的键,描述,约束以及可以与之关联的资源类型。

Glance支持多种镜像的格式, 下面列出了目前已经支持的镜像格式

raw – 非结构化的镜像格式。
vhd – 一种通用的虚拟机磁盘格式, 可用于Vmware、Xen、Microsoft Virtual PC/Virtual Server/Hyper-V、VirtualBox等。
vmdk – Vmware的虚拟机磁盘格式, 同样也支持多种Hypervisor。
vdi – VirtualBox、QEMU等支持的虚拟机磁盘格式。
iso – 光盘存档格式。
qcow2 – 一种支持QEMU并且可以动态扩展的磁盘格式。
aki – Amazon Kernel 镜像。
ari – Amazon Ramdisk 镜像。
ami – Amazon 虚拟机镜像。

镜像存储位置分析

#镜像存储在Glance上
具体位置在Glance节点的/var/lib/glance/images/下。
可通过SELECT * FROM glance.image_locations where image_id=‘image-id’查看其存储位置。

#镜像存储在后端存储上
对接块存储:可以对接Cinder使用其提供的块存储服务。
对接swift或者ceph使用其提供的对象存储服务。

#对接后端存储
需要安装对应存储的客户端程序。
在glance-api.conf文件中进行对接的存储配置。

4.1 安装与配置

  • 添加数据库

    在安装和配置Image服务之前,必须创建数据库,服务凭证和API端点。

    #使用数据库访问客户端以root用户身份连接到数据库服务器
    mysql -u root -p
    
    #创建glance数据库
    create database glance;
    
    #授予对glance数据库的适当访问权限
    grant all privileges on glance.* to 'glance'@'localhost' identified by '123456';
    grant all privileges on glance.* to 'glance'@'%' identified by '123456';
    flush privileges;
    
  • 获取admin用户的环境变量

source ~/admin-openrc
  • 创建glance用户
openstack user create --domain default --password-prompt glance
  • 将管理员admin用户添加到glance用户和项目中
openstack role add --project service --user glance admin
\\该命令不提供任何输出
  • 创建glance服务
openstack service create --name glance --description "OpenStack Image" image
  • 创建镜像服务API端点

OpenStack使用三种API端点变种代表每种服务:admin、internal、public。

openstack endpoint create --region RegionOne image public http://controller:9292
openstack endpoint create --region RegionOne image internal http://controller:9292
openstack endpoint create --region RegionOne image admin http://controller:9292
  • 安装glance包
yum install openstack-glance -y
  • 创建images文件夹,并修改属性
#一定要赋予openstack-glance-api.service服务对存储设备的可写权限
mkdir /var/lib/glance/images 
chown -hR glance:glance /var/lib/glance/
  • 编辑文件 /etc/glance/glance-api.conf
cp /etc/glance/glance-api.conf{,.bak}
egrep -v '^$|^#' /etc/glance/glance-api.conf.bak >/etc/glance/glance-api.conf

[root@controller ~]# vim /etc/glance/glance-api.conf
[database]   #数据库访问
connection = mysql+pymysql://glance:123456@controller/glance

[keystone_authtoken]    #认证服务访问
www_authenticate_uri  = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = 123456   #glance用户的密码

[paste_deploy]   #认证服务访问
flavor = keystone

[glance_store]  #本地文件系统存储和镜像文件位置
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images
  • 编辑镜像服务的另一个组件文件 /etc/glance/glance-registry.conf
cp /etc/glance/glance-registry.conf{,.bak}
egrep -v '^$|^#' /etc/glance/glance-registry.conf.bak >/etc/glance/glance-registry.conf

[root@controller ~]# vim /etc/glance/glance-registry.conf
[database]
connection = mysql+pymysql://glance:123456@controller/glance

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = 123456

[paste_deploy]
flavor = keystone
  • 同步写入镜像数据库
su -s /bin/sh -c "glance-manage db_sync" glance
  • 启动服务
systemctl enable openstack-glance-api.service  openstack-glance-registry.service
systemctl start openstack-glance-api.service   openstack-glance-registry.service

4.2 对镜像服务进行验证

官方R版 glance验证操作文档

  • 获取admin用户的环境变量来获取只有管理员能执行的命令的访问权限,并下载镜像
source ~/admin-openrc
wget http://download.cirros-cloud.net/0.3.6/cirros-0.3.6-x86_64-disk.img
#下载一个小型linux镜像进行测试
  • 上传镜像

使用QCOW2磁盘格式,裸容器格式和公开可见性将图像上传到Image服务,以便所有项目都可以访问它

openstack image create "cirros" --file ~/cirros-0.3.6-x86_64-disk.img --disk-format qcow2 --container-format bare --public
  • 查看上传的镜像
openstack image list
#删除镜像的命令
openstack image delete <ID>

5. 安装 Nova 计算服务-控制节点

官方R版 Nova控制节点安装文档

使用OpenStack计算服务来托管和管理云计算系统。OpenStack计算服务是基础设施即服务(IaaS)系统的主要部分,模块主要由Python实现。

OpenStack计算组件请求OpenStack Identity服务进行认证;请求OpenStack Image服务提供磁盘镜像;为OpenStack dashboard提供用户与管理员接口。磁盘镜像访问限制在项目与用户上;配额以每个项目进行设定(例如,每个项目下可以创建多少实例)。OpenStack组件可以在标准硬件上水平大规模扩展,并且下载磁盘镜像启动虚拟机实例。

OpenStack计算服务由下列组件所构成:

  • nova-api服务

    接收和响应来自最终用户的计算API请求。此服务支持OpenStack计算服务API,Amazon EC2 API,以及特殊的管理API用于赋予用户做一些管理的操作。它会强制实施一些规则,发起多数的编排活动,例如运行一个实例。

  • nova-api-metadata服务

    接受来自虚拟机发送的元数据请求。

  • nova-compute服务

    一个持续工作的守护进程,通过Hypervior的API来创建和销毁虚拟机实例。

  • nova-scheduler服务

    拿到一个来自队列请求虚拟机实例,然后决定那台计算服务器主机来运行它。

  • nova-conductor模块

    媒介作用于nova-compute服务与数据库之间。它排除了由nova-compute服务对云数据库的直接访问。nova-conductor模块可以水平扩展。但是,不要将它部署在运行nova-compute服务的主机节点上

  • nova-cert模块

    服务器守护进程向Nova Cert服务提供X509证书。用来为euca-bundle-image生成证书。

  • nova-network worker 守护进程

    nova-compute服务类似,从队列中接受网络任务,并且操作网络。执行任务例如创建桥接的接口或者改变IPtables的规则。

  • nova-consoleauth 守护进程

    授权控制台代理所提供的用户令牌。

  • nova-novncproxy 守护进程

    提供一个代理,用于访问正在运行的实例,通过VNC协议,支持基于浏览器的novnc客户端。

  • nova-spicehtml5proxy 守护进程

    提供一个代理,用于访问正在运行的实例,通过 SPICE 协议,支持基于浏览器的 HTML5 客户端。

  • nova-xvpvncproxy 守护进程

    提供一个代理,用于访问正在运行的实例,通过VNC协议,支持OpenStack特定的Java客户端。

  • nova-cert 守护进程

    X509 证书。

  • nova客户端

    用于用户作为租户管理员或最终用户来提交命令。

  • 队列

    一个在守护进程间传递消息的中央集线器。

  • SQL数据库

    存储构建时和运行时的状态,为云基础设施。理论上,OpenStack计算可以支持任何和SQL-Alchemy所支持的后端数据库,通常使用SQLite3来做测试可开发工作,MySQL和PostgreSQL 作生产环境。

5.1 配置MySQL数据库及授权

  • 创建数据库
mysql -u root -p

#创建nova_api,nova,nova_cell0和placement数据库
create database nova_api;
create database nova;
create database nova_cell0;
create database placement;

#对数据库进行正确的授权
grant all privileges on nova_api.* to 'nova'@'localhost' identified by '123456';
grant all privileges on nova_api.* to 'nova'@'%' identified by '123456';

grant all privileges on nova.* to 'nova'@'localhost' identified by '123456';
grant all privileges on nova.* to 'nova'@'%' identified by '123456';

grant all privileges on nova_cell0.* to 'nova'@'localhost' identified by '123456';
grant all privileges on nova_cell0.* to 'nova'@'%' identified by '123456';

grant all privileges on placement.* to 'placement'@'localhost' identified by '123456';
grant all privileges on placement.* to 'placement'@'%' identified by '123456';

flush privileges;

5.2 创建nova用户

source ~/admin-openrc   #加载admin环境变量
openstack user create --domain default --password 123456 nova
  • nova 用户添加 admin角色
openstack role add --project service --user nova admin
  • 创建 nova 服务实体:
openstack service create --name nova --description "OpenStack Compute" compute
  • 创建 Compute 服务 API 端点
openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1

5.3 创建placement用户

例如,一个资源提供者可以是一个计算节点,共享存储池,或一个IP分配池。placement服务跟踪每个供应商的库存和使用情况。例如,在一个计算节点创建一个实例的可消费资源如计算节点的资源提供者的CPU和内存,磁盘从外部共享存储池资源提供商和IP地址从外部IP资源提供者。

  • 创建一个placement服务用户
openstack user create --domain default --password 123456 placement
  • 使用管理员角色将Placement用户添加到服务项目中
openstack role add --project service --user placement admin
  • 在服务目录创建Placement API服务
openstack service create --name placement --description "Placement API" placement
  • 创建Placement API服务端点
openstack endpoint create --region RegionOne placement public http://controller:8778 
openstack endpoint create --region RegionOne placement internal http://controller:8778 
openstack endpoint create --region RegionOne placement admin  http://controller:8778

5.4 安装软件并配置 Nova

  • 安装软件包
yum install openstack-nova-api openstack-nova-conductor openstack-nova-console \
openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api -y
  • 修改nova.conf配置文件
cp /etc/nova/nova.conf{,.bak}
egrep -v '^$|^#' /etc/nova/nova.conf.bak >/etc/nova/nova.conf

[root@controller ~]# vim /etc/nova/nova.conf
[DEFAULT]
enabled_apis=osapi_compute,metadata #只启用计算和元数据API
transport_url = rabbit://openstack:123456@controller    #配置RabbitMQ消息队列访问
my_ip=192.168.1.10  #控制节点的IP地址
use_neutron = true  #能够使用Networking服务
firewall_driver = nova.virt.firewall.NoopFirewallDriver #能够使用Networking服务

[api]
auth_strategy = keystone

[api_database]
connection = mysql+pymysql://nova:123456@controller/nova_api    #配置数据库的连接

[database]
connection = mysql+pymysql://nova:123456@controller/nova    #配置数据库的连接

[keystone_authtoken]    #配置认证服务访问
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456   #nova用户的密码

[glance]    #配置镜像服务API的位置
api_servers = http://controller:9292

[oslo_concurrency]  #配置锁路径
lock_path = /var/lib/nova/tmp

[placement] #配置对Placement API的访问
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = 123456

[placement_database]
connection = mysql+pymysql://placement:123456@controller/placement

[vnc]   #配置VNC代理 使用控制节点的IP地址
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip

5.5 启用placement API访问

由于软件包错误,必须通过将以下配置添加到来启用对 Placement API 的访问

[root@controller ~]# vim /etc/httpd/conf.d/00-nova-placement-api.conf
...
 15   #SSLCertificateKeyFile ...
<Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
</Directory>
 ...
---------------------------------------------------------------------------
#重启httpd
systemctl restart httpd.service

5.6 同步数据库的设置

  • 同步nova-api 数据库
su -s /bin/sh -c "nova-manage api_db sync" nova
  • 注册cell0数据库
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
  • 创建cell1 单元格
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
#2ce1c654-9c08-4313-99be-99e9db53f9c9
  • 同步nova数据库
su -s /bin/sh -c "nova-manage db sync" nova
  • 验证数据库是否注册正确
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
  • 启动nova服务并设置为开机自启
systemctl enable openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service \
openstack-nova-conductor.service openstack-nova-novncproxy.service

systemctl start openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service \
openstack-nova-conductor.service openstack-nova-novncproxy.service

6. 安装 Nova 计算服务-计算节点

官方R版 Nova计算节点安装文档

[root@computel ~]# cat /etc/hosts
192.168.1.10 controller 
192.168.1.20 compute1

#关闭yum源检查
sed -i 's#gpgcheck=1#gpgcheck=0#g' /etc/yum.repos.d/*.repo
  • 安装软件包
yum install python-openstackclient -y   #测试环境时已安装
yum install openstack-nova-compute -y
  • 编辑配置文件 /etc/nova/nova.conf
cp /etc/nova/nova.conf{,.bak}
egrep -v '^$|^#' /etc/nova/nova.conf.bak >/etc/nova/nova.conf

[root@computel ~]# vim /etc/nova/nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:123456@controller
my_ip = 192.168.1.20
use_neutron = true
firewall_driver = nova.virt.firewall.NoopFirewallDriver

[api]
auth_strategy = keystone

[keystone_authtoken]
auth_url = http://controller:5000/v3
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456

[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://192.168.1.10:6080/vnc_auto.html
# 这里的vnc网址 http://controller:6080/vnc_auto.html 需改为 http://192.168.1.10:6080/vnc_auto.html

[glance]
api_servers = http://controller:9292

[oslo_concurrency]
lock_path = /var/lib/nova/tmp

[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:5000/v3
username = placement
password = 123456
  • 确定计算节点是否支持虚拟机的硬件加速
egrep -c '(vmx|svm)' /proc/cpuinfo
2
#如果这个命令返回了one or greater的值,那么你的计算节点支持硬件加速且不需要这步的额外的配置
#如果这个命令返回了zero值,那么你的计算节点不支持硬件加速。你必须配置libvirt来使用QEMU去代替KVM
vim /etc/nova/nova.conf
[libvirt]
virt_type = qemu
  • 启动服务并添加为开机自启动
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl restart libvirtd.service openstack-nova-compute.service
systemctl status libvirtd.service openstack-nova-compute.service

7. 添加 计算节点 到 controller的数据库中-控制节点

  • 验证在数据库中的计算节点
source ~/admin-openrc   #加载环境变量
openstack compute service list --service nova-compute
  • 发现计算节点
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
  • 注意:添加新的计算节点时,必须在控制器节点上运行以注册这些新的计算节点。另外,可以在中设置适当的时间间隔
vim /etc/nova/nova.conf
[scheduler]
discover_hosts_in_cells_interval = 300
  • 在controller节点验证计算服务操作
source  ~/admin-openrc
openstack compute service list

其输处中有3个服务组件是激活在控制节点,一个服务组件是激活在计算节点

  • 列出身份服务中的API端点以验证与身份服务的连接
openstack catalog list
  • 列出图像服务中的图像以验证与图像服务的连接性
openstack image list
  • 检查单元格和展示位置API是否正常运行
nova-status upgrade check

8. 安装 Neutron 网络虚拟化服务

官方R版 Neutron 网络虚拟化服务安装文档

一篇详细解说Neutron网络虚拟化的文章
博客文章密码 xiaoyuanqujing@666

Neutron 组件介绍

一般而言,neutron-server和各neutron-plugin部署在控制节点或者网络节点上,而neutron-gent则部署在网络节点上和计算节点上。

8.1 控制节点安装

  • 创建neutron数据库
mysql -uroot -p

create database neutron;
  • 对数据库进行授权
grant all privileges on neutron.* to 'neutron'@'localhost' identified by '123456';
grant all privileges on neutron.* to 'neutron'@'%' identified by '123456';
flush privileges;
  • 创建neutron用户
source ~/admin-openrc
openstack user create --domain default --password 123456 neutron
  • adminneutron用户添加角色
openstack role add --project service --user neutron admin
\\没有任何输出
  • 创建neutron服务实体
openstack service create --name neutron --description "OpenStack Networking" network
  • 创建网络服务API端点
openstack endpoint create --region RegionOne network public http://controller:9696
openstack endpoint create --region RegionOne network internal http://controller:9696
openstack endpoint create --region RegionOne network admin http://controller:9696

配置网络的选项:

可以使用选项1和2表示的两种体系结构之一来部署网络服务

  • 选项1 部署了最简单的架构,该架构仅支持将实例附加到提供程序(外部)网络。没有自助服务(专用)网络,路由器或浮动IP地址。只有admin或其他特权用户可以管理提供商网络。
  • 选项2通过支持将实例附加到自助服务网络的第3层服务增强了选项1。该demo非特权用户或其他非特权用户可以管理自助服务网络,包括在自助服务网络与提供商网络之间提供连接的路由器。此外,浮动IP地址使用自助服务网络从外部网络(例如Internet)提供到实例的连接。

官方文档 联网选项1:提供商网络

官方文档 联网选项2:自助服务网络

官方文档 配置元数据代理

提供商网络

  • 安装需要的组件
yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables -y
  • 编辑/etc/neutron/neutron.conf文件
cp /etc/neutron/neutron.conf{,.bak}
egrep -v '^#|^$' /etc/neutron/neutron.conf.bak >/etc/neutron/neutron.conf

[root@controller ~]# vim /etc/neutron/neutron.conf
[DEFAULT]
core_plugin = ml2
service_plugins =
transport_url = rabbit://openstack:123456@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true

[database]
connection = mysql+pymysql://neutron:123456@controller/neutron

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456

[nova]
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = 123456

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
  • 配置模块化层2(ML2)插件

ML2插件使用Linux桥接器机制为实例构建第2层(桥接和交换)虚拟网络基础架构

## 编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件

cp /etc/neutron/plugins/ml2/ml2_conf.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/plugins/ml2/ml2_conf.ini.bak >/etc/neutron/plugins/ml2/ml2_conf.ini

[root@controller ~]# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
#启用flat网络和VLAN网络,
type_drivers = flat,vlan
#禁用自助服务网络
tenant_network_types =
#启用Linux桥接机制
mechanism_drivers = linuxbridge
#启用端口安全扩展驱动程序
extension_drivers = port_security

[ml2_type_flat]
#将提供者的虚拟网络配置为flat网络
flat_networks = provider

[ml2_type_vxlan]
#为自助服务网络配置VXLAN网络标识符范围
vni_ranges = 1:1000

[securitygroup]
#启用ipset以提高安全组规则的效率
enable_ipset = true

flat网络:没有使用任何网络隔离技术,大二层互通。

vlan网络:基于vlan实现的虚拟网络。同一个物理网络中的多个vlan网络是相互隔离的,因此支持多租户这种应用场景。

  • 配置Linux网桥代理

Linux网桥代理为实例构建第2层(桥接和交换)虚拟网络基础结构并处理安全组

## 编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

cp /etc/neutron/plugins/ml2/linuxbridge_agent.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak >//etc/neutron/plugins/ml2/linuxbridge_agent.ini

[root@controller ~]# vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
#将提供者虚拟网络映射到提供者物理网络接口
physical_interface_mappings = provider:eth0

[securitygroup]
#启用安全组并配置Linux网桥iptables防火墙驱动程序
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

[vxlan]
#禁用VXLAN覆盖网络
enable_vxlan = false
  • 修改linux内核参数设置为1
[root@controller ~]# vim /etc/sysctl.conf
...
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1

#要启用网络桥接器支持,需要加载 br_netfilter 内核模块
modprobe br_netfilter
sysctl -p
  • 配置DHCP代理

DHCP代理为虚拟网络提供DHCP服务

#编辑/etc/neutron/dhcp_agent.ini文件
#配置Linux桥接口驱动程序Dnsmasq DHCP驱动程序,并启用隔离的元数据,以便提供商网络上的实例可以通过网络访问元数据

[root@controller ~]# vim /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
  • 配置元数据代理

元数据代理提供配置信息,例如实例的凭据

# 编辑/etc/neutron/metadata_agent.ini文件
# 配置元数据主机和共享机密

[root@controller ~]# vim /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = controller
metadata_proxy_shared_secret = 123456 #密码
  • 配置Nova服务使用网络服务
#编辑/etc/nova/nova.conf文件
[root@controller ~]# vim /etc/nova/nova.conf
...
[neutron]
url = http://controller:9696
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = 123456 #neutron用户密码
service_metadata_proxy = true
metadata_proxy_shared_secret = 123456   #元数据代理密码
  • 创建 /etc/neutron/plugins/ml2/ml2_conf.ini 文件指向ML2插件配置的软链接
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
  • 同步数据库
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
  • 重新启动Nova计算服务的API服务
systemctl restart openstack-nova-api.service
  • 启动网络服务,并配置为开机自启动
systemctl enable neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service

systemctl start neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service

对于网络选项2,还启用并启动第3层服务。这里未配置。请点击链接联网选项2:自助服务网络

8.2 计算节点安装

官方文档 Neytron 网络虚拟化服务计算节点安装

  • 安装组件
yum install openstack-neutron-linuxbridge ebtables ipset -y
  • 编辑/etc/neutron/neutron.conf文件
cp /etc/neutron/neutron.conf{,.bak}
egrep -v '^$|^#' /etc/neutron/neutron.conf.bak >/etc/neutron/neutron.conf

[root@computel ~]# vim /etc/neutron/neutron.conf
[DEFAULT]
transport_url = rabbit://openstack:123456@controller
auth_strategy = keystone

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
  • 配置Linux网桥代理
#编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

[root@computel ml2]# vim linuxbridge_agent.ini 
[linux_bridge]
physical_interface_mappings = provider:eth0

[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

[vxlan]
enable_vxlan = false
  • 修改linux系统内核参数为1
[root@controller ~]# vim /etc/sysctl.conf
...
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1

#要启用网络桥接器支持,需要加载 br_netfilter 内核模块
modprobe br_netfilter
sysctl -p
  • 配置Nova服务使用网络服务
#编辑/etc/nova/nova.conf文件
[root@computel ~]# vim /etc/nova/nova.conf
... 
[neutron]
url = http://controller:9696
auth_url = http://controller:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = 123456
  • 重新启动计算节点上的Nova服务
systemctl restart openstack-nova-compute.service
  • 启动Linux网桥代理,并将其配置为开机自启动
systemctl enable neutron-linuxbridge-agent.service
systemctl restart neutron-linuxbridge-agent.service

8.3 Neutron网络虚拟化验证-控制节点

  • 列出已加载的扩展,以验证该neutron-server过程是否成功启动
source ~/admin-openrc
openstack extension list --network
  • 列出代理商以验证成功
openstack network agent list

9. 安装 Horizon服务-控制节点

  • 安装软件包
yum install openstack-dashboard -y
  • 编辑 /etc/openstack-dashboard/local_settings文件

[root@controller ~]# vim /etc/openstack-dashboard/local_settings
#配置仪表盘在controller节点上使用OpenStack服务
OPENSTACK_HOST = "controller"
#启用身份API版本3
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
#配置user为通过仪表板创建的用户的默认角色
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
#允许主机访问仪表板,接受所有主机
ALLOWED_HOSTS = ['*']

#配置memcached会话存储服务
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': 'controller:11211',
    }
}
#启用对域的版本支持
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
#配置API版本
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
    "compute": 2,
}
#配置Default为通过仪表板创建的用户的默认域
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
#如果选择网络选项1,请禁用对第3层网络服务的支持
OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': False,
    'enable_quotas': False,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
#配置时区为亚洲上海
TIME_ZONE = "Asia/Shanghai"
  • 解决网页无法打开检查
[root@controller ~]# vim /etc/httpd/conf.d/openstack-dashboard.conf
WSGISocketPrefix run/wsgi
WSGIApplicationGroup %{GLOBAL}
  • 重新启动Web服务器和会话存储服务
systemctl restart httpd.service memcached.service
systemctl enable httpd.service memcached.service

10. 访问验证Web页面

使用Web浏览器访问仪表板,

网址为 http://192.168.1.10/dashboard

使用admindemo用户和default域凭据进行身份验证


11. 创建虚拟网络并启动实例

官方文档

本部分创建必要的虚拟网络以支持启动实例。网络选项1包括一个提供程序(外部)网络,以及一个使用它的实例。联网选项2包括一个带有一个使用它的实例的提供者网络,以及一个带有一个使用它的实例的自助服务(专用)网络。

这里选择提供商网络

  • 创建网络
source ~/admin-openrc
openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider

#--share 允许所有项目使用虚拟网络
#--external 将虚拟网络定义为外部
#--internal 如果要创建内部网络,则可以使用
  • 在网络上创建一个子网
openstack subnet create --network provider \
  --allocation-pool start=192.168.1.101,end=192.168.1.250 \
  --dns-nameserver 223.5.5.5 --gateway 192.168.1.254 \
  --subnet-range 192.168.1.0/24 provider
  
#提供者网络使用192.168.1.0/24网段,网关位于192.168.1.1。
#DHCP服务器为每个实例分配从192.168.1.101到192.168.1.250的IP地址。
#所有实例都使用223.5.5.5作为DNS解析器。
  • 创建一台1核cpu 1G硬盘的实例类型
openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano

  • 创建秘钥对

官方安装文档

[root@controller ~]# source ~/admin-openrc
[root@controller ~]# ssh-keygen -q -N ""
Enter file in which to save the key (/root/.ssh/id_rsa): #回车
[root@controller ~]# openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
+-------------+-------------------------------------------------+
| Field       | Value                                           |
+-------------+-------------------------------------------------+
| fingerprint | 62:6a:3f:97:ac:12:2d:90:91:51:01:3d:72:2b:59:ab |
| name        | mykey                                           |
| user_id     | 3dc7ca3b1d3b4755a9662c1038b6241d                |
+-------------+-------------------------------------------------+
  • 验证秘钥对的添加
openstack keypair list
  • 添加安全组规则

默认情况下,default安全组适用于所有实例,并包括拒绝对实例进行远程访问的防火墙规则。对于CirrOS之类的Linux映像,建议至少允许ICMP(ping)和安全Shell(SSH)。

#将规则添加到default安全组
* 许可ICMP协议(ping命令)
openstack security group rule create --proto icmp default
* 允许SSH访问(22端口)
openstack security group rule create --proto tcp --dst-port 22 default
  • 启动一个实例
#要启动实例,必须至少指定实例类型,映像名称,网络,安全组,密钥和实例名称
source admin-openrc
#列出可用的实例类型
openstack flavor list
#列出可用的镜像
openstack image list
#列出可用的网络
openstack network list
#列出可用的安全组
openstack security group list
  • 启动实例
#net-id=<可用的网络的ID>
openstack server create --flavor m1.nano --image cirros   --nic net-id=310645c0-6fb4-43bf-84e3-1349ce7c49b1 --security-group default   --key-name mykey provider-instance
  • 检查实例状态
 openstack server list
  • 使用虚拟控制台访问实例
#从Web浏览器访问
openstack console url show provider-instance

如果Web浏览器在无法解析controller主机名的主机上运行,则可以替换nova.conf的配置文件中的[vnc]模块,将controller为控制器节点上管理接口的IP地址

novncproxy_base_url = http://192.168.1.10:6080/vnc_auto.html
  • 报错 找不到磁盘无法启动的问题

booting from hard disk

#解决方法
将计算节点的nova,conf中
[root@computel ~]# vim /etc/nova/nova.conf
[libvirt]
cpu_mode = none
virt_type = qemu    #因测试中是虚拟机,不是物理机。所以只能修改为qemu

#重启nova计算服务
[root@computel ~]# systemctl restart openstack-nova-compute.service

#重启实例,可在控制节点命令行重启也可在Web网页进行重启
openstack server list
nova reboot 5c2a8b19-68a4-40d3-a55d-a0642e8fe876
  • 验证对网关和互联网的访问
  • 验证远程访问实例的连接性

12. Web界面操作示范

12.1 创建实例

12.2 创建项目

12.3 创建用户

12.4 配置安全组

12.5 手动添加镜像

12.6 ※网络配置※

Neutron是Openstack的网络管理组件,提供网络、子网和路由器的抽象。创建网络必须要创建一个外部网络,可以让外部访问openstack的外部网络,多租户之间共享的网络,外部网络必须由管理员创建,因为外部网络是和物理网络有直接映射关系的虚拟网络。在网络里可以设置一个或多个内部网络,这些内部网络直接连接vm。如果openstack外的网络要访问vm,就必须在网络之间创建路由。接下来,我们就一步一步的去创建openstack的网络。

  • 查看已创建的外部网络和子网情况
  • 创建名为demo_net的私有网络

私有网络中的每个项目的网络是隔离的

因为是私有网络,所以分配地址池可以不用填写,按顺序分配即可

  • 创建路由

私有网络连接到外网需要路由,打开“项目”-“网络”-“路由”,新建路由


13. 安装Cinder 块存储服务

一篇cinder原理的详细的介绍

Cinder将持久性存储添加到虚拟机。块存储提供了用于管理卷的基础架构,并与OpenStack Compute交互以提供实例的卷。该服务还可以管理卷快照和卷类型。nova与cinder的工作原理类似。

块存储服务主要组件

  • cinder-api:

    是cinder服务的 endpoint,提供rest接口,负责处理client请求,并将RPC(远程过程调用)请求发送至cinder-scheduler组件。

  • cinder-volume

    负责具体的volume请求处理,由不同后端存储提供volume存储空间。目前各大存储厂商已经积极地将存储产品的driver贡献到cinder社区。

  • **cinder-scheduler **

    负责cinder请求调度,其核心部分就是scheduler_driver,作为scheduler manager的driver,负责cinder-volume具体的调度处理,发送cinder RPC请求到选择的cinder-volume。

在控制器节点上安装和配置代号为cinder的块存储服务。此服务需要至少一个额外的存储节点,该节点可为实例提供卷。

添加一台节点服务器-cinder

虚拟机分配情况

主机 IP地址 主机名 注意事项
存储节点 192.168.1.30/24 ; 内172.16.1.30/24 cinder 开虚拟化

13.1 安装cinder块存储服务—控制节点

  • 创建数据库
mysql -u root -p

create database cinder;

grant all privileges on cinder.* to 'cinder'@'%' identified by '123456';
grant all privileges on cinder.* to 'cinder'@'localhost' identified by '123456';
flush privileges;
  • 创建一个cinder用户
source ~/admin-openrc
openstack user create --domain default --password 123456 cinder
  • admin向cinder用户添加角色
openstack role add --project service --user cinder admin
  • 创建cinderv2和cinderv3服务实体
openstack service create --name cinderv2   --description "OpenStack Block Storage" volumev2
openstack service create --name cinderv3   --description "OpenStack Block Storage" volumev3
  • 创建块存储服务API端点
#块存储服务需要每个服务实体的端点
openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s
  • 安装软件包
yum install openstack-cinder -y
  • 编辑/etc/cinder/cinder.conf文件
[root@controller ~]# vim /etc/cinder/cinder.conf
[DEFAULT]
transport_url = rabbit://openstack:123456@controller
my_ip = 192.168.1.10

[database]
connection = mysql+pymysql://cinder:123456@controller/cinder

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = 123456

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
  • 填充块存储数据库
su -s /bin/sh -c "cinder-manage db sync" cinder
  • 编辑/etc/nova/nova.conf文件
[root@controller ~]# vim /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne
  • 重启nova计算cinder块存储服务并设置开机自启动
systemctl restart openstack-nova-api.service

systemctl restart openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service

13.2 安装cinder块存储节点

官方安装文档

从OpenStack的角度看块存储的世界

LVM原理及PV、VG、LV、PE、LE关系图

  • 安装LVM软件包
yum install lvm2 device-mapper-persistent-data -y
  • 启动LVM元数据服务,并将其配置为在系统引导时启动
systemctl enable lvm2-lvmetad.service
systemctl start lvm2-lvmetad.service
  • 创建LVM物理卷/dev/sdb
#添加一块新硬盘重启节点
[root@cinder ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.
  • 创建LVM卷组cinder-volumes
[root@cinder ~]# vgcreate cinder-volumes /dev/sdb
  Volume group "cinder-volumes" successfully created
#块存储服务在此卷组中创建逻辑卷
  • 编辑 /etc/lvm/lvm.conf文件

只有实例可以访问块存储卷。但是,底层操作系统管理与卷关联的设备。默认情况下,LVM卷扫描工具会在/dev目录中扫描 包含卷的块存储设备。如果项目在其卷上使用LVM,则扫描工具会检测到这些卷并尝试对其进行缓存,这可能导致基础操作系统卷和项目卷出现各种问题。您必须将LVM重新配置为仅扫描包含cinder-volumes卷组的设备。

[root@cinder ~]# vim /etc/lvm/lvm.conf
#在devices部分,添加一个过滤器,只接受/dev/sdb设备,拒绝其他所有设备
devices {
        filter = [ "a/sdb/", "r/.*/"]

每个过滤器组中的元素都以a开头,即为 accept,或以 r 开头,即为reject,并且包括一个设备名称的正则表达式规则。过滤器组必须以r/.*/结束,过滤所有保留设备。您可以使用 命令:vgs -vvvv 来测试过滤器。

如果您的存储节点在操作系统磁盘上使用了 LVM,您还必需添加相关的设备到过滤器中。例如,如果 /dev/sda 设备包含操作系统

filter = [ "a/sda/", "a/sdb/", "r/.*/"]

类似地,如果您的计算节点在操作系统磁盘上使用了 LVM,您也必需修改这些节点上 /etc/lvm/lvm.conf 文件中的过滤器,将操作系统磁盘包含到过滤器中。例如,如果/dev/sda 设备包含操作系统

filter = [ "a/sda/", "r/.*/"]
  • 安装软件包
yum install centos-release-openstack-rocky -y   #下载R版的源
yum install openstack-cinder targetcli python-keystone -y
  • 编辑/etc/cinder/cinder.conf文件
[root@cinder ~]# vim /etc/cinder/cinder.conf
[DEFAULT]
transport_url = rabbit://openstack:123456@controller
auth_strategy = keystone
my_ip = 192.168.1.30
enabled_backends = lvm
glance_api_servers = http://controller:9292

#为LVM后端配置LVM驱动程序,cinder-volumes卷组,iSCSI协议和适当的iSCSI服务。
#如果该[lvm]部分不存在,请创建它
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm

[database]
connection = mysql+pymysql://cinder:123456@controller/cinder

[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = 123456

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
  • 启动块存储卷服务并设置开机自启动
systemctl restart openstack-cinder-volume.service target.service
systemctl enable openstack-cinder-volume.service target.service

在控制节点进行验证

source ~/admin-openrc
openstack volume service list

安装和配置备份服务


14. 维护openstack平台的考虑因素

1. 掌握安装部署
2. 熟悉上传镜像:centos7 centos6 ubuntu debian windows server R2
3. 给开发开通账户,跳转默认资源配额,创建shell脚本创建用户
4. 增加计算节点:给物理服务器装系统,cobbler无人安装操作系统 ansible批量操作 测试
5. 监控与高可用:zabbix mysql高可用 rabbitmq高可用

中国家科技大学的镜像源—centos

15. Shell脚本创建用户

#物理机可以配置邮箱进行发送邮件通知
cat >> /etc/mail.rc << EOF
set from=xxxx@163.com
set smtp=smtp.163.com
set smtp-auth-user=xxxx@163.com
set smtp-auth-password=xxxxx
set smtp-auth=login
EOF
systemctl restart postfix.service 
[root@controller scripts]# vim user_create.sh 
#!/bin/bash
source  /root/admin-openrc
read -p "请输入您要创建的用户名: " name
read -p "请输入您要发送到邮箱号[xxx.qq.com]: " mail
PWD=`date +%s |sha256sum |base64 |head -c 15`
echo $PWD
openstack project create --domain default  $name
openstack user create --domain default  --password $PWD $name
openstack role add --project $name --user $name user
context="您的openstack账号已开通,账号为 [$name],初始密码为 $PWD ,请妥善保管你的密码,遇到任何问题请联系QQ:245684979,祝您使用愉快! openstack平台访问地址 http://192.168.1.10/dashboard"
echo $context|mail  -s "OpenStack账号开通" $mail

---------------------------------------------------------------------

[root@controller scripts]# sh user_create.sh 
请输入您要创建的用户名: douer
请输入您要发送到邮箱号[xxx.qq.com]: 245684979@qq.com
NzI2Y2Q5OTQ5ZDA
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | a2a1eed4cd7f4c32933cc51574d1c0dd |
| is_domain   | False                            |
| name        | douer                            |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 4424e47ff9134cc99787066fd44fb3a5 |
| name                | douer                            |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

。。

推荐阅读更多精彩内容