一、OpenStack简介

openstack是一个云操作系统,这个操作系统控制着数据中心中的计算,存储和网络资源。所有这些资源的管理都是通过API来来实现的,并且管理资源都有相应的认证机制。

在openstack中有一个叫做dashboard的仪表盘,这个仪表盘通过web界面可以管理这些在DC中的资源。

除了能提供IaaS功能外,你还可以使用orchestration,错误管理和服务管理等服务来确保应用的高可用性。

其实我们说openstack是一个云操作系统是不贴切的,因为openstack不提供操作系统最重要的内核,所以openstack说是操作系统有点"不贴切"。openstack是一个云计算组件的集合体,openstack提供了大量的云计算的组件,通过这些组件的灵活安装和使用你可以在你的公司内部建立起基于openstack的IaaS架构的私有云平台。

官网:Open Source Cloud Computing Infrastructure - OpenStack

二、OpenStack组件概述

1、openstack组件

openstack里面的每一个组件都对应着一个开源项目,它的优点就在这,同样它的缺点也在这。成也萧何,败也萧何。由于openstack的组件太多,让本来一件简单的事情变得太复杂了,太多天马行空的内容被“莫名其妙”的加入到了openstack的计划表,甚至有一些项目还没开始就已经结束了,甚至还有一些烂尾项目不知道何年何月何日才会完成。

但是虽然openstack的组件很多:

  • keystone认证组件
  • glance镜像组件
  • nova计算组件
  • neutron网络组件
  • cinder块存储组件(可选)
  • horizon图形客户端组件

github:https://github.com/openstack

2、openstack基金会

openstack社区也不是一盘散沙,它有自己的组织形态。首先,有一个OpenStack基金会,下面设立了董事会、技术委员会、用户委员会。基金会享有话语权,进行目标和发展的引导。

基金会成员有三种形式。首先是独立个体,也就是以个人名义为OpenStack做出贡献。

其次是铂金会员。主要由对OpenStack作出重要承诺的公司组成,他们提供资金与资源。

最后是金牌会员。同样由公司组成,他们赞助的资金与资源比铂金会员稍微少一些。

基金会的成员网站:Supporting Organizations - Open Infrastructure Foundation (OpenInfra Foundation) - Open Infrastructure Foundation (OpenInfra Foundation)

1)铂金会员

截止2020年9月22号,以前成为铂金会员只需要花钱就行了,现在成为铂金会员,花钱和代码贡献量都要有。

OpenStack基金会白金会员为基金会保护、授权和促进开放基础设施社区和开源软件项目的使命提供了很大一部分资金。每位白金会员的公司战略与OSF的使命一致,并负责为项目投入全职资源。在任何时候都有8个白金赞助商,每个赞助商都在董事会拥有一个席位。感谢以下白金赞助商,他们致力于开放基础设施社区的成功。

2)黄金会员 

OpenStack基金会黄金成员提供资金并承诺OSF使命的战略结盟。有多达24黄金成员在任何给定的时间,由董事会批准。如果您的组织高度参与了开放基础设施社区,并且有兴趣成为金牌会员,请关于加入基金会的信息。感谢以下金牌赞助商,他们对国际社会的成功至关重要。

3、openstack版本名

为了将openstack做了更好的定位,从名称上开始做起,openstack社区在一开始就将自己定位成一个全方位的云计算解决方案,但是后面因为种种原因(k8s火热只是其中的一个原因),他们已经没有当初的"野心"了。

所以他们将自己定位成IaaS云计算架构的解决方案,openstack基金会将openstack的名字改成了openinfra,我们现还叫openstack是因为习惯。

4、openstack架构

概念架构描述的是各个组件和实例的直接关系和间接关系。
1. 概念架构

2. 逻辑架构  

组件官网:

Open Source Cloud Computing Platform Software - OpenStack

1. 计算服务的相关组件

2. 裸机服务的相关组件

3. 存储相关的组件

4. 网络服务相关组件

5. 共享服务(其他服务依赖的服务组件)

6. 编排服务

7. 负载生产的服务

8. 应用声明周期管理服务

9. api代理服务

10. web前端服务

三、keystone简介

keystone在openstack中提供了身份认证和拥有授权的功能,如果你想增加审计功能,要么花钱,要么自己开发。

在官方keystone项目中,都有最新的源码和最新的doc,但是doc有可能不是即使更新的,所以如果你想了解最新的keystone特性,要么撸源码,要么去看release note然后和社区的人交流。

官网:Open Source Cloud Computing Platform Software - OpenStack

Keystone是一个OpenStack服务,通过实现OpenStack的身份API,提供API客户端认证、服务发现和分布式多租户授权(v3)。

为什么要有keystone?

Keystone项目的主要目的是为访问openstack的各个组件(nova,neutron,glance...)提供一个统一的验证方式,具体的:openstack是由众多组件构成的一套系统,该系统的功能是对外提供服务,因而我们可以将其定义为一个‘庞大的软件’,没有软件不考虑安全因素,Keystone对于通常的应用场景所不同的是他要解决分布式(多个组件)环境下的统一认证。由于openstack中有大量的组件需要使用,每个组件都代表着各自的资源。比如nova就代表着计算资源,比如neutron就代表着网络资源,比如glance就代表着镜像资源,比如cinder就代表着存储资源,你能访问组件,对组件有权限就意味着能操作这些资源。所以使用这些组件之前必须要进行认证才可以。

在这里面就有一个问题,是否要在所有的组件里面加上认证功能?

如果再每个组件中加上认证功能并不是不能实现,只不过这和openstack社区的初衷不一样,社区想做的是完全解耦,计算是计算组件,存储是存储组件,网络是网络组件,那么认证就要有认证组 件。所以keystone设计的初衷就是为了解决组件使用身份认证的,所以keystone就是整个openstack组件的访问入口,如果你成功的在keysotne完成了身份认证你才可以进行下一步操作。就像你的linux一样,你需要先login才能做点什么。对吧?

1)keystone功能

openstack是一个SOA(Service-Oriented Architecture)架构,理论上各子项目独立提供相关服务,互不依赖,如nova提供计算服务,glance提供镜像服务等。

实际上所有的组件都依赖keystone的,它集成了三个功能:

  • 管理身份验证(managing authentication):验证用户身份
  • (授权(authorization):基于角色role的权限管理(RBAC->Role Based Aceess Control) - >policy.json
  • 服务目录(catalog of services):提服务目录(ServiceCatalog:包括service和endpoint)服务,用户无论是使用Dashboard图形界面或者CLI命令行方式,都需要访问Keystone获取服务列表,以及每个服务的地址(Openstack中称为Endpoint)

当有人找keystone进行身份验证的时候,其实就是对用户名和密码进行校验。

当用户和密码校验成功之后,会根据你这个用户的权限给你颁发一个令牌,比如你有创建虚拟机的权限,那么这种类似的权限都会在令牌上体现。关于令牌的描述在这里面不完全正确。因为在keystone的授权这里的令牌随着发展经历了太多的变化,令牌总共有4种,uuid,pki,pkiz(压缩的pki令牌),fernet(当今使用的令牌种类)。后面再探讨令牌种类。

keystone在身份验证结束后,会告诉用户当前openstack平台中其他服务的访问方式,其他服务的访问方式是以catalog的形式回复的。

catalog是一个目录树,里面保存了服务的访问url,你通过这个url就能访问到对应的服务,由于openstack的组件都是通过rest api来通信的,所以一定会对外曝露url。在openstack中将这个url定义为endpoint。所以实际上keystone身份验证结束后,他会返回一个catalog列表,针对catalog列表每个服务组件有3个endpoint。3个endpoint分别对应着internal,public,admin。

令牌的认证功能,当其他的组件拿着用户的令牌来找keysotne的时候,keystone需要告诉对应的组件,用户的令牌有什么样的权限。

令牌是有时效性的。

学习openstack肯定需要手工安装,这是必须的,而且至少要装10遍以上,才能了解到openstack的精髓。但是在初期的学习过程中,如果你想从0搭建一个openstack是不现实的。原因就是openstack太过复杂。所以我们讲一个组件就安装一个组件,然后安装这个组件结束之后,我们再回头看这个组件的概念,应该会清晰很多。

2)keystone的一些抽象概念

基于keystone功能抽象出了一些概念,这些概念对于keystone的学习非常重要。

User(用户名):使用Openstack组件的客户端可以是人、服务、系统,任何的客户端来访问openstack组件,都需要有一个credentials(凭据)

User group(用户组):有相同权限的一类人(user)用户组是在keystonev3版本才提供的支持

Credentials:是用于确认用户身份的凭证,说白了就是‘信物’,具体可以是:凭据就是用户名和密码,凭据是用来做身份验证的

Authentication:是验证用户身份的过程。Keystone 服务通过检查用户的 Credential 来确定用户的身份。最开始,使用用户名/密码或者用户名/API key作为credential。当用户的credential被验证后,Kestone会给用户分配一个 authentication token 供该用户后续的请求使用。

因为你不可能每次都发送用户名密码作为凭据,那太不安全了,所以用令牌来进行后续的操作是一个安全的行为。

Keystone中通过Policy(访问规则)来做到基于用户角色(Role)的访问控制。

令牌:当用户的身份认证通过之后,根据你的权限会给你分配一个token(令牌),你根据这个token具备的权限可以去访问其他服务。因为在keystone的授权这里的令牌随着发展经历了太多的变化,令牌总共有4种,uuid,pki,pkiz(压缩的pki令牌),fernet(当今使用的令牌种类)。后面再探讨令牌种类。

Role(角色):普通用户的类型,管理用户的类型,本质就是一堆ACL的集合,用于划分权限(permit list, permit create)可以通过给User指定Role,使User获得Role对应的操作权限。Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role,及每个role访问资源或者进行操作的权限。

系统默认使用管理Role admin和成员Role user(过去的普通用户角色是:_member_) ,user验证时必须带有Project(Tenant)

endpoint: (地址)ip+port组合,使用http协议或者https协议 keystone的internal endpoint使用的端口默认是5000 glance的internal enpoint使用的端口默认是9292 nova的internal endpoint使用的端口默认是8774 neutron的internal endpoint使用的端口默认是9696 ip地址是根据你的ip design来决定的 endpoint的种类有3种:

  • admin url –> 给admin用户使用,Port:35357;
  • internal url –> OpenStack内部服务使用来跟别的服务通信,Port:5000;
  • public url –> 互联网用户可以访问的地址,Port:5000;

region:多region的场景指的多套数据中心有多个nova组件,多个neutron组件,多个glance组件,1个keystone不同的region,endpoint也不同。

现在的主流部署都是尽量的避免多region,因为多region对keystone的压力太大。keystone由于是完全基于http实现的,所以可以做成分布式HA的keystone。

Service与endpoint关系: 在openstack中,每一个service都有三种endpoint. Admin, public, internal(创建完service后需要为其创建API EndPoint. )Admin是用作管理用途的,如它能够修改user/tenant(project)。

public是让客户调用的,比如可以部署在外网上让客户可以管理自己的云,internal是openstack内部调用的。

三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放, internal通常只能对安装有openstack对服务的机器开放,一个service有3个endpoint。

catalog:Catalog包含多个service,每个service包含3个endpoint。如果你查看catalog,那么就能查看到所有的 service和endpoint

Project项目keystone v3(Tenant租户 keystone v2): 是一个人、或服务所拥有的资源集合。不同的Project之间资源是隔离的,资源可以设置配额。 在一个Project(Tenant)中可以包含多个User,每一个User都会根据权限的划分来使用Project(Tenant)中的资源。比如通过Nova创建虚拟机时要指定到某个Project中,在Cinder创建卷也要指定到某个Project中。

User访问Project的资源前,必须要与该Project关联,并且指定User在Project下的Role,一个 assignment(关联)即:Project-User-Role,在Keystone中,Project是其他OpenStack服务用于分组和隔离资源(例如服务器,图像等)的抽象。

在OpenStack成立之初,Keystone project最初被称为“租户”(Tenants),但后来改为Projects,此概念更直观。可以公平地说,Keystone的最基本目的是成为project注册机构,并能够阐明谁有权访问那些project。project本身并不拥有用户(user),但是使用角色(role)分配的概念向用户或用户组(group)授予了对project的访问权限。将role分配给project中的用户或用户组表示该用户或用户组对project中的资源具有某种访问权限,并且所选的特定角色确定该用户或用户组有权访问的类型和功能具有。将role分配给用户有时在OpenStack文档中称为“授予”(authorization)。

Domain:在OpenStack成立之初,还没有一种机制可以将Projects的可视性限制为不同的用户组织。这可能会导致不同组织对项目名称的意外冲突。用户名也具有全局可见性,如果两个不同的组织都使用相同的用户名,则也可能导致用户名发生意外冲突。

为了使OpenStack云能够同时更干净地支持多个用户组织,Keystone添加了一个新的抽象,称为 Domain,可以提供将一组项目和用户(和用户组)的可见性隔离到一个域的能力。

域被正式定义为用户,组和项目的集合,域使您可以将云中的资源划分为特定组织使用的孤岛。域可以充当企业不同部分之间的逻辑划分,或者每个域可以代表完全独立的企业。

例如,一个云可以有两个域,即IBM和AcmeInc。IBM有自己的组,用户和项目集合,Acme Inc也是如此。 keystonev3之后可以支持多域,这里会集成一个windows AD作为外部的身份验证域。

多域的图解:

3) keystone基本认证流程

在这里面需要注意的是为了方便学习,我们在这里面说token是存放在数据库中,keystone为用户生成的token存放在数据中,然后当其他服务拿着用户的token过来的时候,keystone对token做比对,再告诉组件这个token是不是有访问对应资源的权限。uuid,pki,pkiz的token都是存放在数据库中的,但是fernet token是不存放在数据中的。

所以的openstack组件的认证流程都是和上面的图类似的。

四、keystone安装

openstack的安装一定要参考官网文档(开源版本):OpenStack Installation Guide — Installation Guide documentation

1、openstack的节点类型 

openstack的节点类型分为4种:

  1. 控制节点
  2. 网络节点
  3. 计算节点
  4. 存储节点

openstack的组件安装是建立在基础服务之上的,这些基础服务如果不安装是没办法安装openstack组件的。这些基础服务如下:

  1. ntp服务器(可选)
  2. openstack的软件仓库
  3. 数据库(mysql/mariadb)
  4. 消息队列服务(rabbitmq)
  5. memcached(性能优化)
  6. etcd(存储openstack的一些键值)
  7. 上述基础服务都需要在控制节点上安装
  8. 所有的节点都需要安装openstack的软件仓库

2、组件安装概述

keystone是安装在控制节点的,控制节点顾名思义,是对整个openstack集群实现控制的节点,任何对于资源的请求都要通过keystone的认证,这也正符合了控制节点的寓意,因为认证是资源访问的第一步,所以为了实现对openstack集群的控制,控制节点需要安装身份认证服务,所以我们的keystone是安装在控制节点的。控制节点的名称定义非常抽象,你可以理解为keystone安装在哪里,哪个节点就是控制节点。有一些组件比较复杂,在控制节点上和其他节点上都需要安装,比如neutron和nova有在控制节点上安装的部分,也有在计算节点安装的部分。这里面重点强调组件的控制端和被管理端。

neutron在openstack中是最特殊的一个组件,他负责着openstack的网络。所以如果你的neutron的管理端不安装在控制节点上,而是安装在额外的一个节点上,那么那个额外的节点就叫做网络节点。如果部署openstack考虑可扩展性,其实网络组件是一定要从控制节点中剥离出来,但是即使是某些厂商,也喜欢直接将网络节点的组件直接安装在控制节点上。

如果节点安装了nova的被管理端,那么就是计算节点 。

如果节点安装了存储组件的被管理端,那么就是存储节点。

如果节点安装了网络组件,那么就是网络节点。

无论是neutron,nova,存储组件这种复杂的组件都需要管理端,通常的情况下是将组件的管理端安装在控制节点的。

3、控制节点安装前准备

通过上面的内容,我们知道了,keystone应该安装在控制节点,如果想安装keystone,则需要安装openstack的底层服务,就是ntp,openstack软件仓库,数据库,消息队列服务,memcached,etcd等。为了安装keysotne,我们需要先安装上面的软件。控制节点必须要保证至少4G的内存,2核cpu。

openstackclient:10.163.3.100/24

openstack-controller:10.163.3.101/24

目前不需要在客户端上操作。

4、配置软件仓库

由于openstack的软件仓库默认是在国外的镜像站上,访问速度比较慢,所以我们建议更换到国内的镜像站。

1. 设置主机名

[root@eveng-home ~]# ssh 10.163.3.101
[root@localhost ~]# hostnamectl set-hostname controller
[root@localhost ~]# exit
[root@eveng-home ~]# ssh 10.163.3.101
[root@controller ~]# 

2. 配置地址解析

[root@controller ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.163.3.101 controller [root@controller ~]# ping -c1 controller
PING controller (10.163.3.101) 56(84) bytes of data.
64 bytes from controller (10.163.3.101): icmp_seq=1 ttl=64 time=0.152 ms 

3. 配置软件仓库

#清空旧的软件仓库
[root@controller ~]# rm -rf /etc/yum.repos.d/* #设置新的软件仓库
#CentOS8和CentOS7不一样,尤其体现在软件仓库这里。centos8如果想安装消息队列,必须要单独配置rabbitmq 的软件仓库
[root@controller ~]# cat /etc/yum.repos.d/openstack.repo
[baseos]
name=baseos
baseurl=http://mirrors.163.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[appstream]
name=appstream
baseurl=http://mirrors.163.com/centos/8/AppStream/x86_64/os/
gpgcheck=0
[powertools]
name=powertools
baseurl=http://mirrors.163.com/centos/8/PowerTools/x86_64/os/
gpgcheck=0
[cloud-u]
name=cloud-u
baseurl=http://mirrors.163.com/centos/8/cloud/x86_64/openstack-ussuri/
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/
gpgcheck=0
[rabbitmq]
name=rabbitmq
baseurl=http://mirrors.163.com/centos/8/messaging/x86_64/rabbitmq-38/
gpgcheck=0
4. 安全配置
关闭selinux: 
[root@controller ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@controller ~]# setenforce 0 

关闭防火墙:

 [root@controller ~]# systemctl disable firewalld --now

5. ntp服务器(可选)

在生产环境中ntp服务器是必不可少的,必须要保证openstack集群的时间同步,但是在lab环境中,由于我们的节点都有internet连接,都会自动的通过internet同步时间,所以我们可以不配置。

在本小节是配置ntp:

#安装软件包
[root@controller ~]# yum install chrony -y #修改ntp的配置文件
[root@controller ~]# sed -i 's/^#allow.*/allow 10.163.3.0\/24/' /etc/chrony.conf #重启chrony服务
[root@controller ~]# systemctl enable chronyd --now #查看监听端口
[root@controller ~]# netstat -tunlp | grep :323
udp 0 0 127.0.0.1:323 0.0.0.0:*
24078/chronyd
udp6 0 0 ::1:323 :::*
24078/chronyd
6. 安装openstack的客户端
[root@controller ~]# yum install python3-openstackclient -y
[root@controller ~]# yum install openstack-selinux -y

安装openstack-selinux会将你系统openstack相关部分的selinux进行设置。

由于我们关了selinux,这个设置没意义,但是我们还是要安装。

7. 安装mariadb数据库

#安装软件
[root@controller ~]# yum install mariadb mariadb-server python2-PyMySQL -y #设置配置文件/etc/my.cnf.d/openstack.cnf
[root@controller ~]# cat /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 10.163.3.101 default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8 #bind-address参数必须要改成控制节点的ip,表示的意思是数据库的监听地址 #启动数据库服务
[root@controller ~]# systemctl enable mariadb.service --now #初始化安装(选做)
#如果你不做这个操作,你数据库的root就没有密码,如果你做了,你可以选择设置数据库的root密码 [root@controller ~]# mysql_secure_installation #查看监听端口
[root@controller ~]# netstat -tunlp | grep :3306
tcp 0 0 10.163.3.101:3306 0.0.0.0:* LISTEN
27681/mysqld

8. 消息队列的安装

#安装软件
[root@controller ~]# yum install rabbitmq-server -y #启动服务
[root@controller ~]# systemctl enable rabbitmq-server.service --now #添加openstack用户,并设置所以权限
[root@controller ~]# rabbitmqctl add_user openstack RABBIT_PASS #用户名是openstack,密码是RABBIT_PASS,现在这个位置配置的密码一定要记住,不是配置完了,裤子一提就走了,必须要记住。因为后面配置文件中还需要指定这个用户和密码 #设置openstack用户的权限
[root@controller ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*" #列出所有的消息队列用户的权限
[root@controller ~]# rabbitmqctl list_permissions
Listing permissions for vhost "/" ...
user configure write read
guest .* .* .*
openstack .* .* .* #查看监听端口
[root@controller ~]# netstat -tunlp | grep beam
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN
28405/beam.smp
tcp6 0 0 :::5672 :::* LISTEN
28405/beam.smp
9. 安装memcache 
#软件安装
[root@controller ~]# yum install memcached python3-memcached -y #修改配置文件/etc/sysconfig/memcached
#经验之谈,如果你发现配置文件设置非常简单,你就用sed操作就可以了,就没必要vim进去,浪费时间。 [root@controller ~]# sed -i 's/^OPTIONS.*/OPTIONS="-l controller"/' /etc/sysconfig/memcached
[root@controller ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l controller" #controller必须有解析地址才可以。 #启动服务
[root@controller ~]# systemctl enable memcached.service --now#查看监听端口
[root@controller ~]# netstat -tunlp | grep :11211
tcp 0 0 10.163.3.101:11211 0.0.0.0:* LISTEN
30451/memcached

10. 安装etcd

#安装软件包 [root@controller ~]# yum install etcd -y #修改配置文件/etc/etcd/etcd.conf
[root@controller ~]# cat /etc/etcd/etcd.conf #[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.163.3.101:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.163.3.101:2379"
ETCD_NAME="controller" #[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.163.3.101:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.163.3.101:2379"
ETCD_INITIAL_CLUSTER="controller=http://10.163.3.101:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new" #启动etcd服务
[root@controller ~]# systemctl enable etcd --now #查看监听端口
[root@controller ~]# netstat -tunlp | grep etcd
tcp 0 0 10.163.3.101:2379 0.0.0.0:* LISTEN
31450/etcd
tcp 0 0 10.163.3.101:2380 0.0.0.0:* LISTEN
31450/etcd

5、keystone的安装

1. 设置keystone的数据库

#创建数据库
[root@controller ~]# mysql -e "CREATE DATABASE keystone;" #设置keystone用户对数据的权限
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';"
[root@controller ~]# mysql -e "flush privileges;" #我们keystone数据库的密码是KEYSTONE_DBPASS #测试连接
[root@controller ~]# mysql -ukeystone -pKEYSTONE_DBPASS -hcontroller MariaDB [(none)]> exit

2. 安装keystone的软件包

keystone是特殊的,keystone是基于httpd一个组件,所以安装keystone就是安装httpd,mod_wsgi就是动态网站的模块。

[root@controller ~]# yum install openstack-keystone httpd python3-mod_wsgi -y

3. 修改keystone的配置文件

1)降低配置文件复杂度 

openstack的配置文件是学习openstack的第一个拦路虎,因为刚开始学习openstack的时候会被配置文件吓到,内容太特么多了。

即使你很耐心的编辑修改配置文件,也会让你抓狂.  .

[root@controller ~]# cat /etc/keystone/keystone.conf | wc -l
2615 #keystone配置文件默认有2615行,为了去掉所有的注释和空白行,我们使用过滤手段 #去掉空白行去掉以'#'开头的注释,你会发现keystone的实际配置文件没有任何内容
[root@controller ~]# egrep -v '^#|^$' /etc/keystone/keystone.conf
[DEFAULT]
[application_credential]
[assignment]
[auth]
[cache]
[catalog]
[cors]
[credential]
[database]
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[federation]
[fernet_receipts]
[fernet_tokens]
[healthcheck]
[identity]
[identity_mapping]
[jwt_tokens]
[ldap]
[memcache]
[oauth1]
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[policy]
[profiler]
[receipt]
[resource]
[revoke]
[role]
[saml]
[security_compliance]
[shadow_users]
[token]
[tokenless_auth]
[totp]
[trust]
[unified_limit]
[wsgi]#记录这个配置文件的权限
[root@controller ~]# ls -l /etc/keystone/keystone.conf
-rw-r-----. 1 root keystone 104797 May 13 20:39 /etc/keystone/keystone.conf #做一个简洁的keystone配置文件
[root@controller ~]# egrep -v '^#|^$' /etc/keystone/keystone.conf > /etc/keystone/keystone.conf.bak
[root@controller ~]# cp /etc/keystone/keystone.conf.bak /etc/keystone/keystone.conf
cp: overwrite '/etc/keystone/keystone.conf'? yes #查看权限,一定要保证keystone用户至少要对配置文件有读权限
[root@controller ~]# ls -l /etc/keystone/keystone.conf
-rw-r-----. 1 root keystone 601 Sep 22 15:47 /etc/keystone/keystone.conf #上述操作完全可以通过脚本来实现
[root@controller ~]# cat filter.sh
#!/bin/bash grep -E -v '^#|^$' $1 > .test
cat .test > $1

2)修改配置文件

配置文件中除了第一行的DEFAULT,剩下的都是以abcdefg字母排序的:

[root@controller ~]# cat /etc/keystone/keystone.conf
[DEFAULT]
[application_credential]
[assignment]
[auth]
[cache]
[catalog]
[cors]
[credential]
[database]
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[federation]
[fernet_receipts]
[fernet_tokens]
[healthcheck]
[identity]
[identity_mapping]
[jwt_tokens]
[ldap]
[memcache]
[oauth1]
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[policy]
[profiler]
[receipt]
[resource]
[revoke]
[role]
[saml]
[security_compliance]
[shadow_users]
[token]
provider = fernet
[tokenless_auth]
[totp]
[trust]
[unified_limit]
[wsgi]

3)初始化keystone的数据库

填充keystone的数据库:

[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

你可以验证一下keystone数据库中是否有表。

4)初始化keystone的fernet key

[root@controller ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@controller ~]# keystone-manage credential_setup --keystone-user keystone -- keystone-group keystone
[root@controller ~]# ls /etc/keystone/fernet-keys/
0 1

5)身份认证服务的初始化

其实身份认证服务的初始化,就是设置service和endpoint,同时keystone的初始化还设置了admin用户的密码是 ADMIN_PASS:

[root@controller ~]# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
--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 

设置keystone服务的endpoint,总共设置3种,分别是admin-url,internal-url,public-url。其实如果在生产环境中,admin和public的url应该是另外一个网段的地址。internal单独是一个网段的地址。而且admin和public的端口号也需要修改。一般来说internal endpoint的端口号就是5000,admin和public的的端口号根据你的需求修改。但是注意,并不是仅仅更改了endpoint就可以了!还需要修改httpd的监听端口,而且网络要配置正确。

endpoint仅仅是keystone告诉用户这边服务的端口应该是哪些,但是真正的服务开放端口是需要进行配置的。并不是配置了endpoint,对应的端口就开放了。

只要在安装keystone的时候我们需要进行这种初始化,等keystone安装结束之后,我们其他服务组件安装就可以直接使用openstack命令行高来操作了。

6)修改httpd的配置文件

由于keystone是基于httpd实现的,所以所谓的安装了openstack-keystone,就是给我们提供了对应的httpd的动态网站。

#修改httpd的主配置文件
#所以我们要修改/etc/httpd/conf/httpd.conf配置文件,在这个配置文件里面我们需要修改的内容仅仅是 servername
[root@controller ~]# sed -i 's/^#ServerName.*/ServerName controller/' /etc/httpd/conf/httpd.conf #设置keystone的动态web虚拟主机配置文件
[root@controller ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

7)重启web服务

[root@controller ~]# systemctl enable httpd.service --now
[root@controller ~]# netstat -tunlp | grep :5000
tcp6 0 0 :::5000 :::* LISTEN
2873/httpd

8)设置凭据文件

#所谓凭据文件,就是使用openstack客户端默认的参数文件,参数文件包含了若干的环境变量,这些环境变量会被openstack客户端调用。
[root@controller ~]# export OS_USERNAME=admin
[root@controller ~]# export OS_PASSWORD=ADMIN_PASS
[root@controller ~]# export OS_PROJECT_NAME=admin
[root@controller ~]# export OS_USER_DOMAIN_NAME=Default
[root@controller ~]# export OS_PROJECT_DOMAIN_NAME=Default
[root@controller ~]# export OS_AUTH_URL=http://controller:5000/v3
[root@controller ~]# export OS_IDENTITY_API_VERSION=3 
  • OS_USERNAME表示的是用户名
  • OS_PASSWORD表示用户的密码
  • OS_PROJECT_NAME表示的操作的项目名称
  • OS_USER_DOMAIN_NAME表示用户所在的域
  • OS_PROJECT_DOMAIN_NAME表示项目的域名
  • OS_AUTH_URL表示的是keystone的endpoint
  • OS_IDENTITY_API_VERSION表示是的keystone的版本
[root@controller ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| 470cae6cf58d473396d508b5d052ca05 | RegionOne | keystone | identity | True
| internal | http://controller:5000/v3/ | |
4af58a3ac8564f21a5f78e9dd4a8dca4 | RegionOne | keystone | identity | True
| admin | http://controller:5000/v3/ |
| de4788ee7ca04df38921bc6963b94a2e | RegionOne | keystone | identity | True
| public | http://controller:5000/v3/ |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+#由于我们设置的环境变量只是临时的,所以我们需要做一个环境变量文件,方便我们后面使用 [root@controller ~]# cat openrc
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
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 [root@eveng-home ~]# ssh 10.163.3.101
[root@controller ~]# source openrc
[root@controller ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL | +----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| 470cae6cf58d473396d508b5d052ca05 | RegionOne | keystone | identity | True
| internal | http://controller:5000/v3/ |
| 4af58a3ac8564f21a5f78e9dd4a8dca4 | RegionOne | keystone | identity | True
| admin | http://controller:5000/v3/ |
| de4788ee7ca04df38921bc6963b94a2e | RegionOne | keystone | identity | True
| public | http://controller:5000/v3/ |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+ [root@controller ~]# openstack catalog list
+----------+----------+----------------------------------------+
| Name | Type | Endpoints |
+----------+----------+----------------------------------------+
| keystone | identity | RegionOne                            |
|          |          | internal: http://controller:5000/v3/ |
|          |          | RegionOne                            |
|          |          | admin: http://controller:5000/v3/    |
|          |          | RegionOne                            |
|          |          | public: http://controller:5000/v3/   |
|          |          |                                       |
+----------+----------+----------------------------------------+ [root@controller ~]# openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |+----------------------------------+----------+----------+
| b3df82766e244652ba112a5124ce021f | keystone | identity |
+----------------------------------+----------+----------+

9)使用debug参数查看rest api交互流程

[root@controller ~]# openstack endpoint list --debug

10)创建一个service的project(重要)

keystone初始化的时候,为我们创建了一个默认的domian,叫做default,我们后面在安装别的服务的时候,我们需要将服务都放到一个project中,所以我们需要创建一个名字为service的project。

[root@controller ~]# openstack domain list
+---------+---------+---------+--------------------+
| ID | Name | Enabled | Description |
+---------+---------+---------+--------------------+
| default | Default | True | The default domain |
+---------+---------+---------+--------------------+ #创建一个service的project
[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 36fd82cb703d4f3d9a51f64cd319265b |
| is_domain   | False                            |
| name        | service                          |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |+-------------+----------------------------------+ #查看project
[root@controller ~]# openstack project list
+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 36fd82cb703d4f3d9a51f64cd319265b | service |
| 44637984647c404788df29c34d043dec | admin   |
+----------------------------------+---------+

五、客户端节点安装openstack客户端

1、openstack客户端的意义

任何安装了openstack客户端软件的节点都可以是openstack的客户端,只要能访问到keystone的endpoint,并且有对应的资源操作权限,就可以管理那个openstack的资源池。

如果配置的openstack客户端想使用openstack的资源池,需要满足如下条件:

  1. 必须能访问到keystone的endpoint,必须网络可达
  2. 必须要有正确的凭据

2、安装openstack客户端

1. 基础配置
[root@localhost ~]# hostnamectl set-hostname client
[root@localhost ~]# exit
[root@eveng-home ~]# ssh 10.163.3.100root@10.163.3.100's password:
[root@client ~]#

2. 配置软件仓库

[root@client ~]# rm -rf /etc/yum.repos.d/* [root@client ~]# cat /etc/yum.repos.d/openstack.repo
[baseos]
name=baseos
baseurl=http://mirrors.163.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[appstream]
name=appstream
baseurl=http://mirrors.163.com/centos/8/AppStream/x86_64/os/
gpgcheck=0
[powertools]
name=powertools
baseurl=http://mirrors.163.com/centos/8/PowerTools/x86_64/os/
gpgcheck=0
[cloud-u]
name=cloud-u
baseurl=http://mirrors.163.com/centos/8/cloud/x86_64/openstack-ussuri/
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/
gpgcheck=0
[rabbitmq]
name=rabbitmq
baseurl=http://mirrors.163.com/centos/8/messaging/x86_64/rabbitmq-38/
gpgcheck=0

3. 安装openstack客户端软件

[root@client ~]# yum install python3-openstackclient -y

3、配置凭据和解析

[root@client ~]# cat openrc
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
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 [root@client ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.163.3.101 controller

4、客户端测试

#测试之前开启抓包工具 #加载凭据然后测试
[root@client ~]# source openrc
[root@client ~]# openstack endpoint list
Traceback (most recent call last):
File "/usr/bin/openstack", line 6, in <module>
from openstackclient.shell import main
ModuleNotFoundError: No module named 'openstackclient' #出现上述问题的原因是因为没安装python3
[root@client ~]# yum -y install python3 #再次操作
[root@client ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| 470cae6cf58d473396d508b5d052ca05 | RegionOne | keystone | identity | True
| internal | http://controller:5000/v3/ |
| 4af58a3ac8564f21a5f78e9dd4a8dca4 | RegionOne | keystone | identity | True
| admin | http://controller:5000/v3/ |
| de4788ee7ca04df38921bc6963b94a2e | RegionOne | keystone | identity | True
| public | http://controller:5000/v3/ |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+

5、客户端和keystone的包交互

6、创建用户测试

[root@client ~]# openstack user create yyds
No password was supplied, authentication will fail when a user does not have a password.
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | afc2cffffc6d47efa20d804e8ad16906 |
| name                | yyds                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
[root@client ~]# openstack user set --password yyds yyds ##为yyds用户分配在admin项目中的管理员的role(admin)
[root@client ~]# openstack role add --user yyds --project admin admin #使用yyds用户进行测试
[root@client ~]# cat openrc-yyds
export OS_USERNAME=yyds
export OS_PASSWORD=yyds
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 [root@client ~]# source openrc-yyds
[root@client ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| 470cae6cf58d473396d508b5d052ca05 | RegionOne | keystone | identity | True
| internal | http://controller:5000/v3/ |
| 4af58a3ac8564f21a5f78e9dd4a8dca4 | RegionOne | keystone | identity | True
| admin | http://controller:5000/v3/ |
| de4788ee7ca04df38921bc6963b94a2e | RegionOne | keystone | identity | True
| public | http://controller:5000/v3/ |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+

默认keystone安装初始化的时候会有一个缺省的域,叫做default,这个域是本地的域,如果你想做统一身份验证可以集成外部的域。

虽然我们的keystone已经安装完成了,并且我们已经实现了keystone的身份验证功能,但是目前我们的openstack集群里面没有任何的资源组件。

六、glance镜像服务

Glance是在openstack提供镜像(image)服务的组件,是openstack的核心组件之一,需要依赖keystone认证服务,所谓image就是openstack私有云中为虚拟机提供操作系统的一个虚拟磁盘文件(vmdk)。

为什么需要镜像服务呢?

对于操作系统安装,方式无非是手工安装,网络安装,使用克隆工具克隆现有的操作系统这三种方式,前两种适合任何平台,后一种适合虚拟化平台。

这三种方式前两种都需要重新安装操作系统将所需要的软件包到安装到磁盘中,所以安装软件过程较为耗时,第三种使用克隆工具是克隆现有的操作系统,花费的时间和磁盘的IO有关系,不需要重新安装操作系统软件。

第三种方式较前两种来说效率更高,但是在某些情况下不够灵活。克隆的操作系统和克隆的母版文件是一模一样的,包括网络配置等信息也都是一模一样,所以在没有cloud-init(一个软件)之前,每次都需要克隆后重新登录操作系统进行相关的手工配置修改。

我们的镜像服务采用的方式和第三种非常相似(几乎完全一样),不过只是对克隆的模板文件做了更加细腻的管理。这样我们的镜像服务采用这种方式创建出来的instance几乎是秒级的。

1、Glance功能

Glance提供了相应的rest api,让客户端可以查看到image的元数据(image信息)。

glance提供了相应的后端存储用于存储image。

Glance可以对instance做快照,并且将其保存为新的image。

简化起来glance就是提供云平台虚拟机镜像资源的组件,在这里面描述的镜像是已经带有操作系统的虚拟磁盘。至于到底是什么种类的虚拟磁盘和openstack使用的虚拟化种类有关。一般我们都使用kvm作为虚拟化的hypervisor。

2、Glance架构

3、Glance组件

1. glance-api

openstack中的所有组件的通信设计都是通过http协议的rest api来实现的。所以几乎每个openstack大组件都 一个名字叫做xxx api的小组件,用于接收rest api来实现组件之间的通信,glance-api就是glance组件中负责api通信的小组件。

Glance-api是系统后台运行的服务进程,监听9292端口,对外提供rest api,响应image查询,获取和存储的调用,glance-api在v1版本不会真正的处理请求。

如果是与image metadata相关的操作,glance-api会把请求转给glance-registry,如果是image存储取出相关的操作,glance-api会转给后端存储

2. glance-registry(和glance-api合并了)

Glance-api并不是直接和数据库交互的,而是将镜像的元数据存储交给glance-registry来做。

新版本的glance-api版本2已经取消了glance-registry组件,由glance-api直接和glance db进行交互。

3. glance后端存储

Glance的镜像是存储在glance配置的本地存储或网络存储中的,所以glance的镜像存放位置我们叫做后端存储,因 为存储是本地的还是网络的都无所谓,这些都是在glance背后默默将镜像存放起来的存储空间。 Glance支持的后端存储种类非常多,可以通过配置文件指定。

下面的示例展示的是使用本地文件系统进行存储,存储路径是/var/lib/glance/images

filesystem_store_datadir=/var/lib/glance/images/ 

glance后端存储支持的存储种类有:

  • swift
  • cinder
  • 本地文件系统
  • S3存储(AWS公有云的一种服务资源)
  • http协议的存储
  • ceph存储

4. glance db

glance db组件就是glance的数据库,存放了镜像的元数据和存储位置。

4、Glance版本

七、Glance安装

1. 确定安装位置

虽然我们的glance可以安装在额外的节点上,但是实际上再选择一个节点安装glance是没有必要的,在大部分场景 下,我们都可以直接将glance安装在控制节点上。如果你要将glance安装在别的节点,那么其实显得过于麻烦。即使 我们将glance安装在其他节点上,虽然openstack的每个组件都需要一个数据库,我们也不需要额外的进行数据库的 安装,因为我们可以配置glance连接控制节点的数据库。

2. glance db的创建

#安装openstack的任何组件,都需要单独的创建一个数据库
[root@controller ~]# mysql -e "CREATE DATABASE glance;"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';"
[root@controller ~]# mysql -e "flush privileges;" [root@controller ~]# mysql -uglance -pGLANCE_DBPASS -hcontrollerMariaDB [(none)]> exit
[root@controller ~]#
3. 创建glanceendpoint

由于keystone负责所有资源组件访问的认证和授权,所以keystone必须要记录所有组件的访问方式,组件的访问是通过rest api来实现的,也就是http或者https,换句话说也就是url,在openstack中资源的入口就是 endpoint。所以我们在安装glance的时候需要创建glance的endpoint,这个步骤相当于在keystone上注册 glance。

只有keystone的endpoint的创建有所不同,因为我们在设置keystone的时候,我们没办法使用openstack客户端来创建endpoint,因为keystone还没有安装好。我们目前keystone已经安装好了,那么我们此时可以通过 openstack客户端访问keystone来创建endpoint

#加载凭据文件
[root@controller ~]# source openrc #创建glance的用户,密码是glance
[root@controller ~]# openstack user create --domain default --password glance glance
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 28b86a1f22414c43b76441849faff2c7 |
| name                | glance                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+ #赋予glance用户admin的role,让glance用户在openstack集群中有管理员的权限
[root@controller ~]# openstack role add --project service --user glance admin #我们要创建一个glance的service
[root@controller ~]# openstack service create --name glance --description "OpenStack Image" image
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | 502bd7cca44f45bb897a86e22ae7a3dc |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+ #如果重复的创建了service,需要通过id删除,而不是name
[root@controller ~]# openstack service create --name glance --description "OpenStack Image" image
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | 971732b530e84bf4999c0656be5c616d |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+ [root@controller ~]# openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |
+----------------------------------+----------+----------+
| 502bd7cca44f45bb897a86e22ae7a3dc | glance   | image    |
| 971732b530e84bf4999c0656be5c616d | glance   | image    |
| b3df82766e244652ba112a5124ce021f | keystone | identity |
+----------------------------------+----------+----------+ [root@controller ~]# openstack service delete 971732b530e84bf4999c0656be5c616d [root@controller ~]# openstack service list
+----------------------------------+----------+----------+
| ID                               | Name     | Type     |
+----------------------------------+----------+----------+
| 502bd7cca44f45bb897a86e22ae7a3dc | glance   | image    |
| b3df82766e244652ba112a5124ce021f | keystone | identity |
+----------------------------------+----------+----------+ #创建glance service的endpoint
[root@controller ~]# openstack endpoint create --region RegionOne image public http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 2081f07dbdd24a03a4b1b7d6cc519feb |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 502bd7cca44f45bb897a86e22ae7a3dc |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+[root@controller ~]# openstack endpoint create --region RegionOne image internal http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | ec6553df32ad426097cc80885039cd12 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 502bd7cca44f45bb897a86e22ae7a3dc |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne image admin http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | a03b032a2ab1403fb4dc37a9d86605ee |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 502bd7cca44f45bb897a86e22ae7a3dc |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| 2081f07dbdd24a03a4b1b7d6cc519feb | RegionOne | glance | image | True
| public | http://controller:9292  |
| 470cae6cf58d473396d508b5d052ca05 | RegionOne | keystone | identity | True
| internal | http://controller:5000/v3/ |
| 4af58a3ac8564f21a5f78e9dd4a8dca4 | RegionOne | keystone | identity | True
| admin | http://controller:5000/v3/ |
| a03b032a2ab1403fb4dc37a9d86605ee | RegionOne | glance | image | True
| admin | http://controller:9292   |
| de4788ee7ca04df38921bc6963b94a2e | RegionOne | keystone | identity | True
| public | http://controller:5000/v3/ |
| ec6553df32ad426097cc80885039cd12 | RegionOne | glance | image | True
| internal | http://controller:9292 |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+ [root@controller ~]# openstack catalog list
+----------+----------+----------------------------------------+
| Name     | Type     | Endpoints                              |
+----------+----------+----------------------------------------+
| glance   | image    | RegionOne                              |
|          |          | public: http://controller:9292         |
|          |          | RegionOne                              |
|          |          | admin: http://controller:9292          |
|          |          | RegionOne                              |
|          |          | internal: http://controller:9292       |
|          |          |                                        |
|keystone  | identity | RegionOne                              |
|          |          | internal: http://controller:5000/v3/   |
|          |          | RegionOne                              |
|          |          | admin: http://controller:5000/v3/      |
|          |          | RegionOne                              |
|          |          | public: http://controller:5000/v3/     |
|          |          |                                        |
+----------+----------+----------------------------------------+

4. 安装glance

[root@controller ~]# yum install openstack-glance -y
[root@controller ~]# yum history
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
11 | install openstack-glance | 2020-09-23 09:11 | I, U | 124
10 | reinstall openstack-keys | 2020-09-22 15:49 | R | 4
9  | install openstack-keysto | 2020-09-22 15:38 | I, U | 79
8  | install etcd -y | 2020-09-22 15:20 | Install | 1
7  | install memcached python | 2020-09-22 15:13 | Install | 2
6  | install rabbitmq-server | 2020-09-22 15:05 | I, U | 92
5  | install mariadb mariadb- | 2020-09-22 14:59 | Install | 62
4  | install openstack-selinu | 2020-09-22 14:55 | Install | 1
3  | install python3-openstac | 2020-09-22 14:55 | I, O | 64
2  | install chrony -y | 2020-09-22 14:50 | Upgrade | 1
1  | | 2019-11-28 19:07 | Install | 601 EE [root@controller ~]# id glance
uid=161(glance) gid=161(glance) groups=161(glance) [root@controller ~]# ls -l /etc/glance/ t
otal 460
-rw-r-----. 1 root glance 196252 Aug 12 17:29 glance-api.conf
-rw-r-----. 1 root glance 90746 Aug 12 17:29 glance-cache.conf
-rw-r--r--. 1 root glance 7779 Aug 12 17:29 glance-image-import.conf
-rw-r-----. 1 root glance 65581 Aug 12 17:29 glance-registry.conf
-rw-r-----. 1 root glance 82607 Aug 12 17:29 glance-scrubber.conf
-rw-r--r--. 1 root glance 632 Aug 13 13:32 glance-swift.conf
drwxr-xr-x. 2 root root 4096 Sep 23 09:12 metadefs
-rw-r-----. 1 root glance 941 Aug 13 13:32 rootwrap.conf
drwxr-xr-x. 2 root root 65 Sep 23 09:12 rootwrap.d
-rw-r-----. 1 root glance 2145 Aug 12 17:29 schema-image.json

5. glance配置文件的修改

1)使用filter.sh脚本简化配置文件

#使用我们之前创建的filter.sh脚本简化配置文件
[root@controller ~]# cat filter.sh
#!/bin/bash
grep -E -v '^#|^$' $1 > .test
cat .test > $1 [root@controller ~]# cat /etc/glance/glance-api.conf | wc -l
6050 [root@controller ~]# ./filter.sh /etc/glance/glance-api.conf [root@controller ~]# cat /etc/glance/glance-api.conf | wc -l
25[root@controller ~]# cat /etc/glance/glance-api.conf
[DEFAULT]
[cinder]
[cors]
[database]
[file]
[glance.store.http.store]
[glance.store.rbd.store]
[glance.store.s3.store]
[glance.store.swift.store]
[glance.store.vmware_datastore.store]
[glance_store]
[image_format]
[keystone_authtoken]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[paste_deploy]
[profiler]
[store_type_location_strategy]
[task]
[taskflow_executor]

2)修改glance-api的配置文件

[root@controller ~]# cat /etc/glance/glance-api.conf
[DEFAULT]
[cinder]
[cors]
[database]
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance
[file]
[glance.store.http.store]
[glance.store.rbd.store]
[glance.store.s3.store]
[glance.store.swift.store]
[glance.store.vmware_datastore.store]
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
[image_format]
[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 = glance
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[paste_deploy]flavor = keystone [profiler] [store_type_location_strategy] [task] [taskflow_executor]

6. 初始化glance的数据库

[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance
Traceback (most recent call last):
File "/usr/bin/glance-manage", line 10, in <module>
sys.exit(main())
File "/usr/lib/python3.6/site-packages/glance/cmd/manage.py", line 555, in main config.parse_args(default_config_files=cfg_files)
File "/usr/lib/python3.6/site-packages/glance/common/config.py", line 718, in parse_args default_config_files=default_config_files)
File "/usr/lib/python3.6/site-packages/oslo_config/cfg.py", line 2141, in __call__ self._namespace._files_permission_denied) oslo_config.cfg.ConfigFilesPermissionDeniedError: Failed to open some config files: /etc/glance/glance-api.conf [root@controller ~]# ls -l /etc/glance/glance-api.conf
-rw-r-----. 1 root root 902 Sep 23 09:35 /etc/glance/glance-api.conf #由于之前演示了配置文件的参数查看,我们重新创建的配置文件权限不对。glance用户没有查看配置文件的 权限,所以数据库初始化失败。#让glance用户对配置文件有读权限
[root@controller ~]# chgrp glance /etc/glance/glance-api.conf
[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance
......
Database is synced successfully

7. 启动glance服务

[root@controller ~]# systemctl enable openstack-glance-api.service --now #查看服务
[root@controller ~]# systemctl status openstack-glance-api
● openstack-glance-api.service - OpenStack Image Service (code-named Glance) API server Loaded: loaded (/usr/lib/systemd/system/openstack-glance-api.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-09-23 09:42:37 CST; 19s ago Main PID: 26162 (glance-api)
Tasks: 5 (limit: 26213)
Memory: 98.7M
CGroup: /system.slice/openstack-glance-api.service
├─26162 /usr/bin/python3 /usr/bin/glance-api
├─26168 /usr/bin/python3 /usr/bin/glance-api
├─26169 /usr/bin/python3 /usr/bin/glance-api
├─26170 /usr/bin/python3 /usr/bin/glance-api
└─26171 /usr/bin/python3 /usr/bin/glance-api
Sep 23 09:42:37 controller systemd[1]: Started OpenStack Image Service (code-named Glance) API server.#查看进程
[root@controller ~]# ps aux | grep 26162
glance 26162 4.7 0.6 308912 99268 ? Ss 09:42 0:04 /usr/bin/python3
/usr/bin/glance-api #通过进程查看监听端口
[root@controller ~]# netstat -tunlp | grep 26162
tcp 0 0 0.0.0.0:9292 0.0.0.0:* LISTEN
26162/python3

8. 上传镜像测试glance

1)镜像下载

#镜像下载站点,主流的linux发行版本都提供了cloud镜像的下载站点
https://docs.openstack.org/image-guide/obtain-images.html [root@controller ~]# wget http://download.cirros-cloud.net/0.5.1/cirros-0.5.1-x86_64- disk.img

2)镜像上传到glance

[root@controller ~]# glance image-create --name "cirros" --file cirros-0.5.1-x86_64- disk.img --disk-format qcow2 --container-format bare --visibility=public
+------------------+------------------------------------------------------------------- ---------------+| Property | Value |
+------------------+------------------------------------------------------------------- ---------------+
| checksum | 1d3062cd89af34e419f7100277f38b2b |
| container_format | bare |
| created_at | 2020-09-23T01:52:35Z |
| disk_format | qcow2 |
| id | 1682ab57-bb53-45a7-b6df-492cbb1c864a |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| os_hash_algo | sha512 |
| os_hash_value | 553d220ed58cfee7dafe003c446a9f197ab5edf8ffc09396c74187cf83873c877e7ae041cb80f3b9 |
| | 1489acf687183adcd689b53b38e3ddd22e627e7f98a09c46 |
| os_hidden | False |
| owner | 44637984647c404788df29c34d043dec |
| protected | False |
| size | 16338944 |
| status | active |
| tags | [] |
| updated_at | 2020-09-23T01:52:36Z |
| virtual_size | Not available |
| visibility | public |
+------------------+------------------------------------------------------------------- ---------------+

3)镜像上传位置验证

[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 1682ab57-bb53-45a7-b6df-492cbb1c864a | cirros | active |
+--------------------------------------+--------+--------+ #可以看到大小是一样的,但是千万不要有手工将镜像拷贝过去的想法,因为glance做的不仅仅是拷贝 [root@controller ~]# ls /var/lib/glance/images/ -lh
total 16M
-rw-r-----. 1 glance glance 16M Sep 23 09:52 1682ab57-bb53-45a7-b6df-492cbb1c864a [root@controller ~]# ls -lh cirros-0.5.1-x86_64-disk.img
-rw-r--r--. 1 root root 16M Mar 7 2020 cirros-0.5.1-x86_64-disk.img

4)在数据中查看我们的镜像元数据

#镜像元数据库其实是我们镜像的信息,因为我们不可能将一个镜像文件保存到数据库 #镜像存放位置
[root@controller ~]# mysql -e 'use glance;' -e 'select * from image_locations;'
+----+--------------------------------------+------------------------------------------ --------------------------+---------------------+---------------------+------------+--- ------+-----------+--------+
| id | image_id | value | created_at | updated_at | deleted_at | deleted | meta_data | status |
+----+--------------------------------------+------------------------------------------ --------------------------+---------------------+---------------------+------------+--- ------+-----------+--------+
| 1  | 1682ab57-bb53-45a7-b6df-492cbb1c864a | file:///var/lib/glance/images/1682ab57- bb53-45a7-b6df-492cbb1c864a | 2020-09-23 01:52:36 | 2020-09-23 01:52:36 | NULL | 0 | {} | active |
+----+--------------------------------------+------------------------------------------ --------------------------+---------------------+---------------------+------------+--- ------+-----------+--------+#镜像的基础信息
[root@controller ~]# mysql -e 'use glance;' -e 'select * from images;'
+--------------------------------------+--------+----------+--------+------------------ ---+---------------------+------------+---------+-------------+------------------+----- -----------------------------+----------------------------------+----------+---------+- ----------+--------------+------------+-----------+--------------+--------------------- --------------------------------------------------------------------------------------- ----------------------+
| id | name | size | status | created_at | updated_at | deleted_at | deleted | disk_format | container_format | checksum | owner | min_disk | min_ram | protected | virtual_size | visibility | os_hidden | os_hash_algo | os_hash_value |
+--------------------------------------+--------+----------+--------+------------------ ---+---------------------+------------+---------+-------------+------------------+----- -----------------------------+----------------------------------+----------+---------+- ----------+--------------+------------+-----------+--------------+--------------------- --------------------------------------------------------------------------------------- ----------------------+
| 1682ab57-bb53-45a7-b6df-492cbb1c864a | cirros | 16338944 | active | 2020-09-23 01:52:35 | 2020-09-23 01:52:36 | NULL | 0 | qcow2 | bare | 1d3062cd89af34e419f7100277f38b2b | 44637984647c404788df29c34d043dec | 0 | 0 | 0 | NULL | public | 0 | sha512 | 553d220ed58cfee7dafe003c446a9f197ab5edf8ffc09396c74187cf83873c877e7ae041cb80f3b91489acf 687183adcd689b53b38e3ddd22e627e7f98a09c46 |
+--------------------------------------+--------+----------+--------+------------------ ---+---------------------+------------+---------+-------------+------------------+----- -----------------------------+----------------------------------+----------+---------+- ----------+--------------+------------+-----------+--------------+--------------------- --------------------------------------------------------------------------------------- ----------------------+

八、OpenStack的Nova组件

1、Nova简介

nova是openstack提供计算服务(compute service)的组件,计算资源(cpu和内存memory),但是对于一个虚拟机(instance)来说,仅仅有cpu和memory是不够的,还需要有磁盘和网卡。

磁盘对应的就是存储资源,网卡对应的就是网络资源。虽然openstack中有存储资源组件和网络资源组件,但是这些组件都是和nova相关的。nova作为openstack的核心组件,相比于其他的组件要略微复杂。

neutron是我们后面要将的网络组件,也和nova一样复杂,但是neutron初期是没有nova复杂的。neutron的复杂在于和SDN的集成,随着openstack集群越来越大,nova和neutron会变得同样复杂,反而keystone和glance组件相对这两者来说比较简单。

官网:Open Source Cloud Computing Platform Software - OpenStack

2、Nova架构

如果你是nova架构的设计者,对于一个提供计算服务的组件来说需要具备如下功能:

  1. nova必须要具备从其他组件接收api消息的功能,具备发送api消息的功能
  2. 必须要有调用硬件资源的功能(虚拟化技术支持libvirt)
  3. 必须要有资源监控的功能
  4. 必须有算法来计算最终的虚拟机创建在哪个服务器上
  5. 必须要有一个数据库来存放和计算资源相关的信息
  6. 必须要有访问存储资源的能力
  7. 必须要有访问网络资源的能力
  8. 必须要有访问镜像资源的能力
  9. 必须要有和keystone验证权限的能力
  10. 提供虚拟机的访问控制功能

Nova架构图:

架构图中涉及到的nova组件:

  1. nova api
  2. nova db
  3. nova scheduler
  4. nova compute
  5. nova conductor

虽然我们在上面的nova架构图中没有消息队列组件但是,图中的“线”已经描述出了需要使用消息队列通信的组件。

3、Nova核心组件

1. nova api

nova-api是nova的大脑,是整个nova的入口,nova-api负责和外部的组件通信,但是并不是所有的rest api通信都需要nova api亲立亲为去做。因为这样对nova-api的压力太大。nova-api或者说nova的压力主要来自于计算节点的数量和在这些计算节点上部署的虚拟机的数量,数量越大,nova的压力越大。

用户通过客户端或图形对所有虚拟机层面的操作最终的结果都是直接向nova的endpoint发送rest api,其结果是 nova-api会收到这些api请求,然后直接执行操作。也就是说nova-api是整个nova组件的一个入口(门户)。

一般nova-api在收到api后会做如下操作:

  1. 对api进行格式化检查,检查api是否正确,参数是否正确。
  2. 通知其他组件执行api中对应的操作。
  3. 将其他组件执行的结果返回给nova-api->客户端

nova-api就是负责整个虚拟机实例运作的大脑。

2. nova db

nova-db是nova存放一切元数据信息的位置,包括虚拟机信息,计算节点信息等等,nova db并不仅有一个,而是有 多个。

nova-db就是存放虚拟机信息的,不仅仅是这个功能....

3. nova-scheduler

当用户通过客户端创建instance(虚拟机)的时候会提出所需多少资源,哪些资源,实际上就是flavor(虚拟机资源模板)里面对instance类型的定义,这时候当nova-api收到这个请求的时候(假定权限通过),会在nova db里面将instance条目存放起来,然后会将其送到nova-scheduler进行资源调度分配。说白了就是通过nova- scheduler来决定这个instance要在哪个提供计算服务的节点上启动。

nova-scheduler首先会从nova db里面提取每个提供计算服务节点的信息。在获取了每个提供计算服务的节点信息后,通过算法选择其中的一个节点,然后启动我们的openstack instance。

在计算节点数量特别多,而且不同的计算节点如果具备不同的特性,那么nova-scheduler一定要针对不同的属性做定义。

nova-scheduler通过filter和weight进行主机筛选:

比如说我们最开始有10个计算节点,通过第一个filter筛选,有2个不满足条件,就剔除这两个计算节点,然后再次使用filter筛选,有3个不满足条件,就剔除这个三个计算节点,以此类推使用所有配置的filter来筛选满足条件的计算节点。

如果经过filter筛选之后剩下0个节点满足条件,那么虚拟机将会创建失败,如果筛选之后剩下1个节点满足条件,我们的实例就在这个满足条件的节点上创建。如果所有filter筛选之后还剩下多个节点满足创建实例的条件,那么你将需要使用weight进行打分,比如: node1: cpu 3分, ram 2分, disk 5分.... node2: cpu 2分, ram 1分, disk 9分.... 最后就选择了node2上部署虚拟机。

nova-scheduler是进行虚拟机调度的功能:

4. nova-compute 

nova-compute就是纯粹的打工仔,上面讲的组件全是领导,就nova-compute一个人打工。nova-compute是部署在计算节点之上的,只要安装了nova-compute的节点,都可以当成是计算节点。如果你在控制节点上也安装了nova- compute,那么这个节点就既是控制节点也是计算节点,但是我们一般不建议这样做。原因是控制节点的压力已经很大了,如果在上面再启动虚拟机,你是要弄死他吗?

nova compute需要负责的东西:

  1. 支持libvirt来让nova支持多种虚拟化解决方案
  2. 定期和placement(存储资源信息的组件)汇报资源情况
  3. 通过控制libvirt来管理instance的生命周期
  4. 要负责和neutron沟通获取instance网络资源
  5. 要负责和glance沟通获取instance的镜像资源
  6. 要负责和cinder沟通获取instance的存储资源(可选)
  7. 自己提供instance的计算资源,但是要报备

简单的理解nova-compute是用来起虚拟机的服务

5. nova-conductor

nova-compute需要将某些实例信息写入到数据库中,表示自己已经完成工作(向领导汇报工作),但是实际上如果让nova-compute有直接访问nova db又不够安全。 所以我们nova里面多了一个组件(领导亲信)来帮助nova-compute将信息更新到nova db,这个组件就是nova- conductor。

nova-conductor两大优点:

  1. 增加了安全性(领导亲信,能不安全吗?)
  2. 提高了可扩展性

因为计算节点随着openstack集群的变大,数量会变得很多,所以nova-compute是不受信任的。

6. nova可选功能组件

#最常用的可选功能组件就是Nova-consoleauth和nova-novncproxy Openstack包含了一个VNC代理。这个VNC代理允许用户连接运行在计算节点的控制台如果你想开启这个功能你就需要安装nova-consoleauth认证服务和nova-novncproxy代理服务,如果不需要开启,你就不用安装这个这两个服务。

为什么要有novncproxy代理服务呢?因为在我们的openstack集群中,默认计算节点全都是在内网当中的,但是你的openstack集群对外曝露的是public网段地址实现访问控制。所以如果你想要访问计算节点里面的虚拟机控制台,则需要在控制节点上或者其他节点上开启代理。一般来说我们就是将这个代理放到控制节点上的。由于你不能直接的访问到计算节点里面的虚拟机,所以你需要通过控制节点上的web代理实现访问计算节点虚拟机的控制台。

nova-consoleauth实现访问虚拟机控制台所需token的生成。

nova-novncproxy是实现虚拟机控制台的web代理。

7. placement 

Placement是一个OpenStack服务,它提供一个HTTP API来跟踪云资源库存和使用情况,以帮助其他服务有效地管理和分配它们的资源。

placement是在rocky版本加进来的,在那时placement还并没有成立一个单独的项目,而是和nova组件放在了一起。在Stein版本placement从nova中独立出来,作为一个项目用作openstack中的资源信息管理。

由于在openstack中存在这大量的原生资源和三方资源(厂商私有的driver提供的资源),为了整合这些资源,openstack才使用了placement组件来存放所有的资源信息。用于其他服务的访问。如果没有placement,那么以后如果openstack再创建新的组件需要访问openstack集群资源信息,就需要访问对应资源的数据库组件。这样比较麻烦。有placement之后,新的组件需要访问资源信息的时候直接访问placement的db就ok了。

私有云的用户,尤其是传统IT架构转型的私有云用户一般会拥有各式各样的存量资源系统,与这些系统对接会让OpenStack的资源体系变得复杂。从用户的角度出发,或许会希望:作为使用共享存储解决方案的用户,会希望 Nova 和 Horizon能够正确报告共享存储磁盘资源的总量和使用量信息。

作为高级的 Neutron 用户,预期会使用外部的第三方路由网络功能,希望Nova能够掌握和使用特定的网络端口与 特定的子网池相关联,确保虚拟机能够在该子网池上启动。

作为高级的 Cinder 用户,希望当我在 nova boot 命令中指定了 cinder volume-id 后 Nova 能够知道哪一些计算节点与Request Volume 所在的 Cinder 存储池相关联。 所以,OpenStack 除了要处理计算节点CPU,内存,PCI设备、本地磁盘等内部资源外,还经常需要有如SDS、 NFS提供的存储服务,SDN提供的网络服务等外部资源。

但在以往,Nova只能处理由计算节点提供的资源。所以,当资源类型和提供者变得多样时,自然就需求一种高度抽象且简单统一的管理方法,让用户能够便捷的使用、管理、监控整个OpenStack 的系统资源,这就是Placement。

8. nova的消息队列组件

1)nova消息队列架构图

进程和进程之间是需要通信的,如果需要进程间的通信,只有两种方法,第一种是底层通信,第二种是网络通信。如果采用网络通信,则很好理解,我们openstack的大组件之间都是通过网络来通信的,其实就是基于http或者https的rest api通信。由于某些组件比较复杂,某些大组件里面的小组件需要借助消息队列实现通信,因为根本没必要通过网络通信,而且网路通信的效率相比于底层通信效率比较低。

消息队列就是底层通信的一种方式。消息队列能将小组件之间的通信合理的安排起来。小组件之间的通信信息可以通过消息队列协议合理的安排起来以达到消息不丢失的目的。消息队列软件属于中间件。

2)AMQP协议概述(参考RFC)

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。

AMQP是应用层协议的一个开放标准,为面向消息的中间件而设计,AMQP协议的设计理念与数据通信网络中的路由协议非常类似,不同的是,数据通信网络是基于通信链路的状态决定客户端与服务端之间的连接,而AMQP是基于消息队列的状态决定消息生产者与消息消费者之间的连接。

对于AMQP来讲,消息队列的状态信息决定通信系统的转发路径,链接两端之间的链路并不是专用且永久的,而是根据消息队列的状态与属性实现信息在基于AMQP的服务器上存储与转发,正如数据通信网络的IP数据包转发机制,所有的路由器是基于通信链路的状态而形成路由表,IP数据包根据路由表实现报文的本地存储与逐级转发,二者在实现机制上具有异曲同工之妙。

3)AMQP协议工作流程

  1. 发布者(Publisher)发布消息(Message),经由交换机(Exchange)。
  2. 交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue)。
  3. 最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

4)AMQP协议组件图

  1. 生产者(Publisher/Producer):生产者顾名思义就是生产消息的角色。生产者会将消息发送给交换机。为了使交换机正确的将消息路由给队列,发布消息时需指定消息的路由键(routing key)。
  2. 消息代理(Broker):代理的职能就是接收发布者发布的消息并将消息推送给订阅了消息的消费者。
  3. 虚拟主机(Virtual Host):出于多租户和安全因素设计的,把AMQP的基本组(交换机,队列,绑定称为AMQP组件)件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个 borker(RabbitMQ server)提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
  4. 交换机(Exchange):交换机负责接收消息并按照一定的规则将消息路由给队列。路由的规则存储在交换机与队列绑定时指定的routing key。
  5. 绑定(Binding):交换机和队列之间通过路由键(routing key)相互绑定起来,并根据路由键将消息路由到对应队列。
  6. 队列(Queue):消息的载体,exchange中的消息将被路由到队列中,并推送给消费者或者被消费者取走。
  7. 连接(Connection):消费者和生产者与消息代理之间的连接
  8. 通道(Channel):如果消费者每一次从代理中取消息都建立一次连接的话,在消息量大的情况下建立多个连接将会有巨大的开销。Channel是在Connection内部建立的逻辑连接。如果应用程序支持多线程,可以为每个线程建立单独的通道进行通讯。AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel 之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
  9. 消费者(Consumer):接收消息的角色就是消费者

5)rabbitmq介绍

RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

RabbitMQ 是 AMQP 的一种实现,它包括Server (服务器端)、Client (客户端) 和 Plugins (插件)。

RabbitMQ 服务器是用 Erlang 语言编写的

6)消息队列的性能问题

通过nova组件架构图,我们可以看到,nova-api,nova-secheduler,nova-conductor,nova-compute之间进行消息通信都是借助消息队列。意味着如果他们之间的通信太多,对消息队列来说会有瓶颈问题。随着计算节点数量的增加,nova-compute数量也对对应的增加,比如你有1000个计算节点,那么你就有1000个nova-compute,我们消息队列中至少有1000个消息的Consumer。这会对消息队列产生极大的瓶颈。

通常情况下,当集群规模扩展到200个节点,一个消息可能要在十几秒后才会响应,集群的整体性能大大下降。

9. nova cell

cell是细胞

在以前的OpenStack版本中,Openstack的性能瓶颈主要在Message Queue和Database。尤其是Message Queue,随着计算节点的增加,性能变的越来越差。

为了应对这种情况,Nova很早之前提出来nova-cell的解决方案。目的是在把大的OpenStack集群分成小的单元, 每个单元有自己的Message Queue和Database。 以此来解决规模增加时引起的性能问题。

而且不会向Region那样,把各个集群独立运行。 在cell里面,Keystone、Neutron、Cinder、Glance 等资源还是共享的。

1)nova cellv1架构图

比如原来有100个节点使用一个消息队列和一个数据库,我们创建父cell和子cell或者孙子cell,我们将nova- compute和nova-scheduler分到对应的子cell和孙子cell。父cell实际上管理着子cell,子cell管理着孙子 cell。如果想创建一个虚拟机,会由nova-api传送到父nova-cell,然后父nova-cell将消息再逐级传递给下面的子子孙孙cell。父cell和子子孙孙cell的区别在于父cell里面有nova-api,父cell是没有nova-scheduler。

在部署nova cellv1的时候一般没有采用孙子cell的,一般都是到子cell就ok了。

2)典型的nova cellv1案例

nova cellv1最大的应用案例就是欧洲原子能研究中心。

欧洲核子研究中心,即欧洲核研究组织,几年来一直在运行一个大型的OpenStack云,帮助数千名科学家分析来自LHC的数据。

2012年,在CERN云的早期设计阶段,我们决定使用Nova cell来支持基础设施扩展到数千个节点。现在,由于分布在两个数据中心的70个单元中有超过28万个核心,我们面临着迁移到Pike发行版中所要求的Nova cellV2的挑战。

在这次介绍中,我们将描述Nova cell如何允许CERN扩展到数千个节点、它的优点以及如何减轻Nova cell V1的实现问题。接下来,我们将介绍如何将单元V1的Newton升级为单元V2的Pike。我们将解释我们遵循的步骤以及在升级过程中遇到的问题。最后,我们将报告大规模使用cell V2的经验,它的警告以及我们如何减轻它们。

视频播放链接:Open Infrastructure Summit videos from past community events, featuring keynotes and sessions from the global network of developers, operators, and supporting organizations.

3)nova cellv2背景

由于nova cellv1的层次化设计问题,让nova cell看起来过于复杂,子子孙孙的nova cell让运维人员产生了极大的负担。nova cellv2采用扁平化的设计结构,取消了子子孙孙nova cell而直接换成了1级nova cell,所以从设计角度就比nova cellv1简洁很多。

4)nova cellv2

  1. 所有的 cell 变成一个扁平架构 。 比之前的多层父子架构要简化很多 。
  2. api 和 cell 有了明显的边界 。 api 层面只需要数据库,不需要Message Queue。
  3. nova-api 现在依赖 nova_api 和 nova_cell0 两个数据库 。
  4. nova-scheduler 服务只需要在 api 层面上安装 ,cell 不需要参数调度 。 这样实现了一次调度就可以确定到具体在哪个 cell 的哪台机器上启动
  5. cell 里面只需要安装 nova-compute 和 nova-conductor 服务 , 和其依赖的 DB 和 MQ
  6. api 上面服务会直接连接 cell 的 MQ 和 DB, 所以不需要类似 nova-cell 这样子服务存在。 性能上也会有及大的提升

cell1,cell2....celln都是存放nova-compute的子cell。只有cell0是特殊的。

Cell0相关的数据库表都在nova_api里面,包括cell_mappings,host_mappings, instance_mappings。

自Newton版本 ,nova就一直拆分nova数据库,为cell v2做准备。把一些全局数据表从nova库搬到了 nova_api,把cell0的表迁移到nova_cell0数据。

其表结构如下 :

  1. cell_mappings表cell的transport_url和database_connection记录了如何访问子cell。
  2. host_mappings是用于nova-scheduler, 可以确认分配到的机器。这里其实也有一个坑,之前nova-compute 启动起来,就可以直接使用了,cell v2之后,就需要手动运行 nova-manage cell_v2 discover_host,把 host mapping 到 cell_mappings 表里面 , 那台计算节点才会加入到调度中 。
  3. instance_mappings 表里有所有 instance id,这样在查询instance时 , 就可以从这个表里查到他所在的cell,然后直连 cell 拿到 instance 具体信息 。

总结:cell0里面最关键的一个东西就是cell0的数据库,这个数据库和cell1和cell2....celln的数据库不一样,这个数据库就像一本书的目录一样,通过这个nova_cell0的数据库我们能找到虚拟机,计算节点,到底实在cell1还是cell2里面。

5)nova cellv2流程

当想要获取一个机器的详细信息时:

  1. nova-api 先从 instance_mappings 表拿到 instance 的 cell_id(找到虚拟机在那个cell里) ;
  2. 再从 cell_mappings 表拿到所在 cell 的 DB connection(获取连接这个cell的方式);
  3. 直接连接 cell 的 DB 拿到机器的详细信息(从这个cell的db中拿到机器的信息);

当要重启一台机器时 :

  1. nova-api 先从 instance_mappings 表里拿到 instance 所在的 cell_id(找到虚拟机在对应的那个 cell)
  2. 从 cell_mappings 里拿到所在 cell 的 message queue 连接(获取到这个cell的消息队列连接方式)
  3. nova-api 直接给 mq 的相关队列发重启机器的消息(通过消息队列发送重启消息)

当新建机器时 :

  1. nova-api 接到用户的请求信息 , 先转发到 nova-scheduler 进行调度 , nova-scheduler 通过 placement service,直接确定分配到哪台机器上;
  2. nova-api 把 instance 的信息存入 instance_mappings 表;
  3. nova-api 把机器信息存到目标 cell 的 database;
  4. nova-api 给 cell 的 message queue 的相关队列发消息,启动机器;

6)cellv2的优点

  • 数据库和消息队列作为 nova 的一等良民 。(直接和nova-api通信)
  • 在 cell 的数据库里没有冗余数据 , 所有共享数据都在nova-api中
  • 全局数据和 cell 数据有一条清晰的界线
  • 非 cell 用户很容易的就可以迁移到 cell v2 上面 。 不需要更改现在的部署架构
  • cell v1 的用户也可以迁移到 cell v2 上 。 只要手动建立起所有的 mapping, 关掉现在存在的 nova-cell 服务,清掉最上层 cell 的数据库 。 但是最上层 cell 本质上和其它 cell 是不同的,所以需要调整架构。
  • 增减 cell 变的十分简单,而且在把某个cell加入之前 ,可以在其它环境进行测试

7)cellv2的命令

因为 cell v2 完全靠 database 的操作为建立 , 所以也没有相关的 api 接口,主要靠nova-manage cell_v2 命令。

nova-manage

cell_v2

create_cell

delete_cell

list_cells

map_cell0

discover_hosts

simple_cell_setup

map_cell_and_hosts

map_instances

verify_instance

计算节点自动发现上面提到了现在 nova-compute 服务上线后,不会自动加到 nova-api 的 host_mappings 里面,也就不会加到 nova-scheduler 的调度中。需要手动运行 nova-manage cell_v2 discover_hosts 命令。这显示略显繁琐 。

在小型一些的环境上,推荐打开自动发现功能 , 就不用手动跑命令了(在scheduler section)

discover_hosts_in_cells_interval

8)nova的淘汰组件

(1)nova-network

过去:

Openstack在2010年正式发布它的第一个版本Austin的时候,nova-network作为它的核心组件被包含其中。 nova-network是nova项目的网络实现。它利用了linux-bridge(早期,目前也支持OVS)作为交换机,具备Flat、Flat DHCP、VLAN三种组网模式,其主要功能有:

  1. IP地址分配包括为虚拟主机分配私有(固定)和浮动IP地址。
  2. 网络模型与管理提供虚拟网络使虚拟主机之间以及与外部网络通信。
  3. 安全控制主要通过ebtables和iptables来实现。

nova-network性能出色,工作稳定,支持muti-host部署实现HA,但是其网络管理不够独立,功能不灵活,组网方式受限,比较适合中小规模。

#nova-network和openstack社区理念不同,没有做到完全的解耦,所以后面版本将nova-network从nova中抽离,然后建立了单独的网络组件。

新生:

Quantum作为独立的网络管理项目在Essex版本中作为试用项目出现,在Folsom版本正式发布。作为独立项目,其能够提供独立灵活的网络管理功能。在组网模式上增加了GRE和VxLAN。支持linux-bridge和OVS,支持Cisco等商业公司的插件,但是各家厂商的插件无法同时在底层网络中运行,缺乏HA机制。

主要的功能:

  1. 提供面向tenant的API,用来控制L2网络和管理IP地址;
  2. 支持位于不同的二层网络的IP地址重叠;
  3. 支持三层转发和多路由器;
  4. 支持插件式网络组建;
  5. 支持隧道技术;
  6. 支持三层代理和DHCP代理的多节点部署,增强了扩展性和可靠性
  7. 提供了试用版本的负载均衡API。

Neutron其实是因为Quantum名称侵权问题而在Havana版本上更名而来。

(2)nova-volume

nova-volume是cinder的前身,在Folsom版本发布时,从Nova中剥离作为一个独立的Openstack项目存在。

九、控制节点安装nova

1、拓扑

我们在拓扑里面添加了2个计算节点:

openstack-compute1:10.163.1.102/24
openstack-compute2:10.163.1.103/24 

由于nova的安装既需要在计算节点上安装也需要在控制节点上安装,在我们的lab中,所以我们添加了2个计算节点。

由于openstack的placement组件是和资源相关的,且包含了我们nova的资源,所以我们就直接在nova的部署同时将placement部署完毕。

2、控制节点的placement安装

创建placement数据库:

#数据库操作
[root@controller ~]# mysql -e "CREATE DATABASE placement;"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS'"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';"
[root@controller ~]# mysql -e "flush privileges;" #验证操作
[root@controller ~]# mysql -uplacement -pPLACEMENT_DBPASS -hcontroller -e 'show databases;' +--------------------+
| Database           |
+--------------------+
| information_schema |
| placement          |
+--------------------+

创建placement的endpoint:

#创建用户
[root@controller ~]# source openrc
[root@controller ~]# openstack user create --domain default --password placement placement
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | a9eb41a311f4459db66e4888a9ba0fff |
| name                | placement                        |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+ #授权
[root@controller ~]# openstack role add --project service --user placement admin#创建服务
[root@controller ~]# openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Placement API                    |
| enabled     | True                             |
| id          | 7317ed9daff34494be56c9161b22183b |
| name        | placement                        |
| type        | placement                        |
+-------------+----------------------------------+#创建endpoint
[root@controller ~]# openstack endpoint create --region RegionOne placement public http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 63c20b3a461742adae74b8b93e3c7678 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 7317ed9daff34494be56c9161b22183b |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne placement internal http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 1be6acec56e949f28b54f32fa8e28f6f |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 7317ed9daff34494be56c9161b22183b |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne placement admin http://controller:8778
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | faa5f578808d42aa84ff13d01bd5bdcb |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 7317ed9daff34494be56c9161b22183b |
| service_name | placement                        |
| service_type | placement                        |
| url          | http://controller:8778           |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint list
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| ID | Region | Service Name | Service Type | Enabled | Interface | URL |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+
| 1be6acec56e949f28b54f32fa8e28f6f | RegionOne | placement | placement | True
| internal | http://controller:8778 |
| 2081f07dbdd24a03a4b1b7d6cc519feb | RegionOne | glance | image | True
| public | http://controller:9292 |
| 470cae6cf58d473396d508b5d052ca05 | RegionOne | keystone | identity | True
| internal | http://controller:5000/v3/ |
| 4af58a3ac8564f21a5f78e9dd4a8dca4 | RegionOne | keystone | identity | True
| admin | http://controller:5000/v3/ |
| 63c20b3a461742adae74b8b93e3c7678 | RegionOne | placement | placement | True
| public | http://controller:8778 |
| a03b032a2ab1403fb4dc37a9d86605ee | RegionOne | glance | image | True
| admin | http://controller:9292 |
| de4788ee7ca04df38921bc6963b94a2e | RegionOne | keystone | identity | True
| public | http://controller:5000/v3/ |
| ec6553df32ad426097cc80885039cd12 | RegionOne | glance | image | True
| internal | http://controller:9292 |
| faa5f578808d42aa84ff13d01bd5bdcb | RegionOne | placement | placement | True
| admin | http://controller:8778 |
+----------------------------------+-----------+--------------+--------------+--------- +-----------+----------------------------+ [root@controller ~]# openstack catalog list
+-----------+-----------+----------------------------------------+
| Name      | Type      | Endpoints                              |
+-----------+-----------+----------------------------------------+
| glance   | image      | RegionOne                              |
|          |            | public: http://controller:9292         |
|          |            | RegionOne                              |
|          |            | admin: http://controller:9292          |
|          |            | RegionOne                              |
|          |            | internal: http://controller:9292       |
|          |            |                                        |
|placement | placement  | RegionOne                              |
|          |            | internal: http://controller:8778       |
|          |            | RegionOne                              |
|          |            | public: http://controller:8778         |
|          |            | RegionOne                              |
|          |            | admin: http://controller:8778          |
|          |            |                                        |
| keystone | identity   | RegionOne                              |
|          |            | internal: http://controller:5000/v3/   |
|          |            | RegionOne                              |
|          |            | admin: http://controller:5000/v3/      |
|          |            | RegionOne                              |
|          |            | public: http://controller:5000/v3/     |
|          |            |                                        |
+-----------+-----------+----------------------------------------+

安装placement:

[root@controller ~]# yum install openstack-placement-api -y

修改placement配置文件:

#过滤配置文件
[root@controller ~]# ./filter.sh /etc/placement/placement.conf #修改配置文件
[root@controller ~]# cat /etc/placement/placement.conf
[DEFAULT]
[api]auth_strategy = keystone
[cors]
[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 = placement
password = placement
[oslo_policy]
[placement]
[placement_database]
connection = mysql+pymysql://placement:PLACEMENT_DBPASS@controller/placement
[profiler]

placement的bug:

#由于软件包的bug,没有开启placement的访问权限,需要在web配置文件结尾加入
<Directory /usr/bin> <IfVersion >= 2.4> Require all granted </IfVersion> <IfVersion < 2.4> Order allow,deny Allow from all </IfVersion>
</Directory>#修改完成后如下
[root@controller ~]# cat /etc/httpd/conf.d/00-placement-api.conf
Listen 8778 <VirtualHost *:8778> WSGIProcessGroup placement-api WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On WSGIDaemonProcess placement-api processes=3 threads=1 user=placement group=placement     WSGIScriptAlias / /usr/bin/placement-api<IfVersion >= 2.4> ErrorLogFormat "%M" </IfVersion> ErrorLog /var/log/placement/placement-api.log #SSLEngine On #SSLCertificateFile ... #SSLCertificateKeyFile ...
</VirtualHost> Alias /placement-api /usr/bin/placement-api
<Location /placement-api> SetHandler wsgi-script Options +ExecCGI WSGIProcessGroup placement-api WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On
</Location>
<Directory /usr/bin> <IfVersion >= 2.4> Require all granted </IfVersion> <IfVersion < 2.4> Order allow,deny Allow from all </IfVersion>
</Directory>

同步placement数据库:

#同步placement数据库
[root@controller ~]# su -s /bin/sh -c "placement-manage db sync" placement #验证
[root@controller ~]# mysql -uplacement -pPLACEMENT_DBPASS -hcontroller -e 'use placement;' -e 'show tables;'
+------------------------------+
| Tables_in_placement          |
+------------------------------+
| alembic_version              |
| allocations                  |
| consumers                    |
| inventories                  |
| placement_aggregates         |
| projects                     |
| resource_classes             |
| resource_provider_aggregates |
| resource_provider_traits     |
| resource_providers           |
| traits                       |
| users                        |
+------------------------------+

重启服务:

[root@controller ~]# systemctl restart httpd [root@controller ~]# netstat -tunlp | grep :8778
tcp6 0 0 :::8778 :::* LISTEN
13037/httpd

验证placement安装成功:

[root@controller ~]# placement-status upgrade check
+----------------------------------+
| Upgrade Check Results            |
+----------------------------------+
| Check: Missing Root Provider IDs |
| Result: Success                  |
| Details: None                    |
+----------------------------------+
| Check: Incomplete Consumers      |
| Result: Success                  |
| Details: None                    |
+----------------------------------+

3、在控制节点上安装nova核心组件

nova有很多的组件,最核心的组件包括nova-api,nova-db,nova-secheduler,nova-conductor,nova- compute。控制节点上需要安装的nova组件是除了nova-compute之外的所有组件,因为如果节点安装了nova- compute,那么他就成为了一个计算节点,我们一般不会在控制节点上安装nova-compute,因为这样会让控制节点的性能下降。如果你想了解所有的openstack组件安装在一个节点上,参考RDO项目。

所以我们在nova部署时需要在控 制节点上安装:

nova-api、nova-db、nova-secheduler、nova-conductor、nova-consoleauth和nova-novncproxy。

在控制节点上创建nova数据库:

#创建3个数据库,和1个用户
[root@controller ~]# mysql -e "CREATE DATABASE nova;" &>>/dev/null
[root@controller ~]# mysql -e "CREATE DATABASE nova_api;" &>>/dev/null
[root@controller ~]# mysql -e "CREATE DATABASE nova_cell0;" &>>/dev/null[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';"#验证
[root@controller ~]# mysql -unova -pNOVA_DBPASS -hcontroller -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| nova               |
| nova_api           |
| nova_cell0         |
+--------------------+

创建nova的endpoint:

#创建用户
[root@controller ~]# openstack user create --domain default --password nova nova
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
|domain_id            | default                          |
| enabled             | True                             |
| id                  | 9a6d252e7d964a0283e2475e71c72f67 |
| name                | nova                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+ #授权
[root@controller ~]# openstack role add --project service --user nova admin #创建服务
[root@controller ~]# openstack service create --name nova --description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | fc1f31c402fb4a5c9414637a23c59917 |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+ #创建endpoint
[root@controller ~]# openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 8eebdd7bb5d64ca2b79ff37942e6c09f |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | fc1f31c402fb4a5c9414637a23c59917 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 1ce327e7a36648729c0c04b5a6bf7e7b |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | fc1f31c402fb4a5c9414637a23c59917 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | ced5a156f18f405abca5590018b27b89 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | fc1f31c402fb4a5c9414637a23c59917 |
| service_name | nova                             |
| service_type | compute                          |
| url          | http://controller:8774/v2.1      |
+--------------+----------------------------------+

安装nova软件:

[root@controller ~]# yum install openstack-nova-api openstack-nova-conductor openstack- nova-novncproxy openstack-nova-scheduler -y

修改nova配置文件:

#nova的配置文件/etc/nova/nova.conf
#使用脚本过滤一下配置文件
[root@controller ~]# ./filter.sh /etc/nova/nova.conf #修改配置文件
[root@controller ~]# cat /etc/nova/nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
my_ip = 10.163.1.101
[api]
auth_strategy = keystone
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[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 = nova
password = nova
[libvirt]
[metrics]
[mks]
[neutron]
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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 = placement
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
[workarounds]
[wsgi]
[xenserver]
[zvm]

生成nova-api数据库:

#生成nova-api的数据库里面的初始表
[root@controller ~]# su -s /bin/sh -c "nova-manage api_db sync" nova #验证
[root@controller ~]# mysql -unova -pNOVA_DBPASS -hcontroller -e 'use nova_api;' -e 'show tables;'
+------------------------------+
| Tables_in_nova_api           |
+------------------------------+
| aggregate_hosts              |
| aggregate_metadata           |
| aggregates                   |
| allocations                  |
| build_requests               |
| cell_mappings                |
| consumers                    |
| flavor_extra_specs           |
| flavor_projects              |
| flavors                      |
| host_mappings                |
| instance_group_member        |
| instance_group_policy        |
| instance_groups              |
| instance_mappings            |
| inventories                  |
| key_pairs                    |
| migrate_version              |
| placement_aggregates         |
| project_user_quotas          |
| projects                     |
| quota_classes                |
| quota_usages                 |
| quotas                       |
| request_specs                |
| reservations                 |
| resource_classes             |
| resource_provider_aggregates |
| resource_provider_traits     |
| resource_providers           |
| traits                       |
| users                        |
+------------------------------+

nova-cell操作:

#注册cell0的数据库
[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova #由于我们没有没有创建任何的1级cell,所以nova_cell0里面没有内容
[root@controller ~]# mysql -unova -pNOVA_DBPASS -hcontroller -e 'use nova_cell0;' -e 'show tables;' #创建一个名字为cell1的子cell
[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 -- verbose" nova
--transport-url not provided in the command line, using the value
[DEFAULT]/transport_url from the configuration file
--database_connection not provided in the command line, using the value [database]/connection from the configuration file
822b2f64-96c0-46ad-a749-8dbe5f110d0a
#由于我们在创建cell的时候没有指定消息队列服务器和数据库服务器,所以使用了我们配置文件中默认的值

同步nova的数据库:

#同步nova数据库,忽略错误输出
[root@controller ~]# su -s /bin/sh -c "nova-manage db sync" nova
/usr/lib/python3.6/site-packages/pymysql/cursors.py:165: Warning: (1831, 'Duplicate index `block_device_mapping_instance_uuid_virtual_name_device_name_idx`. This is deprecated and will be disallowed in a future release')
result = self._query(query) /usr/lib/python3.6/site-packages/pymysql/cursors.py:165: Warning: (1831, 'Duplicate index `uniq_instances0uuid`. This is deprecated and will be disallowed in a future release')
result = self._query(query) [root@controller ~]# echo $?
0#验证cell0数据库,由于之前我们做了nova到cell0数据库的映射,所以我们同步了nova的数据库也相当于同步了 cell0的数据库
[root@controller ~]# mysql -unova -pNOVA_DBPASS -hcontroller -e 'use nova_cell0;' -e 'show tables;'
+--------------------------------------------+
| Tables_in_nova_cell0 |
+--------------------------------------------+
| agent_builds |
| aggregate_hosts |
| aggregate_metadata |
| aggregates |
| allocations |
| block_device_mapping |
| bw_usage_cache |
| cells |
| certificates |
| compute_nodes |
| console_auth_tokens |
| console_pools |
| consoles |
| dns_domains |
| fixed_ips |
| floating_ips |
| instance_actions |
| instance_actions_events |
| instance_extra |
| instance_faults |
| instance_group_member |
| instance_group_policy |
| instance_groups |
| instance_id_mappings |
| instance_info_caches |
| instance_metadata |
| instance_system_metadata |
| instance_type_extra_specs |
| instance_type_projects |
| instance_types |
| instances |
| inventories |
| key_pairs |
| migrate_version |
| migrations |
| networks |
| pci_devices |
| project_user_quotas |
| provider_fw_rules |
| quota_classes |
| quota_usages |
| quotas |
| reservations |
| resource_provider_aggregates |
| resource_providers |
| s3_images |
| security_group_default_rules |
| security_group_instance_association |
| security_group_rules |
| security_groups |
| services |
| shadow_agent_builds |
| shadow_aggregate_hosts |
| shadow_aggregate_metadata |
| shadow_aggregates |
| shadow_block_device_mapping |
| shadow_bw_usage_cache |
| shadow_cells |
| shadow_certificates |
| shadow_compute_nodes |
| shadow_console_pools |
| shadow_consoles |
| shadow_dns_domains |
| shadow_fixed_ips |
| shadow_floating_ips |
| shadow_instance_actions |
| shadow_instance_actions_events |
| shadow_instance_extra |
| shadow_instance_faults |
| shadow_instance_group_member |
| shadow_instance_group_policy |
| shadow_instance_groups |
| shadow_instance_id_mappings |
| shadow_instance_info_caches |
| shadow_instance_metadata |
| shadow_instance_system_metadata |
| shadow_instance_type_extra_specs |
| shadow_instance_type_projects |
| shadow_instance_types |
| shadow_instances |
| shadow_key_pairs |
| shadow_migrate_version |
| shadow_migrations |
| shadow_networks |
| shadow_pci_devices |
| shadow_project_user_quotas |
| shadow_provider_fw_rules |
| shadow_quota_classes |
| shadow_quota_usages |
| shadow_quotas |
| shadow_reservations |
| shadow_s3_images |
| shadow_security_group_default_rules |
| shadow_security_group_instance_association |
| shadow_security_group_rules |
| shadow_security_groups |
| shadow_services |
| shadow_snapshot_id_mappings |
| shadow_snapshots |
| shadow_task_log |
| shadow_virtual_interfaces |
| shadow_volume_id_mappings |
| shadow_volume_usage_cache |
| snapshot_id_mappings |
| snapshots | | tags |
| task_log |
| virtual_interfaces |
| volume_id_mappings |
| volume_usage_cache |
+--------------------------------------------+ #验证nova的数据库
[root@controller ~]# mysql -unova -pNOVA_DBPASS -hcontroller -e 'use nova;' -e 'show tables;'
+--------------------------------------------+
| Tables_in_nova |
+--------------------------------------------+
| agent_builds |
| aggregate_hosts |
| aggregate_metadata |
| aggregates |
| allocations |
| block_device_mapping |
| bw_usage_cache |
| cells |
| certificates |
| compute_nodes |
| console_auth_tokens |
| console_pools |
| consoles |
| dns_domains |
| fixed_ips |
| floating_ips |
| instance_actions |
| instance_actions_events |
| instance_extra |
| instance_faults |
| instance_group_member |
| instance_group_policy |
| instance_groups |
| instance_id_mappings |
| instance_info_caches |
| instance_metadata |
| instance_system_metadata |
| instance_type_extra_specs |
| instance_type_projects |
| instance_types |
| instances |
| inventories |
| key_pairs |
| migrate_version |
| migrations |
| networks |
| pci_devices |
| project_user_quotas |
| provider_fw_rules |
| quota_classes |
| quota_usages |
| quotas |
| reservations |
| resource_provider_aggregates |
| resource_providers |
| s3_images |
| security_group_default_rules |
| security_group_instance_association |
| security_group_rules |
| security_groups |
| services |
| shadow_agent_builds |
| shadow_aggregate_hosts |
| shadow_aggregate_metadata |
| shadow_aggregates |
| shadow_block_device_mapping |
| shadow_bw_usage_cache |
| shadow_cells |
| shadow_certificates |
| shadow_compute_nodes |
| shadow_console_pools |
| shadow_consoles |
| shadow_dns_domains |
| shadow_fixed_ips |
| shadow_floating_ips |
| shadow_instance_actions |
| shadow_instance_actions_events |
| shadow_instance_extra |
| shadow_instance_faults |
| shadow_instance_group_member |
| shadow_instance_group_policy |
| shadow_instance_groups |
| shadow_instance_id_mappings |
| shadow_instance_info_caches |
| shadow_instance_metadata |
| shadow_instance_system_metadata |
| shadow_instance_type_extra_specs |
| shadow_instance_type_projects |
| shadow_instance_types |
| shadow_instances |
| shadow_key_pairs |
| shadow_migrate_version |
| shadow_migrations |
| shadow_networks |
| shadow_pci_devices |
| shadow_project_user_quotas |
| shadow_provider_fw_rules |
| shadow_quota_classes |
| shadow_quota_usages |
| shadow_quotas |
| shadow_reservations |
| shadow_s3_images |
| shadow_security_group_default_rules |
| shadow_security_group_instance_association |
| shadow_security_group_rules |
| shadow_security_groups |
| shadow_services |
| shadow_snapshot_id_mappings |
| shadow_snapshots |
| shadow_task_log |
| shadow_virtual_interfaces |
| shadow_volume_id_mappings |
| shadow_volume_usage_cache |
| snapshot_id_mappings |
| snapshots |
| tags |
| task_log |
| virtual_interfaces |
| volume_id_mappings |
| volume_usage_cache |
+--------------------------------------------+

启动控制节点的nova服务:

#启动服务
[root@controller ~]# systemctl enable openstack-nova-api.service openstack-nova- scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service -- now #查看服务的状态
[root@controller ~]# systemctl status openstack-nova-api.service openstack-nova- scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
● openstack-nova-api.service - OpenStack Nova API Server
Loaded: loaded (/usr/lib/systemd/system/openstack-nova-api.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-09-23 17:13:37 CST; 24s ago
Main PID: 16212 (nova-api)
Tasks: 9 (limit: 26213)
Memory: 368.5M
CGroup: /system.slice/openstack-nova-api.service
├─16212 /usr/bin/python3 /usr/bin/nova-api
├─16233 /usr/bin/python3 /usr/bin/nova-api
├─16234 /usr/bin/python3 /usr/bin/nova-api
├─16235 /usr/bin/python3 /usr/bin/nova-api
├─16236 /usr/bin/python3 /usr/bin/nova-api
├─16237 /usr/bin/python3 /usr/bin/nova-api
├─16238 /usr/bin/python3 /usr/bin/nova-api
├─16239 /usr/bin/python3 /usr/bin/nova-api
└─16240 /usr/bin/python3 /usr/bin/nova-api Sep 23 17:13:32 controller systemd[1]: Starting OpenStack Nova API Server...
Sep 23 17:13:37 controller systemd[1]: Started OpenStack Nova API Server.● openstack-nova-scheduler.service - OpenStack Nova Scheduler Server
Loaded: loaded (/usr/lib/systemd/system/openstack-nova-scheduler.service; enabled;
vendor preset: disabled)
Active: active (running) since Wed 2020-09-23 17:13:43 CST; 19s ago
Main PID: 16213 (nova-scheduler)
Tasks: 5 (limit: 26213)
Memory: 189.2M
CGroup: /system.slice/openstack-nova-scheduler.service
├─16213 /usr/bin/python3 /usr/bin/nova-scheduler
├─16266 /usr/bin/python3 /usr/bin/nova-scheduler
├─16267 /usr/bin/python3 /usr/bin/nova-scheduler
├─16268 /usr/bin/python3 /usr/bin/nova-scheduler
└─16269 /usr/bin/python3 /usr/bin/nova-scheduler Sep 23 17:13:32 controller systemd[1]: Starting OpenStack Nova Scheduler Server...
Sep 23 17:13:43 controller systemd[1]: Started OpenStack Nova Scheduler Server. ● openstack-nova-conductor.service - OpenStack Nova Conductor Server
Loaded: loaded (/usr/lib/systemd/system/openstack-nova-conductor.service; enabled;
vendor preset: disabled)
Active: active (running) since Wed 2020-09-23 17:13:39 CST; 22s ago
Main PID: 16214 (nova-conductor)
Tasks: 5 (limit: 26213)
Memory: 336.4M
CGroup: /system.slice/openstack-nova-conductor.service
├─16214 /usr/bin/python3 /usr/bin/nova-conductor
├─16253 /usr/bin/python3 /usr/bin/nova-conductor
├─16254 /usr/bin/python3 /usr/bin/nova-conductor
├─16255 /usr/bin/python3 /usr/bin/nova-conductor
└─16256 /usr/bin/python3 /usr/bin/nova-conductor
Sep 23 17:13:32 controller systemd[1]: Starting OpenStack Nova Conductor Server...
Sep 23 17:13:39 controller systemd[1]: Started OpenStack Nova Conductor Server. ● openstack-nova-novncproxy.service - OpenStack Nova NoVNC Proxy Server
Loaded: loaded (/usr/lib/systemd/system/openstack-nova-novncproxy.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2020-09-23 17:13:32 CST; 29s ago
Main PID: 16215 (nova-novncproxy)
Tasks: 1 (limit: 26213)
Memory: 94.7M
CGroup: /system.slice/openstack-nova-novncproxy.service
└─16215 /usr/bin/python3 /usr/bin/nova-novncproxy --web /usr/share/novnc/ Sep 23 17:13:32 controller systemd[1]: Started OpenStack Nova NoVNC Proxy Server. #查看上述进程监听的端口
[root@controller ~]# netstat -tunlp | grep 16212
tcp 0 0 0.0.0.0:8774 0.0.0.0:* LISTEN
16212/python3
tcp 0 0 0.0.0.0:8775 0.0.0.0:* LISTEN
16212/python3
[root@controller ~]# netstat -tunlp | grep 16213
[root@controller ~]# netstat -tunlp | grep 16214
[root@controller ~]# netstat -tunlp | grep 16215
tcp 0 0 0.0.0.0:6080 0.0.0.0:* LISTEN
16215/python3 #由于nova-sechduler和nova-conductor只是通过消息队列通信,所以不需要监听端口。但是nova-api和 novncproxy需要通过rest api通信,所以需要监听端口。

十、计算节点的nova安装

1、计算节点基础配置

#主机名配置
[root@eveng-home ~]# ssh 10.163.3.102
[root@localhost ~]# hostnamectl set-hostname compute1
[root@localhost ~]# exit
[root@eveng-home ~]# ssh 10.163.3.102
[root@compute1 ~]# [root@eveng-home ~]# ssh 10.163.3.103
[root@localhost ~]# hostnamectl set-hostname compute2
[root@localhost ~]# exit
[root@eveng-home ~]# ssh 10.163.3.103
[root@compute2 ~]# #解析配置
[root@controller ~]# scp /etc/hosts 10.163.3.102:/etc/hosts
[root@controller ~]# scp /etc/hosts 10.163.3.103:/etc/hosts
[root@compute1 ~]# ping -c 1 controller
PING controller (10.163.3.101) 56(84) bytes of data.
64 bytes from controller (10.163.3.101): icmp_seq=1 ttl=64 time=0.456 ms [root@compute2 ~]# ping -c 1 controller
PING controller (10.163.3.101) 56(84) bytes of data.
64 bytes from controller (10.163.3.101): icmp_seq=1 ttl=64 time=0.456 ms

2、计算节点的软件仓库配置

#由于计算节点安装需要一些虚拟化组件,如果更换到国内的源安装会有软件版本差异的问题(截止2020年9月23号)
[root@compute1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@compute1 ~]# setenforce 0
[root@compute1 ~]# systemctl disable firewalld --now [root@compute2 ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@compute2 ~]# setenforce 0
[root@compute2 ~]# systemctl disable firewalld --now #配置软件仓库,在centos8缺省的仓库中做如下设置
[root@compute1 ~]# yum install centos-release-openstack-ussuri -y
[root@compute1 ~]# yum config-manager --set-enabled PowerTools [root@compute2 ~]# yum install centos-release-openstack-ussuri -y
[root@compute2 ~]# yum config-manager --set-enabled PowerTools

计算节点软件包安装:

[root@compute1 ~]# yum install openstack-nova-compute -y
[root@compute2 ~]# yum install openstack-nova-compute -y

3、配置文件修改

[root@controller ~]# scp filter.sh 10.163.3.102:~
[root@controller ~]# scp filter.sh 10.163.3.103:~
[root@compute1 ~]# ./filter.sh /etc/nova/nova.conf
[root@compute2 ~]# ./filter.sh /etc/nova/nova.conf #compute1的配置文件
[root@compute1 ~]# cat /etc/nova/nova.conf
[DEFAULT]
my_ip = 10.163.3.102
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@controller
[api]
auth_strategy = keystone
[api_database]
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[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 = nova
password = nova
[libvirt]
virt_type = kvm
[metrics]
[mks]
[neutron]
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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 = placement
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
[workarounds]
[wsgi]
[xenserver]
[zvm] #compute2的配置文件
[root@compute2 ~]# cat /etc/nova/nova.conf
[DEFAULT]
my_ip = 10.163.3.103
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@controller
[api]
auth_strategy = keystone
[api_database]
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[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 = nova
password = nova
[libvirt]
virt_type = kvm
[metrics]
[mks]
[neutron]
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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 = placement
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
[workarounds]
[wsgi]
[xenserver]
[zvm]

4、启动服务

[root@compute1 ~]# systemctl enable libvirtd.service openstack-nova-compute.service -- now
[root@compute2 ~]# systemctl enable libvirtd.service openstack-nova-compute.service -- now

5、在控制节点上查看计算服务

[root@controller ~]# openstack compute service list
+----+----------------+------------+----------+---------+-------+---------------------- ------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+----------------+------------+----------+---------+-------+---------------------- ------+
| 6 | nova-conductor | controller | internal | enabled | up | 2020-09- 23T09:52:15.000000 | | 7 | nova-scheduler | controller | internal | enabled | up | 2020-09- 23T09:52:08.000000 | | 9 | nova-compute | compute1 | nova | enabled | up | 2020-09- 23T09:52:09.000000 | | 10 | nova-compute | compute2 | nova | enabled | up | 2020-09- 23T09:52:10.000000 |
+----+----------------+------------+----------+---------+-------+---------------------- ------+ #如果是没有nova-cell的版本此时就算完成。但是由于有了nova-cell,我们需要将计算节点映射到nova-cell中

6、控制节点nova-cell操作

[root@controller ~]# nova-manage cell_v2 list_hosts
+-----------+-----------+----------+
| Cell Name | Cell UUID | Hostname |
+-----------+-----------+----------+
+-----------+-----------+----------+ [root@controller ~]# nova-manage cell_v2 list_cells
+-------+--------------------------------------+---------------------------------------
---+-------------------------------------------------+----------+
| Name | UUID | Transport URL | Database Connection | Disabled |
+-------+--------------------------------------+--------------------------------------- ---+-------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@controller/nova_cell0 | False |
| cell1 | 822b2f64-96c0-46ad-a749-8dbe5f110d0a | rabbit://openstack:****@controller:5672/ | mysql+pymysql://nova:****@controller/nova | False |
+-------+--------------------------------------+--------------------------------------- ---+-------------------------------------------------+----------+ #使用nova_cell的自动发现,如果你不用nova_cell的自动发现,你需要手工将计算节点一个一个的映射到对应的 cell中
[root@controller ~]# nova-manage cell_v2 map_cell_and_hosts ...... #由于我们是一个lab环境,我们就是用自动发现,自动映射
[root@controller ~]# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 822b2f64-96c0-46ad-a749-8dbe5f110d0a
Checking host mapping for compute host 'compute1': f678d0f9-83d5-49ef-9aea-8dc1f59caca6
Creating host mapping for compute host 'compute1': f678d0f9-83d5-49ef-9aea-8dc1f59caca6
Checking host mapping for compute host 'compute2': feeacaf5-2784-4462-b22e-5b4a5aa6c5f3
Creating host mapping for compute host 'compute2': feeacaf5-2784-4462-b22e-5b4a5aa6c5f3
Found 2 unmapped computes in cell: 822b2f64-96c0-46ad-a749-8dbe5f110d0a [root@controller ~]# nova-manage cell_v2 list_hosts
+-----------+--------------------------------------+----------+
| Cell Name | Cell UUID                            | Hostname |
+-----------+--------------------------------------+----------+
| cell1     | 822b2f64-96c0-46ad-a749-8dbe5f110d0a | compute1 |
| cell1     | 822b2f64-96c0-46ad-a749-8dbe5f110d0a | compute2 |
+-----------+--------------------------------------+----------+

7、在控制节点上验证nova的安装

[root@controller ~]# nova-status upgrade check
+------------------------------------+
| Upgrade Check Results              |
+------------------------------------+
| Check: Cells v2                    |
| Result: Success                    |
| Details: None                      |
+------------------------------------+
| Check: Placement API               |
| Result: Success                    |
| Details: None                      |
+------------------------------------+
| Check: Ironic Flavor Migration     |
| Result: Success                    |
| Details: None                      |
+------------------------------------+
| Check: Cinder API                  |
| Result: Success                    |
| Details: None                      |
+------------------------------------+
| Check: Policy Scope-based Defaults |
| Result: Success                    |
| Details: None                      |
+------------------------------------+#如果出现上述结果就说明安装成功 #我们没有办法通过创建虚拟机来验证nova是否安装完成,因为创建实例我们还缺少了一个neutron核心组件。

十一、网络组件Neutron

1、Neutron简介

neutron是openstack中实现网络功能的组件,neutron的log十分形象,蜘蛛网你就可以理解为复杂的网络。

openstack neutron是一个在虚拟化计算环境下以实现网络作为服务(NaaS)终极目标的SDN网络项目。SDN(software Defined network)叫做软件定义网络。

neutron是openstack中提供网络资源的组件,他提供网络的实现方式依赖了linux中很多的技术,如果对linux实现网络虚拟化的工具很熟悉那么将会很好学习neutron。

最常见的linux中的虚拟网络实现方式就是linux的网桥(bridge),但是不仅仅只是网桥,还涉及到很多其他的虚拟化网络技术。

2、Neutron功能

neutron通过它的组件实现了“虚拟交换机”来提供二层功能和“虚拟路由器”来提供三层功能,除此之外neutron还有组件能实现防火墙,负载均衡器,qos这种高级网络功能。

neutron实现二层功能使用了linuxbridge或者openvswitch(ovs),neutron实现3层功能实际上是通过linux的路由转发功能实现的。我们目前说的neutron是不带SDN的,如果带SDN则需要使用对应的SDN Driver和SDN的plugin。

由于网络不仅仅是2层技术和3层技术就能包含的,所以neutron还提供了4层的功能(一般来说就是防火墙功能)。

neutron的高级防火墙实现方式叫做FWaaS(firewall as a service)

neutron的负载均衡实现方式叫做LBaaS(load balancer as a service)

3、Neutron架构

不要被neutron的架构图吓到。neutron里面仅仅是driver和agent多,其实neutron组件非常简单。

neutron的组件就4个:

  1. neutron server(整个neutron组件的入口)
  2. message queue(neutron组件内部调度的消息队列)
  3. core plugin(核心插件,用于实现基础的二层网络功能)
  4. service plugin(服务插件,用于实现高级的网络功能)
  5. neutron db(用于存放neutron的信息)

4、Neutron组件

1. neutron server

neutron-server可以理解为类似于nova-api那样的一个组件,一个专门用来接收neutron REST API调用的服务器。负责将不同的rest api发送到不同的neutron-plugin。

简单来说,neutron-server就是用来收发api的。

2. message queue

neutron组件也分为两部分,一部分是安装在网络节点的,一部分是安装在计算节点的,所有的计算节点已经会安装neutron,只不过计算节点使用neutron只是方便被neutron的控制端所管理进而配置计算节点上的虚拟机网络。

所以由于所有的计算节点都安装neutron,就意味着随着计算节点数量的增加,面临了和nova一样的性能问题。采用了 nova cell之后,neutron的消息队列性能得以改善。

3. core plugins

neutron最核心的功能是通过core plugins来实现的。顾名思义,core plugins叫做核心插件。core plugins的功能只有一个目标,就是实现二层网络的基础模型。二层网络的实现方式有很多种,flat,vlan,gre,vxlan,geneve(和gre类似,在ip头部上更适合扩展)。

neutron的核心插件默认是ML2(Moduler Layer 2),当然你也可以使用厂商开发的三方的插件,用于实现和ML2一样的功能。

以后谈到neutron的core plugins指的就是ML2。

neutron的ML2提供了两种类型的驱动,一种叫做Mechanism Drivers(机制驱动),一种叫做Type Drivers(类型驱动)。机制驱动表示neutron的底层是通过什么来实现二层网络通信的,类型驱动表示netron的二 层网络的实现模式。

Mechanism Drivers最常用的就是linuxbridge和openvswitch。在openstack中二层网络通信使用的是有基础二层功能的linux的网桥还是有高级功能的openvswitch取决于Mechanism Drivers的设置。除了 linuxbridge和openvswitch之外,你还可以使用厂商的三方驱动,比如像cisco这样的网络厂商就有针对openstack的neutron开发的专门的驱动。L2population机制驱动是用来解决大二层网络中arp泛洪问题的一个驱动,一般来说这个L2population和gre,vxlan,geneve等实现大二层隧道技术的网络类型一起使用。

Type Drivers描述的是你的二层网络的实现模式,支持的二层网络类型如下:

虚拟机的流量分为东西流量(虚拟机在数据中心内部通信的流量)和南北流量(虚拟机和数据中心外通信的流量)。

Local:虚拟机只能在本地的计算节点内实现网络通信,不能实现跨节点的虚拟机通信。

Flat:虚拟机可以实现跨节点的网络通信,当然也可以实现计算节点内的通信,但是你的通信网络数量取决于你的物理网络,一个物理网卡只能创建一个flat类型的网络。

VLAN:使用手段最多的一种二层网络实现,他相当于flat网络的扩展,你通过使用vlan可以在一个物理网卡上创建多个vlan的网络。

VXLAN:是在SDN中使用手段最多一种隧道二层网络实现。

GRE:也是实现二层网络的隧道技术。

Geneve:和GRE是类似的,而且相比于GRE和VXLAN在IP头部更具扩展性,但是本质上也是隧道技术。

4. service plugin

neutron的service plguin是用于实现除了2层网络之外的所有高级的网络功能组件,比如3层的路由功能,比如 fwaas,vpnaas,lbaas,qos。比较常用的service plugin就是L3 service,qos service,fwaas service。除了开源的版本自带的服务插件,你还可以使用厂商的开发的service plugin来实现针对厂商所提供的额外功能的实现。一般来说厂商的service plguin都是为了SDN控制器通信而设计的。

service plguin复杂段远远超过core plguin

5. neutron db

Neutron db里面存放了网络资源的信息,比如network,subnet,ip,mac地址,port,router等等。

6. neutron agent

agent是低级打工仔,是给neutron plugin干活的,比如客户端需要创建一个网络(network),core plugin ML2(包工头)将这个活承包下来,具体ML2会指挥L2 agent来干这个活,所以说L2 agent是比包工头ML2更低级的打工仔。

在这里我说的低级,对应是其实是底层实现,换句话说就是neutron plugin组件让网络功能得到支持,agent是具体去落实这个网络功能的组件。

如果你使用了openvswitch作为Mechanism Drivers,那么底层的二层交换机实现使用的agent就是neutron-openvswitch-agent,如果你使用了linuxbridge作为Mechanism Drivers,那么底层的二层交换机实现使用的agent就是neutron-linuxbridge-agent。

core plugin实现基础二层功能的叫做L2 agent(无论是ovs还是linuxbridge)

core plugin除了有二层交换机的agent,还有实现dhcp-server的agnet叫做neutron-dhcp-agent。

core plugin还有实现元数据通信的matadata agent叫做neutron-matadata-agent

service plugin中的router插件实现了neutron的3层功能,为了能实现neutron的3层功能,router插件提供了L3 agent

neutron的问题是底层功能实现全部依赖于agent,agent是整个neutron中干活最多的那个组件,agent是受plugin所支持的。由于neutron中有大量的service plugin所以neutron有非常多的agent,而且计算节点上一定会有L2 agent,随着计算节点数量的增加,L2 agent越来越多,会给neutron造成性能问题。目前这是一个难以解决的问题,因为它的架构设计就是这样。但是在SDN的解决方案中,去掉了很多agent,取而代之的是将agent的功能集成到了SDN控制器里面,通过SDN来实现对应的agent功能。

十二、安装网络节点分离部署

1、网络拓扑

network-node:10.163.3.104。

2、控制节点上的操作

在控制节点创建neutron的DB:

[root@controller ~]# mysql -e "CREATE DATABASE neutron;"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';"
[root@controller ~]# mysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';"
[root@controller ~]# mysql -e "flush privileges;"

创建endpoint:

#加载凭据
[root@controller ~]# source openrc #创建用户
[root@controller ~]# openstack user create --domain default --password neutron neutron
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 4c1ca51a542e4fc4ba7ee36c6a4b4305 |
| name                | neutron                          |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+ #授权
[root@controller ~]# openstack role add --project service --user neutron admin #创建neutron service
[root@controller ~]# openstack service create --name neutron --description "OpenStack Networking" network
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Networking             |
| enabled     | True                             |
| id          | 2c0094b44dba4fde93e42942384c078c |
| name        | neutron                          |
| type        | network                          |
+-------------+----------------------------------+ #创建endpoint
[root@controller ~]# openstack endpoint create --region RegionOne network public http://10.163.3.104:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 82b5f75a524542f29318b2bb6ff619d5 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2c0094b44dba4fde93e42942384c078c |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://10.163.3.104:9696         |
+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne network internal http://10.163.3.104:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 193c5a404aab47ac8e5a9212ccac9413 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2c0094b44dba4fde93e42942384c078c |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://10.163.3.104:9696         |+--------------+----------------------------------+ [root@controller ~]# openstack endpoint create --region RegionOne network admin http://10.163.3.104:9696
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | c8d4c887d4664cc5b72ce52270c147a7 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2c0094b44dba4fde93e42942384c078c |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://10.163.3.104:9696         |
+--------------+----------------------------------+

3、安装网络节点

基础配置:

#主机名配置
[root@eveng-home ~]# ssh 10.163.3.104
[root@localhost ~]# hostnamectl set-hostname network
[root@localhost ~]# exit
[root@eveng-home ~]# ssh 10.163.3.104
[root@network ~]# #解析配置
[root@network ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.163.3.101 controller #防火墙和selinux配置
[root@network ~]# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config [root@network ~]# setenforce 0
[root@network ~]# systemctl disable firewalld --now #软件仓库的配置
[root@network ~]# rm -rf /etc/yum.repos.d/*
[root@network ~]# cat /etc/yum.repos.d/repo.repo
[baseos]
name=baseos
baseurl=http://mirrors.163.com/centos/8/BaseOS/x86_64/os/
gpgcheck=0
[appstream]
name=appstream
baseurl=http://mirrors.163.com/centos/8/AppStream/x86_64/os/
gpgcheck=0
[powertools]
name=powertools
baseurl=http://mirrors.163.com/centos/8/PowerTools/x86_64/os/
gpgcheck=0
[cloud-u]
name=cloud-u
baseurl=http://mirrors.163.com/centos/8/cloud/x86_64/openstack-ussuri/
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/8/Everything/x86_64/
gpgcheck=0
[rabbitmq]
name=rabbitmq baseurl=http://mirrors.163.com/centos/8/messaging/x86_64/rabbitmq-38/ gpgcheck=0

安装网络节点软件:

我们安装的软件是openstack-neutron-linuxbridge,所以机制驱动使用的linuxbridge,如果你想在机制驱 动使用openvswitch你需要安装openstack-neutron-openvswitch。

openstack-neutron-ml2提供了ml2插件:

[root@network ~]# yum install openstack-neutron openstack-neutron-ml2 openstack- neutron-linuxbridge ebtables -y

4、修改neutron的配置文件

修改neutron server的配置文件:

#配置文件过滤脚本
[root@controller ~]# scp filter.sh 10.163.3.104:~ #过滤配置文件
[root@network ~]# ./filter.sh /etc/neutron/neutron.conf
[root@network ~]# cat /etc/neutron/neutron.conf | wc -l
13#修改neutron server的配置文件
[root@network ~]# cat /etc/neutron/neutron.conf
[DEFAULT]
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
[cors]
[database]
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@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 = neutron
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[privsep]
[ssl]
[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 = nova

修改ml2配置文件:

[root@network ~]# ./filter.sh /etc/neutron/plugins/ml2/ml2_conf.ini
[root@network ~]# cat /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
[ml2]
mechanism_drivers = linuxbridge,l2population
type_drivers = local,flat,vlan,vxlan
extension_drivers = port_security
tenant_network_types = local
[securitygroup]
enable_ipset = true

修改L2 agent配置文件:

#由于我们安装的是openstack-neutron-linuxbridge,所以我们目前只支持使用linuxbridge作为L2 agent
[root@network ~]# ./filter.sh /etc/neutron/plugins/ml2/linuxbridge_agent.ini [root@network ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false#加载br_netfilter模块,让linux内核可以通过linux的网桥实现iptables的相关策略
[root@network ~]# modprobe br_netfilter
[root@network ~]# cat /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1 [root@network ~]# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

修改L3 agent的配置文件:

[root@network ~]# ./filter.sh /etc/neutron/l3_agent.ini
[root@network ~]# cat /etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = linuxbridge

修改dhcp agent的配置文件:

[root@network ~]# ./filter.sh /etc/neutron/dhcp_agent.ini
[root@network ~]# cat /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

修改metadata agent的配置文件:

#元数据的agent是专门提供一个元数据代理服务来动态注入虚拟机实例的配置,一般都是和cloud-init结合。
[root@network ~]# ./filter.sh /etc/neutron/metadata_agent.ini
[root@network ~]# cat /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = controller
metadata_proxy_shared_secret = METADATA_SECRET
[cache]

做配置文件软链接:

[root@network ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini [root@network ~]# ls -l /etc/neutron/plugin.ini
lrwxrwxrwx. 1 root root 37 Sep 24 11:19
/etc/neutron/plugin.ini -> /etc/neutron/plugins/ml2/ml2_conf.ini #这步的目的和neutron的安装没有关系,由于安装包关于neutron-server的服务启动文件设置的ml2配置文件指定 的是/etc/neutron/plugin.ini,所以我们做了一个软链接指向了真正的ml2的配置为文件
[root@network ~]# cat /usr/lib/systemd/system/neutron-server.service
[Unit]
Description=OpenStack Neutron Server
After=syslog.target network.target [Service]
Type=notify
User=neutron
ExecStart=/usr/bin/neutron-server --config-file /usr/share/neutron/neutron-dist.conf -- config-dir /usr/share/neutron/server --config-file /etc/neutron/neutron.conf --config- file /etc/neutron/plugin.ini --config-dir /etc/neutron/conf.d/common --config-dir /etc/neutron/conf.d/neutron-server --log-file /var/log/neutron/server.log
PrivateTmp=true
NotifyAccess=all
KillMode=process
Restart=on-failure
TimeoutStartSec=0 [Install]
WantedBy=multi-user.target

5、生成neutron的db并启动服务

生成neutron的数据库:

[root@network ~]# 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

启动neutron的所有服务:

[root@network ~]# systemctl enable neutron-server.service neutron-linuxbridge-
agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-
agent.service --now #查看监听端口
[root@network ~]# systemctl status neutron-server.service neutron-linuxbridge-
agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-
agent.service | grep 'Main PID' Main PID: 27339 (/usr/bin/python)
Main PID: 27841 (/usr/bin/python)
Main PID: 27341 (/usr/bin/python)
Main PID: 27342 (/usr/bin/python)
Main PID: 27343 (/usr/bin/python) #除了neutron-server之外,其他的所有服务都不依赖于rest api
[root@network ~]# netstat -tunlp | grep 27339
tcp 0 0 0.0.0.0:9696 0.0.0.0:* LISTEN
27339/server.log
[root@network ~]# netstat -tunlp | grep 27841
[root@network ~]# netstat -tunlp | grep 27341
[root@network ~]# netstat -tunlp | grep 27342
[root@network ~]# netstat -tunlp | grep 27343

6、检查agent是否正常

#在带有客户端的节点上检查都是可以的,前提是必须要连接到keystone
[root@controller ~]# openstack network agent list
+--------------------------------------+--------------------+---------+---------------- ---+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+---------+---------------- ---+-------+-------+---------------------------+
| 4e0f8732-7428-4556-bd0b-8d65229ad581 | Linux bridge agent | network | None | :-) | UP | neutron-linuxbridge-agent |
| b752dd59-21d8-46ef-9687-c3c570bf71dc | Metadata agent | network | None | :-) | UP | neutron-metadata-agent |
| bece0070-5f15-40db-9b4c-26f05a522ec9 | L3 agent | network | nova | :-) | UP | neutron-l3-agent |
| c7cb2c7f-96ec-4afa-bb75-82568a577e14 | DHCP agent | network | nova | :-) | UP | neutron-dhcp-agent |
+--------------------------------------+--------------------+---------+---------------- ---+-------+-------+---------------------------| #如果能看到所有的agent是笑脸的状态,此时我们的网络节点已经部署成功。

7、配置nova连接neutron

修改nova配置文件连接neutron:

#此步骤是在控制节点上 #我们在[neutron]部分进行了配置添加
[root@controller ~]# cat /etc/nova/nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@controller:5672/
my_ip = 10.163.1.101
[api]
auth_strategy = keystone
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[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 = nova
password = nova
[libvirt]
[metrics]
[mks]
[neutron]
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 = neutron
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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 = placement
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = $my_ip
server_proxyclient_address = $my_ip
[workarounds]
[wsgi]
[xenserver]
[zvm]

重启控制节点的nova服务:

[root@controller ~]# systemctl restart openstack-nova-api.service
#日志文件/var/log/nova/nova-api.log

8、配置计算节点的neutron

安装软件包:
[root@compute1 ~]# yum install openstack-neutron-linuxbridge ebtables ipset -y
[root@compute2 ~]# yum install openstack-neutron-linuxbridge ebtables ipset -y

修改neutron的通用配置文件:

[root@compute1 ~]# ./filter.sh /etc/neutron/neutron.conf
[root@compute1 ~]# cat /etc/neutron/neutron.conf
[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
[cors]
[database]
[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 = neutron
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[privsep]
[ssl] [root@compute2 ~]# ./filter.sh /etc/neutron/neutron.conf
[root@compute2 ~]# cat /etc/neutron/neutron.conf
[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
auth_strategy = keystone
[cors]
[database]
[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 = neutron
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[privsep]
[ssl]

修改L2 agent的配置文件:

#在计算节点上通常情况下只需要配置L2 agent,其他的agent在网络节点上
[root@compute1 ~]# ./filter.sh /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[root@compute1 ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false [root@compute2 ~]# ./filter.sh /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[root@compute2 ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan] enable_vxlan = false #加载br_netfilter模块,让linux内核可以通过linux的网桥实现iptables的相关策略
[root@compute1 ~]# modprobe br_netfilter
[root@compute1 ~]# cat /etc/sysctl.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1
[root@compute1 ~]# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1 #加载br_netfilter模块,让linux内核可以通过linux的网桥实现iptables的相关策略
[root@compute2 ~]# modprobe br_netfilter
[root@compute2 ~]# cat /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@compute2 ~]# sysctl -p
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

启动L2 agent服务:

[root@compute1 ~]# systemctl enable neutron-linuxbridge-agent.service --now
[root@compute2 ~]# systemctl enable neutron-linuxbridge-agent.service --now

验证计算节点的L2 agent:

[root@controller ~]# openstack network agent list
+--------------------------------------+--------------------+----------+--------------- ----+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |+--------------------------------------+--------------------+----------+--------------- ----+-------+-------+---------------------------+
| 0699e0dd-6b39-4358-b5eb-f5c49a0148cc | Linux bridge agent | compute2 | None | :-) | UP | neutron-linuxbridge-agent |
| 4e0f8732-7428-4556-bd0b-8d65229ad581 | Linux bridge agent | network | None | :-) | UP | neutron-linuxbridge-agent |
| 688449b0-b4c7-49a5-98bf-20e43319824b | Linux bridge agent | compute1 | None | :-) | UP | neutron-linuxbridge-agent |
| b752dd59-21d8-46ef-9687-c3c570bf71dc | Metadata agent | network | None | :-) | UP | neutron-metadata-agent |
| bece0070-5f15-40db-9b4c-26f05a522ec9 | L3 agent | network | nova | :-) | UP | neutron-l3-agent |
| c7cb2c7f-96ec-4afa-bb75-82568a577e14 | DHCP agent | network | nova | :-) | UP | neutron-dhcp-agent |
+--------------------------------------+--------------------+----------+--------------- ----+-------+-------+---------------------------+

配置nova访问neutron:

#配置计算节点的nova访问neutron,在[neutron]下面添加如下内容
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 = neutron
[root@compute1 ~]# cat /etc/nova/nova.conf
[DEFAULT] my_ip = 10.163.3.102
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@controller
[api]
auth_strategy = keystone
[api_database]
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[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 = nova
password = nova
[libvirt]
virt_type = kvm
[metrics]
[mks]
[neutron]
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 = neutron
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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 = placement
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
[workarounds]
[wsgi]
[xenserver]
[zvm]
[root@compute2 ~]# cat /etc/nova/nova.conf
[DEFAULT]
my_ip = 10.163.3.103
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:RABBIT_PASS@controller
[api]
auth_strategy = keystone
[api_database]
[barbican]
[cache]
[cinder]
[compute]
[conductor]
[console]
[consoleauth]
[cors]
[cyborg]
[database]
[devices]
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_cache]
[ironic]
[key_manager]
[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 = nova
password = nova
[libvirt]
virt_type = kvm
[metrics]
[mks]
[neutron]
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 = neutron
[notifications]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[pci]
[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 = placement
[powervm]
[privsep]
[profiler]
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[upgrade_levels]
[vault]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled = true
server_listen = 0.0.0.0
server_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
[workarounds]
[wsgi]
[xenserver]
[zvm]

重启nova服务:

[root@compute1 ~]# systemctl restart openstack-nova-compute.service
[root@compute2 ~]# systemctl restart openstack-nova-compute.service
[root@controller ~]# openstack compute service list
+----+----------------+------------+----------+---------+-------+---------------------- ------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+----------------+------------+----------+---------+-------+---------------------- ------+
| 6 | nova-conductor | controller | internal | enabled | up | 2020-09- 24T04:07:42.000000 | | 7 | nova-scheduler | controller | internal | enabled | up | 2020-09- 24T04:07:46.000000 | | 9 | nova-compute | compute1 | nova | enabled | up | 2020-09- 24T04:07:41.000000 |
| 10 | nova-compute | compute2 | nova | enabled | up | 2020-09- 24T04:07:41.000000 |+----+----------------+------------+----------+---------+-------+---------------------- ------+

十三、OpenStack Horizon安装

1、安装软件

#dashboard图形界面就安装在控制节点
[root@controller ~]# yum install openstack-dashboard -y

2、horizon图形配置文件修改

#openstack的图形设置/etc/openstack-dashboard/local_settings,由于openstack的组件非常多,所以 图形界面可以定制显示哪些内容,具体显示哪些内容取决于local_setting文件的设置 #https://docs.openstack.org/horizon/ussuri/install/install-rdo.html配置文件修改参考链接 [root@controller ~]# cat /etc/openstack-dashboard/local_settings
# -*- coding: utf-8 -*-
# ----------------------------------------------------------------------
# NOTE: The default values of the settings are defined in
# openstack_dashboard/defaults.py. Previously most available settings
# were listed in this example file, but it is no longer true.
# For available settings, see openstack_dashboard/defaults.py and
# the horizon setting reference found at
# https://docs.openstack.org/horizon/latest/configuration/settings.html.
#
# Django related settings and HORIZON_CONFIG still exist here.
# Keep in my mind that they will be revisit in upcoming releases.
# ---------------------------------------------------------------------- import os
from django.utils.translation import ugettext_lazy as _ from openstack_dashboard.settings import HORIZON_CONFIGDEBUG = False
# This setting controls whether or not compression is enabled. Disabling
# compression makes Horizon considerably slower, but makes it much easier
# to debug JS and CSS changes
#COMPRESS_ENABLED = not DEBUG # This setting controls whether compression happens on the fly, or offline
# with `python manage.py compress`
# See https://django-compressor.readthedocs.io/en/latest/usage/#offline-compression
# for more information
#COMPRESS_OFFLINE = not DEBUG # If horizon is running in production (DEBUG is False), set this
# with the list of host/domain names that the application can serve.
# For more information see:
# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ['*']
WEBROOT = '/dashboard/'
LOGIN_URL = WEBROOT + 'auth/login/'
LOGOUT_URL = WEBROOT + 'auth/logout/' # Set SSL proxy settings:
# Pass this header from the proxy after terminating the SSL,
# and don't forget to strip it from the client's request.
# For more information see:
# https://docs.djangoproject.com/en/dev/ref/settings/#secure-proxy-ssl-header #SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# If Horizon is being served through SSL, then uncomment the following two
# settings to better secure the cookies from security exploits #CSRF_COOKIE_SECURE = True #SESSION_COOKIE_SECURE = True
# If provided, a "Report Bug" link will be displayed in the site header
# which links to the value of this setting (ideally a URL containing
# information on how to report issues).
#HORIZON_CONFIG["bug_url"] = "http://bug-report.example.com"
# Show backdrop element outside the modal, do not close the modal
# after clicking on backdrop.
#HORIZON_CONFIG["modal_backdrop"] = "static"
# Specify a regular expression to validate user passwords.
# HORIZON_CONFIG["password_validator"] = {
#     "regex": '.*',
#     "help_text": _("Your password does not meet the requirements."),
#}
# Turn off browser autocompletion for forms including the login form and
# the database creation workflow if so desired.
#HORIZON_CONFIG["password_autocomplete"] = "off"
# Setting this to True will disable the reveal button for password fields,
# including on the login form.
#HORIZON_CONFIG["disable_password_reveal"] = False LOCAL_PATH = '/tmp' # Set custom secret key:
# You can either set it to a specific value or you can let horizon generate a
# default secret key that is unique on this machine, e.i. regardless of the
# amount of Python WSGI workers (if used behind Apache+mod_wsgi): However,
# there may be situations where you would want to set this explicitly, e.g.
# when multiple dashboard instances are distributed on different machines
# (usually behind a load-balancer). Either you have to make sure that a session
# gets all requests routed to the same dashboard instance or you set the same
# SECRET_KEY for all of them. SECRET_KEY='5a7e2bfb38d7c24e7c03' # We recommend you use memcached for development; otherwise after every reload
# of the django development server, you will have to login again. To use
# memcached set CACHES to something like below.
# For more information, see
# https://docs.djangoproject.com/en/1.11/topics/http/sessions/. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'controller:11211', },
}
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = { "identity": 3, "image": 2, "volume": 3,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user" # If you use ``tox -e runserver`` for developments,then configure
# SESSION_ENGINE to django.contrib.sessions.backends.signed_cookies
# as shown below:
#SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # Send email to the console by default EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
# Or send them to /dev/null #EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
# Configure these for your outgoing email host
#EMAIL_HOST = 'smtp.my-company.com' #EMAIL_PORT = 25
#EMAIL_HOST_USER = 'djangomail'
#EMAIL_HOST_PASSWORD = 'top-secret!' OPENSTACK_HOST = "controller" OPENSTACK_KEYSTONE_URL = "http://%s/identity/v3" %
OPENSTACK_HOST # The timezone of the server. This should correspond with the timezone
# of your entire OpenStack installation, and hopefully be in UTC. TIME_ZONE = "UTC"
# Change this patch to the appropriate list of tuples containing
# a key, label and static directory containing two files:
# _variables.scss and _styles.scss #AVAILABLE_THEMES = [
# ('default', 'Default', 'themes/default'),
# ('material', 'Material', 'themes/material'),
# ('example', 'Example', 'themes/example'),
#]LOGGING = { 'version': 1,
# When set to True this will disable all logging except
# for loggers specified in this configuration dictionary. Note that
# if nothing is specified here and disable_existing_loggers is True,
# django.db.backends will still log unless it is disabled explicitly. 'disable_existing_loggers': False,
# If apache2 mod_wsgi is used to deploy OpenStack dashboard
# timestamp is output by mod_wsgi. If WSGI framework you use does not
# output timestamp for logging, add %(asctime)s in the following
# format definitions. 'formatters': { 'console': { 'format': '%(levelname)s %(name)s %(message)s' },'operation': { # The format of "%(message)s" is defined by # OPERATION_LOG_OPTIONS['format'] 'format': '%(message)s' },
},
'handlers': { 'null': { 'level': 'DEBUG', 'class': 'logging.NullHandler', },'console': { # Set the level to "DEBUG" for verbose output logging. 'level': 'DEBUG' if DEBUG else 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'console', },'operation': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'operation', }, },'loggers': { 'horizon': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False,},'horizon.operation_log':{ 'handlers': ['operation'], 'level': 'INFO', 'propagate': False, },'openstack_dashboard': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'novaclient': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'cinderclient': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'keystoneauth': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'keystoneclient': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'glanceclient': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'neutronclient': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'swiftclient': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'oslo_policy': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'openstack_auth': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },'django': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False, },
# Logging from django.db.backends is VERY verbose, send to null
# by default. 'django.db.backends': { 'handlers': ['null'], 'propagate': False, },'requests': { 'handlers': ['null'], 'propagate': False, },'urllib3': { 'handlers': ['null'], 'propagate': False, },'chardet.charsetprober': { 'handlers': ['null'],'propagate': False, },'iso8601': { 'handlers': ['null'], 'propagate': False, },'scss': { 'handlers': ['null'], 'propagate': False, }, },
}# 'direction' should not be specified for all_tcp/udp/icmp.
# It is specified in the form.
SECURITY_GROUP_RULES = { 'all_tcp': { 'name': _('All TCP'), 'ip_protocol': 'tcp', 'from_port': '1', 'to_port': '65535', },'all_udp': { 'name': _('All UDP'), 'ip_protocol': 'udp', 'from_port': '1', 'to_port': '65535', },'all_icmp': { 'name': _('All ICMP'), 'ip_protocol': 'icmp', 'from_port': '-1', 'to_port': '-1', },'ssh': {'name': 'SSH', 'ip_protocol': 'tcp', 'from_port': '22', 'to_port': '22', },'smtp': { 'name': 'SMTP', 'ip_protocol': 'tcp', 'from_port': '25', 'to_port': '25', },'dns': { 'name': 'DNS',    'ip_protocol': 'tcp', 'from_port': '53', 'to_port': '53', },'http': { 'name': 'HTTP', 'ip_protocol': 'tcp', 'from_port': '80', 'to_port': '80', },'pop3': { 'name': 'POP3', 'ip_protocol': 'tcp','from_port': '110', 'to_port': '110',},'imap': { 'name': 'IMAP', 'ip_protocol': 'tcp', 'from_port': '143', 'to_port': '143', },'ldap': { 'name': 'LDAP', 'ip_protocol': 'tcp', 'from_port': '389', 'to_port': '389', },'https': { 'name': 'HTTPS', 'ip_protocol': 'tcp', 'from_port': '443', 'to_port': '443', },'smtps': { 'name': 'SMTPS', 'ip_protocol': 'tcp', 'from_port': '465', 'to_port': '465', },'imaps': {     'name': 'IMAPS', 'ip_protocol': 'tcp', 'from_port': '993', 'to_port': '993', },'pop3s': { 'name': 'POP3S', 'ip_protocol': 'tcp', 'from_port': '995', 'to_port': '995', },'ms_sql': { 'name': 'MS SQL', 'ip_protocol': 'tcp', 'from_port': '1433', 'to_port': '1433', },'mysql': { 'name': 'MYSQL', 'ip_protocol': 'tcp', 'from_port': '3306', 'to_port': '3306', },'rdp': { 'name': 'RDP', 'ip_protocol': 'tcp', 'from_port': '3389', 'to_port': '3389', },
}# Help URL can be made available for the client. To provide a help URL, edit the
# following attribute to the URL of your choice.
#HORIZON_CONFIG["help_url"] = "http://openstack.mycompany.org"

3、修改httpd的配置文件

#/etc/httpd/conf.d/openstack-dashboard.conf
[root@controller ~]# cat /etc/httpd/conf.d/openstack-dashboard.conf
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess dashboard
WSGIProcessGroup dashboard
WSGISocketPrefix run/wsgi WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
Alias /dashboard/static /usr/share/openstack-dashboard/static
<Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi> Options All AllowOverride All Require all granted
</Directory> <Directory /usr/share/openstack-dashboard/static> Options All AllowOverride All Require all granted
</Directory>

重启服务:

[root@controller ~]# systemctl restart httpd.service memcached.service

4、访问horizon图形

#http://ip/dashborad

[root@controller ~]# cat openrc
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
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

十四、OpenStack基础命令行

1、qcow2镜像操作

#创建镜像
[root@controller ~]# openstack image create --file ./cirros-0.5.1-x86_64-disk.img cirros1 #查看镜像
[root@controller ~]# openstack image list
+--------------------------------------+---------+--------+
| ID                                   | Name    | Status |
+--------------------------------------+---------+--------+
| 1682ab57-bb53-45a7-b6df-492cbb1c864a | cirros  | active |
| 44361e13-a428-4fb1-b2c6-3595d785e25c | cirros1 | active |
+--------------------------------------+---------+--------+ #删除镜像
[root@controller ~]# openstack image delete cirros1
[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 1682ab57-bb53-45a7-b6df-492cbb1c864a | cirros | active |
+--------------------------------------+--------+--------+

2、网络的创建

openstack里面的网络分为network、subnet、port作为基础的二层网络。

network相当于交换机,port相当于交换机上的接口,subnet相当于交换机网络的网段。

# 创建网络
[root@controller ~]# openstack network create test1 #查看网络
[root@controller ~]# openstack network list
+--------------------------------------+-------+---------+
| ID | Name | Subnets |
+--------------------------------------+-------+---------+
| 3c79d519-eec0-47f2-abee-659f4f04a448 | test1 | |
+--------------------------------------+-------+---------+ #创建subnet之前,我们在网络节点上看不到任何网络namespace(vrf)
[root@network ~]# ip netns
[root@network ~]# [root@controller ~]# openstack subnet create --subnet-range 10.1.10.0/24 --dhcp -- network test1 test1-subnet
[root@controller ~]# openstack subnet list
+--------------------------------------+--------------+-------------------------------- ------+--------------+
| ID | Name | Network | Subnet |
+--------------------------------------+--------------+-------------------------------- ------+--------------+
| 22507b7b-d2eb-43bd-a6a7-7c494c275859 | test1-subnet | 3c79d519-eec0-47f2-abee- 659f4f04a448 | 10.1.10.0/24 |
+--------------------------------------+--------------+-------------------------------- ------+--------------+ #创建subnet之后
[root@network ~]# ip netns
qdhcp-3c79d519-eec0-47f2-abee-659f4f04a448 (id: 0) [root@network ~]# ip netns exec qdhcp-3c79d519-eec0-47f2-abee-659f4f04a448 ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ns-053dc00a-bd@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether fa:16:3e:05:31:07 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.1.10.2/24 brd 10.1.10.255 scope global ns-053dc00a-bd valid_lft forever preferred_lft forever inet 169.254.169.254/16 brd 169.254.255.255 scope global ns-053dc00a-bd valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe05:3107/64 scope link valid_lft forever preferred_lft forever

3、虚拟机的创建

虚拟机创建必须要指定镜像资源,网络资源,以及所需要的资源模板,镜像资源和网络资源我们都比较好理解。资源 模板表示openstack这个虚拟机会占用多少资源。

其实资源模板就是flavor,是由nova管理的。

[root@controller ~]# openstack flavor create --vcpus 1 --ram 512 --disk 1 flavor-test [root@controller ~]# openstack flavor list
+--------------------------------------+-------------+-----+------+-----------+------- +-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+-------------+-----+------+-----------+------- +-----------+
| a0b8e094-2009-4018-b7f9-82888e45d7d5 | flavor-test | 512 | 1 | 0 | 1 | True |
+--------------------------------------+-------------+-----+------+-----------+------- +-----------+
[root@controller ~]# openstack server create --network test1 --image cirros --flavor flavor-test server1
[root@controller ~]# openstack server list
+--------------------------------------+---------+--------+-------------------+-------- +-------------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+---------+--------+-------------------+-------- +-------------+
| 22d664fb-428a-48fc-8d98-b10d7a9c7fed | server1 | ACTIVE | test1=10.1.10.132 | cirros | flavor-test |
+--------------------------------------+---------+--------+-------------------+-------- +-------------+ [root@controller ~]# openstack server list --long -c 'Name' -c 'Host'
+---------+----------+
| Name    | Host     |
+---------+----------+
| server1 | compute1 |
+---------+----------+ [root@controller ~]# openstack console url show server1
+-------+------------------------------------------------------------------------------ -------------+
| Field | Value |
+-------+------------------------------------------------------------------------------ -------------+
| type | novnc |
| url | http://controller:6080/vnc_auto.html?path=%3Ftoken%3Dae6a750a-98fc-4993-b4ee- d0719a80c8c8 |
+-------+------------------------------------------------------------------------------ -------------+

十五、Neutron网络类型详解

1、linuxbridge-local

当将一个subnet分配给network的时候会触发local网络的创建。

创建local类型网络底层实现:

  1. 创建bridge(subnet开启dhcp或有实例创建在该计算节点上)
  2. 创建namespace(subnet开启dhcp)
  3. 创建连接两个tap设备的veth pair(subnet开启dhcp)
  4. 将其中的一个tap设备放进namespace(subnet开启dhcp)
  5. 将另外一个tap设备桥接进bridge(subnet开启dhcp)
  6. 为namespace中的tap设备分配dhcp server的地址(subnet开启dhcp)

注意:

  1. local网络类型所生成的bridge不关联物理网卡
  2. 如果只是创建网络且subnet不开启dhcp并且不关联实例,则不会看到bridge
  3. 本实例展示的是dhcp的情况

2、local网络测试

[root@controller ~]# openstack network create local-network
[root@controller ~]# openstack subnet create --subnet-range 10.1.1.0/24 --dhcp -- network local-network local-subnet
[root@controller ~]# openstack server create --flavor flavor-test --network local- network --image cirros --availability-zone nova:compute1 server1
[root@controller ~]# openstack server create --flavor flavor-test --network local- network --image cirros --availability-zone nova:compute1 server2 [root@compute1 ~]# virsh list
Id Name State
-----------------------------------
2 instance-00000002 running
3 instance-00000003 running[root@controller ~]# openstack server list
+--------------------------------------+---------+--------+--------------------------+- -------+-------------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+---------+--------+--------------------------+- -------+-------------+
| 0cb4535f-a0f4-4146-8f4b-dddc7a4506b0 | server2 | ACTIVE | local-network=10.1.1.174 | cirros | flavor-test |
| 0c0b512a-78da-4600-9adc-07d09cd5b8a6 | server1 | ACTIVE | local-network=10.1.1.52 | cirros | flavor-test |
+--------------------------------------+---------+--------+--------------------------+- -------+-------------+ [root@compute1 qemu]# virsh console 2
Connected to domain instance-00000002
Escape character is ^] login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login: cirros
Password:
$ sudo su -
# ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether fa:16:3e:ff:36:21 brd ff:ff:ff:ff:ff:ff inet6 fe80::f816:3eff:feff:3621/64 scope link valid_lft forever preferred_lft forever # ip a a 10.1.1.52/24 dev eth0
#ctrl+] 退出控制台 [root@compute1 qemu]# virsh console 3
Connected to domain instance-00000003
Escape character is ^] login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login: cirros
Password:
$ sudo su -
# ip a a 10.1.1.174/24 dev eth0
# ping -c 5 10.1.1.52
PING 10.1.1.52 (10.1.1.52): 56 data bytes
64 bytes from 10.1.1.52: seq=0 ttl=64 time=1.350 ms
64 bytes from 10.1.1.52: seq=1 ttl=64 time=1.542 ms
64 bytes from 10.1.1.52: seq=2 ttl=64 time=1.159 ms
64 bytes from 10.1.1.52: seq=3 ttl=64 time=1.068 ms
64 bytes from 10.1.1.52: seq=4 ttl=64 time=1.296 ms --- 10.1.1.52 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 1.068/1.283/1.542 ms[root@controller ~]# openstack server delete server1 server2
[root@controller ~]# openstack network delete local-network

3、linuxbridge-flat

修改网络节点的ML2配置文件:

#只要不是local类型的网络,我们的neutron都是要和物理网卡做关联的。所以在ML2配置文件中对除了local类型 网络的其他网络都需要关联物理网卡
[root@network ~]# cat /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
[ml2]
mechanism_drivers = linuxbridge,l2population
type_drivers = local,flat,vlan,vxlan
extension_drivers = port_security
tenant_network_types = flat [ml2_type_flat]
flat_networks = yydsnet [securitygroup]
enable_ipset = true#我们在ml2配置文件中指定的flat类型的网络并没有关联物理网卡,物理网卡的关联配置应该在L2 Agent配置文件中指定

修改L2 Agent配置文件:

#网络节点的修改 [root@network ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan] enable_vxlan = false [linux_bridge]
physical_interface_mappings = yydsnet:ens4 #只要指定了yydsnet网络就会给我映射到ens4这块网卡 #计算节点修改 [root@compute1 qemu]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false
[linux_bridge]
physical_interface_mappings = yydsnet:ens4[root@compute2 qemu]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false
[linux_bridge]
physical_interface_mappings = yydsnet:ens4

重启neutron相关服务:

#网络节点上重启neutron-server(由于更改了ML2配置文件),还需要重启L2 Agent
[root@network ~]# systemctl restart neutron-server neutron-linuxbridge-agent.service #计算节点只需要重启L2 Agent服务就ok了
[root@compute1 ~]# systemctl restart neutron-linuxbridge-agent.service
[root@compute2 ~]# systemctl restart neutron-linuxbridge-agent.service [root@controller ~]# openstack network agent list
+--------------------------------------+--------------------+----------+--------------- ----+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+----------+--------------- ----+-------+-------+---------------------------+
| 0699e0dd-6b39-4358-b5eb-f5c49a0148cc | Linux bridge agent | compute2 | None | :-) | UP | neutron-linuxbridge-agent |
| 4e0f8732-7428-4556-bd0b-8d65229ad581 | Linux bridge agent | network | None | :-) | UP | neutron-linuxbridge-agent |
| 688449b0-b4c7-49a5-98bf-20e43319824b | Linux bridge agent | compute1 | None | :-) | UP | neutron-linuxbridge-agent |
| b752dd59-21d8-46ef-9687-c3c570bf71dc | Metadata agent | network | None | :-) | UP | neutron-metadata-agent |
| bece0070-5f15-40db-9b4c-26f05a522ec9 | L3 agent | network | nova | :-) | UP | neutron-l3-agent |
| c7cb2c7f-96ec-4afa-bb75-82568a577e14 | DHCP agent | network | nova | :-) | UP | neutron-dhcp-agent |
+--------------------------------------+--------------------+----------+--------------- ----+-------+-------+---------------------------+

4、flat网络测试

在neutron中,flat网络表示扁平化网络的意思,每个flat网络必须要分配一块网卡。如果你想创建3个flat网络,那么就需要3块物理网卡。flat网络数量和物理网卡数量是1对1的关系,所以flat网络适合小型企业。

flat网络中的流量不带任何vlan。

[root@controller ~]# openstack network create --provider-network-type flat --provider- physical-network yydsnet flat-network
[root@controller ~]# openstack network create --provider-network-type flat --provider- physical-network yydsnet flat1-network
Error while executing command: ConflictException: 409, Unable to create the flat network. Physical network yydsnet is in use.[root@controller ~]# openstack subnet create --subnet-range 10.1.1.0/24 --dhcp -- network flat-network flat-subnet
[root@network ~]# ip netns
qdhcp-46278abd-5493-4239-ad56-3edbe7937e5f (id: 0) [root@controller ~]# openstack server create --flavor flavor-test --network flat- network --image cirros --availability-zone nova:compute1 server1 [root@controller ~]# openstack server create --flavor flavor-test --network flat- network --image cirros --availability-zone nova:compute2 server2

由于此时我们已经将flat网络和物理网卡进行了关联,所以当通过flat网络创建了subnet之后,会在namespace里面创建dhcp server的端口,且会和bridge关联,然后会将flat映射的物理网卡桥接到bridge中。

其他计算节点当有实例创建的时候也会将网桥和flat网络指定的物理网卡做桥接,然后创建的虚拟机的虚拟网卡如果在flat网络,也会桥接到对应的网桥中。

#server1的地址
$ ip a show eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether fa:16:3e:d9:3b:6f brd ff:ff:ff:ff:ff:ff
inet 10.1.1.236/24 brd 10.1.1.255 scope global eth0 valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fed9:3b6f/64 scope link valid_lft forever preferred_lft forever #server2的地址
$ ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether fa:16:3e:40:ab:54 brd ff:ff:ff:ff:ff:ff inet 10.1.1.142/24 brd 10.1.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe40:ab54/64 scope link valid_lft forever preferred_lft forever$ ping -c 1 10.1.1.142
PING 10.1.1.142 (10.1.1.142): 56 data bytes
64 bytes from 10.1.1.142: seq=0 ttl=64 time=1.729 ms #将flat网络的网关配置到交换机上
Switch(config)#int vlan1
Switch(config-if)#no shut
Switch(config-if)#ip add 10.1.1.1 255.255.255.0
Switch(config-if)#do show inter vlan1 | in Ha
Hardware is Ethernet SVI, address is aabb.cc80.6000 (bia aabb.cc80.6000) #server1访问网关
$ ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1): 56 data bytes
64 bytes from 10.1.1.1: seq=1 ttl=255 time=1.401 ms
64 bytes from 10.1.1.1: seq=2 ttl=255 time=2.310 ms
64 bytes from 10.1.1.1: seq=3 ttl=255 time=2.016 ms $ arp -a -n
? (10.1.1.142) at fa:16:3e:40:ab:54 [ether] on eth0
? (10.1.1.2) at fa:16:3e:9b:97:52 [ether] on eth0
? (10.1.1.1) at aa:bb:cc:80:60:00 [ether] on eth0 [root@controller ~]# openstack server delete server1 server2
[root@controller ~]# openstack network delete flat-network

5、linuxbridge-vlan

vlan类型和flat类型最大的区别就在于1个物理网卡可以对应多个vlan类型的网络,flat是1对1,vlan是1对 4k+。

由于我们的flat网络只能创建一个网络,所以flat网络必定是直接和物理网络相关联的,意味着你flat网络类型的网关是一定要在物理三层设备上的。

修改网络节点的ML2配置文件:

[root@network ~]# cat /etc/neutron/plugins/ml2/ml2_conf.ini
[DEFAULT]
[ml2]
mechanism_drivers = linuxbridge,l2population
type_drivers = local,flat,vlan,vxlan
extension_drivers = port_security
tenant_network_types = vlan [ml2_type_vlan]
network_vlan_ranges = yydsnet:500:1000 [securitygroup]enable_ipset = true #在这里面的vlan:500:1000表示的含义是如果想要创建vlan类型的网络,需要指定网络名称为yydsnet。

修改L2 Agent配置文件:

#L2 agent必须要将yydsnet网络映射到物理网卡
[root@network ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false [linux_bridge]
physical_interface_mappings = yydsnet:ens4 [root@compute1 ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false [linux_bridge]
physical_interface_mappings = yydsnet:ens4 [root@compute2 ~]# cat /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[DEFAULT]
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
[vxlan]
enable_vxlan = false [linux_bridge]
physical_interface_mappings = yydsnet:ens4 #如果neutron创建网指定的--provider-physical-network为yydsnet,那么就会自动的使用ens4网卡实现映 射。

重启neutron相关服务:

[root@network ~]# systemctl restart neutron-server neutron-linuxbridge-agent
[root@compute1 ~]# systemctl restart neutron-linuxbridge-agent.service
[root@compute2 ~]# systemctl restart neutron-linuxbridge-agent.service 

如果配置都正确但是重启计算节点的l2 agent服务失败,可以尝试重启。这个位置貌似有个bug,修改完网络类型之后,删除旧的网络无法清空链表'CHAIN_USER_DEL failed (Device or resource busy): chain neutronARP-tap1213046c-d3'然后就启动失败 。

Bug #1887281 “[linuxbridge] ebtables delete arp protect chain fa...” : Bugs : neutron (bug网址),可以通过ebtables -F chain手 工清空链表,再次重启服务。

6、vlan网络测试

#如果是非管理员用户,只能通过下面这种方式创建网络,此时创建的网络,vlan id是随机的,范围在ml2的配置已 经指定了。
[root@controller ~]# openstack network create vlan-network1
(vlan 500) #如果是管理员用户,那么可以指定vlan id创建网络
[root@controller ~]# openstack network create --provider-network-type vlan --provider- physical-network yydsnet --provider-segment 3333 vlan-network2
(vlan 3333)#下面3个参数只有管理员可以指定
--provider-network-type
--provider-physical-network
--provider-segment [root@controller ~]# openstack subnet create --subnet-range 10.1.10.0/24 --network vlan-network1 vlan-sunber1
[root@controller ~]# openstack subnet create --subnet-range 10.1.20.0/24 --network vlan-network2 vlan-sunbet2 [root@network ~]# ip netns
qdhcp-7b1652fb-808c-4938-8414-eddf53c8a76d (id: 1)
qdhcp-38dedb50-1472-403b-9743-774c1b8691ee (id: 0)
[root@network ~]# bridge link
12: tapfd820183-3b@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master brq38dedb50-
14 state forwarding priority 32 cost 2
13: ens4.500@ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master brq38dedb50-14
state forwarding priority 32 cost 100
15: tap1cf91e8c-30@ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master brq7b1652fb-
80 state forwarding priority 32 cost 2
16: ens4.3333@ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master brq7b1652fb-80
state forwarding priority 32 cost 100 #如果此时创建虚拟机,我们的计算节点上的虚拟机是无法通过dhcp拿到地址的。我们需要在交换机上配置vlan才能让 虚拟机拿到地址
Switch(config)#vlan 500,3333
Switch(config-vlan)#exit
Switch(config)#int range e0/0-2
Switch(config-if-range)#sw t en d
Switch(config-if-range)#sw m t
Switch(config-if-range)# [root@controller ~]# openstack server create --flavor flavor-test --network vlan- network1 --image cirros --availability-zone nova:compute1 network1-server1 [root@controller ~]# openstack server create --flavor flavor-test --network vlan- network2 --image cirros --availability-zone nova:compute1 network2-server1

[root@controller ~]# openstack server list
+--------------------------------------+------------------+--------+------------------- --------+--------+-------------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------------------------+------------------+--------+------------------- --------+--------+-------------+
| 9d601737-bedd-4327-b021-c05c519ef98e | network2-server1 | ACTIVE | vlan- network2=10.1.20.121 | cirros | flavor-test |
| 3a8a9cfd-7145-40e9-b3a8-02e34a816373 | network1-server1 | ACTIVE | vlan- network1=10.1.10.209 | cirros | flavor-test |
+--------------------------------------+------------------+--------+------------------- --------+--------+-------------+ #以openstack ML2的插件能力,他就能做到这里了。network1和network2由于属于两个不同的vlan,所以是无法 通信的。如果想让他们两个通信,有两种办法,第一种是在物理网络上配置vlan的网关,实现三层通信,第二种就是借 助openstack的service plugin的L3 agent实现3层通信。 #在交换机固然可以配置neutron的2层网络网关,但是要为每一个neutron的vlan网络创建一个网关,这太麻烦了。 所以我们采用openstack的service plugin来实现neutron的2层网络之间通信。#service plugin只要给我们提供了虚拟路由器。
[root@controller ~]# openstack router create vlan-router
[root@controller ~]# openstack subnet list
+--------------------------------------+--------------+-------------------------------- ------+--------------+
| ID | Name | Network | Subnet |
+--------------------------------------+--------------+-------------------------------- ------+--------------+
| 4221ad98-7bb2-47bb-b38f-f031436fdf44 | vlan-sunber1 | 38dedb50-1472-403b-9743- 774c1b8691ee | 10.1.10.0/24 |
| 9d9b1097-60bb-47b4-8e79-9c733e8b9e37 | vlan-sunbet2 | 7b1652fb-808c-4938-8414- eddf53c8a76d | 10.1.20.0/24 |
+--------------------------------------+--------------+-------------------------------- ------+--------------+
[root@controller ~]# openstack router add subnet vlan-router vlan-sunber1
[root@controller ~]# openstack router add subnet vlan-router vlan-sunbet2
[root@network ~]# ip netns
qrouter-ea7a4580-4523-40cd-8527-e704cda34019 (id: 2)
qdhcp-7b1652fb-808c-4938-8414-eddf53c8a76d (id: 1)
qdhcp-38dedb50-1472-403b-9743-774c1b8691ee (id: 0)

$ ping 10.1.20.121
PING 10.1.20.121 (10.1.20.121): 56 data bytes
64 bytes from 10.1.20.121: seq=0 ttl=63 time=4.025 ms
64 bytes from 10.1.20.121: seq=1 ttl=63 time=3.603 ms
[root@controller ~]# openstack network create --provider-network-type vlan --provider- physical-network yydsnet --provider-segment 100 external-network --external [root@controller ~]# openstack subnet create --subnet-range 172.16.100.0/24 --network external-network external-subnet [root@controller ~]# openstack router set vlan-router --external-gateway external- network #此时所有vlan-network1和vlan-network2的流量在如果访问到外部网络,则会被vlan-router做SNAT转换成 external网络的地址。

[root@network ~]# ip netns exec qrouter-ea7a4580-4523-40cd-8527-e704cda34019 route -ne Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 172.16.100.1 0.0.0.0 UG 0 0 0 qg-4a090e8b-46
10.1.10.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-66498a8e-b4
10.1.20.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-cdbcc8cc-0d
172.16.100.0 0.0.0.0 255.255.255.0 U 0 0 0 qg-4a090e8b-46#external网络的网关是在物理交换机上的
Switch(config)#vlan 100
Switch(config-vlan)#int vlan 100
Switch(config-if)#ip add 172
*Sep 24 09:49:16.728: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan100, changed state to down
Switch(config-if)#ip add 172.16.100.1 255.255.255.0
Switch(config-if)#no shut

OpenStack ussuri 私有云平台搭建相关推荐

  1. 物联网iot私有云平台搭建

    物联网iot私有云平台搭建 物联网的平台有多种,把其中的一些列出一个开源平台比照表. IoT 软件平台 设备管理? 集成 安全 数据收集协议 分析 支持可视化? 数据库 Kaa IoT Platfor ...

  2. Openstack 多节点的企业私有云平台搭建

    这里采用的是虚拟机做的一个Openstack 多节点的企业私有云平台测试,仅供参考 编号 系统 主机名–身份 IP @1 centos7 ct–控制节点 NAT:eth0=192.168.11.51 ...

  3. openstack实现私有云的搭建

    openstack 私有云搭建 实验环境:rhel7.2 禁用或移除所有自动更新的服务,因为它们会影响到您的 OpenStack 环境. systemctl stop NetworkManager s ...

  4. openstack私有云平台搭建

    1.1 安装 CentOS7 说明 [CentOS7 版本] CentOS7 系统选择 2009 版本:CentOS-7-x86_64-DVD-2009.iso [空白分区划分] 在 CentOS7 ...

  5. Iaas私有云平台搭建(Openstack)

    准备工作:两台CentOS7以上的虚拟机,(CentOS7之前的有许多命令不同)做好资源的分配: 准备镜像两块,CentOS7以上的一块.Iaas服务的基础镜像一块.(这Iaas平台的镜 像是先电下的 ...

  6. 搭建OpenStack多节点的企业私有云平台——基础基础环境搭建

    搭建OpenStack多节点的企业私有云平台--基础环境搭建 参考书籍:OpenStack云平台部署与高可用实战 前期准备: 安装VMware workstation 15.5 下载CentOS-7- ...

  7. 小米基于OpenStack搭建私有云平台技术架构大揭秘!

    摘要: 小米公司OpenStack项目的技术负责人潘晓东分享在使用OpenStack建设小米私有云平台的一些经验和踩过的一些坑,重点探讨在目前OpenStack还不太稳定的情况下,如何建设一个具备企业 ...

  8. Ubuntu+KVM+Openstack搭建私有云平台

    搭建私有云(1)_理论知识总结 前言:由于工作需求,需要搭建一个私有云平台,搜集了些资料,在此汇总记录 目录 搭建私有云1_理论知识总结 目录 0x00 云平台架构 0x02 部署Openstack ...

  9. openstack云平台搭建与使用

    概述 使用CentOS 7系统搭建一个OpenStack私有云平台. 实验目标 (1)掌握Linux系统的基础操作,包括修改主机名和配置网络等. (2)掌握OpenStack私有云平台的搭建. 实验环 ...

最新文章

  1. 神经网络基础:(3)神经网络整体架构
  2. JavaScript脚本文件学习总结
  3. ffmpeg 从mp4上提取H264的nalu
  4. 世界上最奇异的10种树,你都见过吗?
  5. oracle数据库存大文本,Oracle大文本在ASP中存取问题的解决
  6. 论文浅尝 | 提取计数量词丰富知识库
  7. java set集合与List集合练习
  8. Drupal 修复远程代码执行漏洞
  9. 洛谷——P1765 手机
  10. lxml.etree.SerialisationError: IO_ENCODER
  11. 【数字信号调制】基于matlab GUI ASK+OOK+BPSK+8PSK+QPSK+AM调制解调【含Matlab源码 1368期】
  12. 一款比较简单的PDF解密工具注册码分析
  13. 做图像处理的必备图库
  14. 返利网app android版
  15. Android app打开手机应用市场上对应的应用
  16. tp link拨号失败 服务器无响应,pppoe拨号失败解决方法_pppoe怎么设置
  17. MySQL高可用之DRBD
  18. 卷积层的dropout - dropblock
  19. 精通Web Analytics 2.0 (13) 第十一章:变身分析忍者的指导原则
  20. 【数字逻辑】逻辑函数式化简为其他形式

热门文章

  1. C#Treeview在拖拽时实现Image dragging效果
  2. JavaApi:高级流
  3. 我的ubuntu新系统自动装软件脚本
  4. 大数据与人工智能都分不清楚,还想走向人生巅峰?
  5. anacnda软件打不开解决方法
  6. 越来越大的人使用计算机的原因,为啥你的电脑越来越卡,别人却能再战三年?...
  7. arcgis中dem坐标定义_ArcGIS中的坐标系统定义与投影转换方法
  8. RV1109 人脸识别开发
  9. Struts2框架详解(二)
  10. vq矢量量化lbg matlab,应用VQ的说话人识别系统|Matlab实现