不会OpenStack?没关系我来教你如何部署OpenStack搭建-Ocata版!总和!

OpenStack‎项目是一个开源云计算平台,支持所有类型的云环境。该项目旨在实现简单,大规模可扩展性和一组丰富的功能。来自世界各地的云计算专家为该项目做出了贡献。‎

‎OpenStack通过各种补充‎服务提供基础设施即服务(IaaS)解决方案。每个服务都提供一个‎‎应用程序编程接口 (API),用于促进这种集成。‎

‎本合集适合具有足够Linux经验的OpenStack新用户的功能示例架构逐步部署主要的OpenStack服务。并非用于生产系统安装,而是用于创建最低限度的概念验证,以便了解 OpenStack。‎

在你对基础安装,配置,操作和故障诊断熟悉之后,你应该考虑按照以下步骤使用生产架构来进行部署

  • 确定并补充必要的核心和可选服务,以满足性能和冗余要求。
  • 使用诸如防火墙,加密和服务策略的方式来加强安全。
  • 使用自动化部署工具,例如Ansible, Chef, Puppet, or Salt来自动化部署,管理生产环境

注意:使用的镜像为:CentOS-7-x86_64-Minimal-1810.iso

另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

如果将...复制到配置文件里会导致配置文件注释掉。

一、密码本

对 OpenStack 服务而言,本合集使用SERVICE_PASS 表示服务帐号密码,使用SERVICE_DBPASS 表示数据库密码。

下表提供了需要密码的服务及其关联引用的列表。:

密码名称描述
数据库密码(不能使用变量)数据库的root密码
ADMIN_PASSadmin 用户密码
CINDER_DBPASS块设备存储服务的数据库密码
CINDER_PASS块设备存储服务的 密码cinder
DASH_DBPASSDatabase password for the Dashboard
DEMO_PASSdemo 用户的密码
GLANCE_DBPASS镜像服务的数据库密码
GLANCE_PASS镜像服务的 用户密码glance
KEYSTONE_DBPASS认证服务的数据库密码
METADATA_SECRETSecret for the metadata proxy
NEUTRON_DBPASS网络服务的数据库密码
NEUTRON_PASS网络服务的 用户密码neutron
NOVA_DBPASS计算服务的数据库密码
NOVA_PASS计算服务中nova用户的密码
PLACEMENT_PASSPassword of the Placement service user placement
RABBIT_PASSRabbitMQ的guest用户密码

二、服务器网络配置

完成各个节点操作系统安装以后,你必须配置网络接口。我们推荐你禁用自动网络管理工具并手动编辑你相应版本的配置文件。

控制节点服务器

安装基本工具

yum install -y vim net-tools tree lrzsz bash-completion wget

配置网络接口

编辑网卡配置/etc/sysconfig/network-scripts/ifcfg-ens33文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="86fb4d7c-a361-4f6a-b082-15e7fecf0107"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="控制节点IP地址"
NETMASK="255.255.255.0"
GATEWAY="网关地址"
DNS1="114.114.114.114"

重启网络服务

systemctl restart network

配置名称解析

设置节点主机名为 controller

hostnamectl set-hostname controller
hostname

编辑/etc/hosts文件

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# controller
控制节点IP地址         controller

# compute1
计算节点IP         compute1

# block1
块存储IP         block1

# object1
#192.168.145.136         object1

# object2
#192.168.145.137         object2

计算节点服务器

安装基本工具

yum install -y vim net-tools tree lrzsz bash-completion wget

配置网络接口

编辑网卡配置/etc/sysconfig/network-scripts/ifcfg-ens33文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
#UUID="86fb4d7c-a361-4f6a-b082-15e7fecf0107"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="计算节点IP"
NETMASK="255.255.255.0"
GATEWAY="网关地址"
DNS1="114.114.114.114"

配置名称解析

设置节点主机名为 compute1

hostnamectl set-hostname compute1
hostname

编辑/etc/hosts文件

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# controller
控制节点IP地址         controller

# compute1
计算节点IP         compute1

# block1
块存储IP         block1

# object1
#192.168.145.136         object1

# object2
#192.168.145.137         object2

验证连通性

建议您在继续进行之前,验证到 Internet 和各个节点之间的连通性。

  1. controller节点,测试能否连接到 Internet:

    [root@controller ~]# ping -c 4 baidu.com
    PING baidu.com (220.181.38.148) 56(84) bytes of data.
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=30.1 ms
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=31.5 ms
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=128 time=45.6 ms
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=128 time=31.3 ms
    
    --- baidu.com ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3007ms
    rtt min/avg/max/mdev = 30.127/34.671/45.644/6.361 ms
  2. controller 节点,测试到compute 节点管理网络是否连通:

    [root@controller ~]# ping -c 4 compute1
    PING compute1 (计算节点IP) 56(84) bytes of data.
    64 bytes from compute1 (计算节点IP): icmp_seq=1 ttl=64 time=0.350 ms
    64 bytes from compute1 (计算节点IP): icmp_seq=2 ttl=64 time=0.443 ms
    64 bytes from compute1 (计算节点IP): icmp_seq=3 ttl=64 time=1.00 ms
    64 bytes from compute1 (计算节点IP): icmp_seq=4 ttl=64 time=0.989 ms
    
    --- compute1 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3002ms
    rtt min/avg/max/mdev = 0.350/0.696/1.003/0.302 ms
  3. compute 节点,测试能否连接到 Internet:

    [root@compute1 ~]# ping -c 4 baidu.com
    PING baidu.com (220.181.38.148) 56(84) bytes of data.
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=35.4 ms
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=39.1 ms
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=128 time=42.4 ms
    64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=128 time=36.5 ms
    
    --- baidu.com ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3005ms
    rtt min/avg/max/mdev = 35.404/38.369/42.433/2.714 ms
  4. compute 节点,测试到controller 节点管理网络是否连通:

[root@compute1 ~]# ping -c 4 controller
PING controller (控制节点IP地址) 56(84) bytes of data.
64 bytes from controller (控制节点IP地址): icmp_seq=1 ttl=64 time=0.215 ms
64 bytes from controller (控制节点IP地址): icmp_seq=2 ttl=64 time=0.352 ms
64 bytes from controller (控制节点IP地址): icmp_seq=3 ttl=64 time=0.400 ms
64 bytes from controller (控制节点IP地址): icmp_seq=4 ttl=64 time=0.207 ms

--- controller ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.207/0.293/0.400/0.086 ms

关闭防火墙

SELinux

vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

setenforce 0
//注释:
//命令临时生效:
//setenforce 0 (临时生效可以直接用setenforce 0 )
//      1 启用
//      0 告警,不启用

防火墙FireWalld

查看防火墙的状态:

systemctl status firewalld.service

//默认是启动的

我们关闭它

systemctl stop firewalld; systemctl disable firewalld

之后我们继续查看状态

systemctl status firewalld.service

已经关闭了!

三、网络时间协议(NTP)

你需要安装Chrony,在不同节点实现同步时间服务

控制节点服务器

安全并配置组件

安装软件包:

yum -y install chrony

编辑/etc/chrony.conf文件并在你的环境需要的情况下增加、修改或者删除这些键值:

vim /etc/chrony.conf

NTP服务器:

server ntp3.aliyun.com iburst

为了让其它节点可以连接到控制节点上的chrony守护程序,请在“/etc/chrony.conf”文件中增加这个键值:

allow all

启动 NTP 服务并将其配置为随系统启动:

systemctl enable chronyd.service;systemctl start chronyd.service

重启下客户端chrony服务

systemctl restart chronyd.service

其它节点服务器

其他节点会连接控制节点同步时间。在所有其他节点执行这些步骤。

安全并配置组件

安装软件包:

yum -y install chrony

编辑/etc/chrony.conf文件并注释除server 键之外的所有内容。修改它引用控制节点:

vim /etc/chrony.conf

NTP服务器:

server controller iburst

启动 NTP 服务并将其配置为随系统启动:

systemctl enable chronyd.service;systemctl start chronyd.service

重启下客户端chrony服务

systemctl restart chronyd.service

客户端使用chronyc sources -v命令完成同步即可

chronyc sources -v
[root@compute1 ~]# chronyc sources -v
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* controller                    3   6    77    21    -72us[-1175us] +/-   26ms

验证操作

建议您在继续进一步的操作之前验证 NTP 的同步。有些节点,特别是哪些引用了控制节点的,需要花费一些时间去同步。

在控制节点上执行这个命令:

chronyc sources
[root@controller ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2  10   377   192   +487us[ +488us] +/-   30ms

名称/IP 地址‎列中的内容应指示一个或多个 NTP 服务器的主机名或 IP 地址。‎

MS‎‎ 列中的内容应指示 ‎‎*‎‎ 表示 NTP 服务当前同步到的服务器。‎

在所有其他节点执行相同命令:

chronyc sources
[root@compute1 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* controller                    3   6    17    27  +1820ns[  +57us] +/-   36ms

Name/IP address列的内容应显示控制节点的主机名。

四、安装OpenStack包

由于不同的发布日程,发行版发布 OpenStack 的包作为发行版的一部分,或使用其他方式。请在所有节点上执行这些程序

这里所描述的OpenStack包设置需要在所有节点进行:控制节点、计算节点和其他节点。

更换YUM源

备份原有的源:

cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak/

新建编辑CentOS-Base.repo文件并更改yum源:

提前查看版本,我的是centos/7.6.1810/的

vim /etc/yum.repos.d/CentOS-Base.repo
[CentOS-Base]
name=CentOS-Base
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/os/x86_64/
enabled=1
gpgcheck=0

[CentOS-Updates]
name=CentOS-Updates
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/updates/x86_64/
enabled=1
gpgcheck=0

[CentOS-Extras]
name=CentOS-Extras
baseurl=https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/extras/x86_64/
enabled=1
gpgcheck=0

将yum进行缓存

yum makecache
yum repolist

启用OpenStack库

yum install -y centos-release-openstack-ocata

cd /etc/yum.repos.d/
[root@compute1 yum.repos.d]# ls
bak  CentOS-Base.repo  CentOS-Ceph-Jewel.repo  CentOS-OpenStack-ocata.repo  CentOS-QEMU-EV.repo  CentOS-Storage-common.repo

进入/etc/yum.repos.d发现多出几个repo文件,进行修改

  1. CentOS-Ceph-Jewel.repo

    vim CentOS-Ceph-Jewel.repo
    # CentOS-Ceph-Jewel.repo
    #
    # Please see http://wiki.centos.org/SpecialInterestGroup/Storage for more
    # information
    
    [centos-ceph-jewel]
    name=CentOS-$releasever - Ceph Jewel
    #baseurl=http://mirror.centos.org/centos/$releasever/storage/$basearch/ceph-jewel/
    baseurl=https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/storage/x86_64/ceph-jewel/
    gpgcheck=1
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
    
    [centos-ceph-jewel-test]
    name=CentOS-$releasever - Ceph Jewel Testing
    baseurl=http://buildlogs.centos.org/centos/$releasever/storage/$basearch/ceph-jewel/
    gpgcheck=0
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
    
    [centos-ceph-jewel-debuginfo]
    name=CentOS-$releasever - Ceph Jewel DebugInfo
    baseurl=http://debuginfo.centos.org/centos/$releasever/storage/$basearch/ceph-jewel/
    gpgcheck=0
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
    
    [centos-ceph-jewel-source]
    name=CentOS-$releasever - Ceph Jewel Source
    baseurl=http://vault.centos.org/centos/$releasever/storage/Source/ceph-jewel/
    gpgcheck=0
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
  2. CentOS-QEMU-EV.repo

    vim CentOS-QEMU-EV.repo
    # CentOS-QEMU-EV.repo
    #
    # Please see http://wiki.centos.org/SpecialInterestGroup/Virtualization for more
    # information
    
    [centos-qemu-ev]
    name=CentOS-$releasever - QEMU EV
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=virt-kvm-common
    #baseurl=http://mirror.centos.org/$contentdir/$releasever/virt/$basearch/kvm-common/
    baseurl=https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/virt/x86_64/kvm-common/
    gpgcheck=1
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Virtualization
    
    [centos-qemu-ev-test]
    name=CentOS-$releasever - QEMU EV Testing
    baseurl=http://buildlogs.centos.org/centos/$releasever/virt/$basearch/kvm-common/
    gpgcheck=0
    enabled=0
  3. CentOS-OpenStack-ocata.repo

    vim CentOS-OpenStack-ocata.repo
    # CentOS-OpenStack-ocata.repo
    #
    # Please see http://wiki.centos.org/SpecialInterestGroup/Cloud for more
    # information
    
    [centos-openstack-ocata]
    name=CentOS-7 - OpenStack ocata
    #baseurl=http://mirror.centos.org/centos/7/cloud/$basearch/openstack-ocata/
    baseurl=https://mirror.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/cloud/x86_64/openstack-ocata/
    gpgcheck=1
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud
    exclude=sip,PyQt4
    
    [centos-openstack-ocata-test]
    name=CentOS-7 - OpenStack ocata Testing
    baseurl=http://buildlogs.centos.org/centos/7/cloud/$basearch/openstack-ocata/
    gpgcheck=0
    enabled=0
    exclude=sip,PyQt4
    
    [centos-openstack-ocata-debuginfo]
    name=CentOS-7 - OpenStack ocata - Debug
    baseurl=http://debuginfo.centos.org/centos/7/cloud/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud
    exclude=sip,PyQt4
    
    [centos-openstack-ocata-source]
    name=CentOS-7 - OpenStack ocata - Source
    baseurl=http://vault.centos.org/centos/7/cloud/Source/openstack-ocata/
    gpgcheck=1
    enabled=0
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Cloud
    exclude=sip,PyQt4
    
    [rdo-trunk-ocata-tested]
    name=OpenStack ocata Trunk Tested
    baseurl=https://trunk.rdoproject.org/centos7-ocata/current-passed-ci/
    gpgcheck=0
    enabled=0

更新缓存

yum makecache

查看yum源是否更换完成

yum repolist
[root@compute1 yum.repos.d]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
源标识                                          源名称                                               状态
CentOS-Base                                     CentOS-Base                                           10,019
CentOS-Extras                                   CentOS-Extras                                            435
CentOS-Updates                                  CentOS-Updates                                         2,500
centos-ceph-jewel                               CentOS-7 - Ceph Jewel                                    101
centos-openstack-ocata                          CentOS-7 - OpenStack ocata                           2,019+2
centos-qemu-ev                                  CentOS-7 - QEMU EV                                        79
repolist: 15,153

安装 OpenStack 客户端和安装 openstack-selinux包实现对OpenStack服务的安全策略进行自动管理

yum install -y python-openstackclient openstack-selinux

五、SQL 数据库

大多数OpenStack服务使用SQL数据库来存储信息。数据库通常在控制器节点上运行。本合集中的过程使用MariaDB或MySQL,具体取决于发行版。

安全并配置组件

安装软件包:

yum install -y mariadb mariadb-server python2-PyMySQL

创建并编辑 ,然后完成配置:/etc/my.cnf.d/openstack.cnf

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

[mysqld]中,设置“bind-address”值为控制节点的管理网络IP地址以是的其他节点可以通过管理网络访问访问数据库。设置其他关键字来设置一些有用的选项和UTF-8编码:

[mysqld]
bind-address = 控制节点的IP地址
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

完成安装

启动数据库服务,并将其配置为开机自启:

systemctl enable mariadb.service;systemctl start mariadb.service

通过运行脚本来保护数据库服务。

mysql_secure_installation

查早相应选择进行选择:

Enter current password for root (enter for none): 按一下回车
//为了方便我就不设置密码了
Set root password? [Y/n] n
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

数据库的配置完成后出现:

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

验证

输入mysql,验证数据库

[root@controller ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.1.20-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

六、消息队列和Memcached

OpenStack 使用消息队列来协调服务之间的操作和状态信息。消息队列服务通常在控制器节点上运行。OpenStack 支持多种消息队列服务,包括 RabbitMQQpidZeroMQ。但是,大多数打包 OpenStack 的发行版都支持特定的消息队列服务。本合集实现 RabbitMQ 消息队列服务,因为大多数发行版都支持它。

消息队列运行在控制节点。

消息队列

安全并配置组件

安装包:

yum install -y rabbitmq-server

启动消息队列服务并将其配置为随系统启动:

systemctl enable rabbitmq-server.service;systemctl start rabbitmq-server.service

添加 用户:openstack

rabbitmqctl add_user openstack RABBIT_PASS
[root@controller ~]# rabbitmqctl add_user openstack RABBIT_PASS
Creating user "openstack" ...

用合适的密码RABBIT_DBPASS替换 。RABBIT_PASS

给”openstack”用户配置写和读权限:

rabbitmqctl set_permissions openstack ".*" ".*" ".*"
[root@controller ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/" ...

Memcached

各类服务的身份认证机制使用Memcached缓存令牌。缓存服务memecached通常运行在控制节点。在生产部署中,我们推荐联合启用防火墙、认证和加密保证它的安全。

安全并配置组件

安装软件包:

yum install -y memcached python-memcached

编辑/etc/sysconfig/memcached文件并完成以下操作:

  • 将服务配置为使用控制器节点的管理 IP 地址。这是为了允许其他节点通过管理网络进行访问:
vim /etc/sysconfig/memcached
[root@controller ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1,controller"

完成安装

启动Memcached服务,并且配置它随机启动。

systemctl enable memcached.service;systemctl start memcached.service

七、认证服务keystone

OpenStack Identity 服务提供单点集成,用于管理身份验证、授权和服务目录。

标识服务通常是用户与之交互的第一个服务。经过身份验证后,最终用户可以使用其身份访问其他OpenStack服务。同样,其他OpenStack服务利用身份服务来确保用户是他们所说的人,并发现其他服务在部署中的位置。标识服务还可以与某些外部用户管理系统(如 LDAP)集成。

用户和服务可以使用由标识服务管理的服务目录查找其他服务。顾名思义,服务目录是 OpenStack 部署中可用服务的集合。每个服务可以有一个或多个终结点,每个终结点可以是以下三种类型之一:管理员、内部或公共。在生产环境中,出于安全原因,不同的终结点类型可能驻留在向不同类型的用户公开的单独网络上。例如,公共 API 网络可能从互联网上可见,以便客户可以管理其云。管理 API 网络可能仅限于组织内管理云基础结构的操作员。内部 API 网络可能仅限于包含 OpenStack 服务的主机。此外,OpenStack支持多个区域以实现可扩展性。为简单起见,本指南将管理网络用于所有终结点类型和默认区域。在 Identity 服务中创建的区域、服务和终结点共同构成了部署的服务目录。部署中的每个 OpenStack 服务都需要一个服务条目,其中包含存储在 Identity 服务中的相应端点。这一切都可以在安装和配置标识服务后完成。

‎本节介绍如何在控制器节点上安装和配置 OpenStack Identity 服务(代号为 keystone)。

安装和配置

‎在安装和配置标识服务之前,必须创建数据库。

用数据库连接客户端以 root 用户连接到数据库服务器:

mysql -u root -p

创建 keystone 数据库:

CREATE DATABASE keystone;

keystone数据库授予恰当的权限:

GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';

用合适的密码替换 KEYSTONE_DBPASS

eixt退出数据库客户端。

安全并配置组件

运行以下命令来安装包。

yum install -y openstack-keystone httpd mod_wsgi

编辑文件 /etc/keystone/keystone.conf 并完成如下动作:

vim /etc/keystone/keystone.conf
  • [database] 部分,配置数据库访问:

    [database]
    
    connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

    KEYSTONE_DBPASS替换为你为数据库选择的密码

  • [token]部分,配置Fernet UUID令牌的提供者。

[token]

provider = fernet

初始化身份认证服务的数据库:

su -s /bin/sh -c "keystone-manage db_sync" keystone

初始化Fernet key:

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

‎引导标识服务or Bootstrap the Identity service:

keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
  --bootstrap-admin-url http://controller:35357/v3/ \
  --bootstrap-internal-url http://controller:5000/v3/ \
  --bootstrap-public-url http://controller:5000/v3/ \
  --bootstrap-region-id RegionOne

替换为管理用户的合适密码。‎ADMIN_PASS

Replace with a suitable password for an administrative user.ADMIN_PASS

配置 Apache HTTP 服务器

编辑/etc/httpd/conf/httpd.conf 文件,配置ServerName 选项为控制节点:

vim /etc/httpd/conf/httpd.conf
ServerName controller:80

创建一个链接到/usr/share/keystone/wsgi-keystone.conf文件

ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

完成安装

启动 Apache HTTP 服务并配置其随系统启动:

systemctl enable httpd.service;systemctl start httpd.service

配置admin账户脚本

vim admin
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:35357/v3
export OS_IDENTITY_API_VERSION=3

执行admin文件

. admin

创建域、项目、用户和角色

身份服务为每个 OpenStack 服务提供身份验证服务。身份验证服务使用域、项目、用户和角色的组合。

创建service项目:

openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 7eeb20ab4a434c7f8dc13f85dd1d33be |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | default                          |
+-------------+----------------------------------+

常规(非管理)任务应该使用无特权的项目和用户。作为例子,本指南创建 demo 项目和用户。

创建demo 项目:

openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 05a0d6348521402c94444117d753f3a5 |
| is_domain   | False                            |
| name        | demo                             |
| parent_id   | default                          |
+-------------+----------------------------------+

创建demo 用户:

openstack user create --domain default --password DEMO_PASS demo
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 2dd768ac5440476a8215774272f7d63e |
| name                | demo                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

创建 user 角色:

openstack role create user
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 450318367c3f471aa1ef457e4f017729 |
| name      | user                             |
+-----------+----------------------------------+

将角色添加到项目的用户:user/demo/demo

openstack role add --project demo --user demo user

验证操作

在安装其他服务之前确认身份认证服务的操作。

在控制节点上执行这些命令。

作为 admin 用户,请求认证令牌:

openstack --os-auth-url http://controller:35357/v3 \
  --os-project-domain-name default --os-user-domain-name default \
  --os-project-name admin --os-username admin --os-password ADMIN_PASS token issue
+------------+---------------------------------------------------------------------------------------------+
| Field      | Value                                                                                       |
+------------+---------------------------------------------------------------------------------------------+
| expires    | 2022-04-27T03:13:39+0000                                                                    |
| id         | gAAAAABiaKbTPcWHmTJ2dx_wD5RsZ7WuGId9zCwatSbGEhObo3Xrngd9M-3t83Z0YbMk80TwOFFGhicugqgXdzs-    |
|            | mWJXpLFclwgdIKCyW89-4p0Ow86f8HFEXK0Cdx6gLQGeIgVdCgkh90ph3pgF0eIvqsIGtHkP-                   |
|            | DlbHnJgh0ZNLUFM9Jl4-0A                                                                      |
| project_id | ce0e09a6236a49cd83b0818f89399885                                                            |
| user_id    | 1e00e587279844b49ae5af63d1f9d120                                                            |
+------------+---------------------------------------------------------------------------------------------+

作为demo 用户,请求认证令牌:

openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name demo --os-username demo --os-password DEMO_PASS token issue
+------------+---------------------------------------------------------------------------------------------+
| Field      | Value                                                                                       |
+------------+---------------------------------------------------------------------------------------------+
| expires    | 2022-04-27T03:14:25+0000                                                                    |
| id         | gAAAAABiaKcB88SY-OVdh7lMI6wRsvpogBFIdkXXtqn01nlBl7i4OZYWxcFHwp0Ep5izbJ1HK_dSh7MPqX5LVc4     |
|            | -y86pZGJxLLsGr5ruBmFXnw-                                                                    |
|            | QR_EDbUkxCq4ae4pZ4wUed4G_H8fSFJWMO_YDsxr4GMiRyUxsxUILgZFvCjF160z7kPs_7Ok                    |
| project_id | 05a0d6348521402c94444117d753f3a5                                                            |
| user_id    | 2dd768ac5440476a8215774272f7d63e                                                            |
+------------+---------------------------------------------------------------------------------------------+

创建 OpenStack 客户端环境脚本

创建 admindemo 项目和用户创建客户端环境变量脚本。

创建和编辑 admin-openrc 文件并添加以下内容:

vim admin-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

ADMIN_PASS 替换为你在认证服务中为 admin 用户选择的密码。

创建和编辑 demo-openrc 文件并添加以下内容:

vim demo-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=DEMO_PASS
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

DEMO_PASS 替换为你在认证服务中为 demo 用户选择的密码。

使用脚本

使用特定租户和用户运行客户端,你可以在运行之前简单地加载相关客户端脚本。

加载admin-openrc文件来身份认证服务的环境变量位置和admin项目和用户证书:

. admin-openrc

请求认证令牌:

openstack token issue
+------------+---------------------------------------------------------------------------------------------+
| Field      | Value                                                                                       |
+------------+---------------------------------------------------------------------------------------------+
| expires    | 2022-04-27T04:05:00+0000                                                                    |
| id         | gAAAAABiaLLcCay2ev6bh826y0nMH2zsdqPIY636rCn04PIsllcFSmA_NYDyXlgwY6ezUi10x38zGghj14PJSmESmCA |
|            | h8iH1aMKGA1SNHqE_N8KtmZajPq3F_laERQnvlIqubUBfgqnrmt_G8aA1VSjnrd0UA6OPNYEa8_rXat0SXOUmMJdsIz |
|            | I                                                                                           |
| project_id | ce0e09a6236a49cd83b0818f89399885                                                            |
| user_id    | 1e00e587279844b49ae5af63d1f9d120                                                            |
+------------+---------------------------------------------------------------------------------------------+

八、镜像服务Glance

映像服务使用户能够发现、注册和检索虚拟机映像。它提供了一个 REST API,使你能够查询虚拟机映像元数据并检索实际映像。您可以将通过映像服务提供的虚拟机映像存储在各种位置,从简单的文件系统到对象存储系统(如 OpenStack 对象存储)。

OpenStack镜像服务是IaaS的核心服务

安装和配置

这个部分描述如何在控制节点上安装和配置镜像服务,即 glance。简单来说,这个配置将镜像保存在本地文件系统中。

安装和配置镜像服务之前,你必须创建创建一个数据库、服务凭证和API端点。

完成下面的步骤以创建数据库:

用数据库连接客户端以 root 用户连接到数据库服务器:

mysql -u root -p

创建 glance 数据库:

CREATE DATABASE glance;

glance数据库授予恰当的权限:

GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';

用一个合适的密码替换 GLANCE_DBPASS

退出数据库客户端。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

要创建服务证书,完成这些步骤:

  • 创建 glance 用户:
openstack user create --domain default --password GLANCE_PASS glance
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 3de80fd2909c4a99a18ca5c9dd19fc18 |
| name                | glance                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
  • 添加 admin 角色到 glance 用户和 service 项目上。
openstack role add --project service --user glance admin

这个命令执行后没有输出。

  • 创建glance服务实体:
openstack service create --name glance --description "OpenStack Image" image
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | 525b21252e1e46aab075ded987b14fe2 |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+

创建镜像服务的 API 端点:

openstack endpoint create --region RegionOne image public http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 894fbde74b9a4d678eb1232233103edf |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 525b21252e1e46aab075ded987b14fe2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+
openstack endpoint create --region RegionOne image internal http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 0f005a4ac2ba4654b3304c848a1f782f |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 525b21252e1e46aab075ded987b14fe2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+
openstack endpoint create --region RegionOne image admin http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 102accc773644bdc83f0a51da5426357 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 525b21252e1e46aab075ded987b14fe2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

配置组件

默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

安装软件包:

yum install -y openstack-glance

编辑文件 /etc/glance/glance-api.conf 并完成如下动作:

vim /etc/glance/glance-api.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

GLANCE_DBPASS 替换为你为镜像服务选择的密码。

[keystone_authtoken][paste_deploy] 部分,配置认证服务访问:

[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = GLANCE_PASS
[paste_deploy]
# ...
flavor = keystone

GLANCE_PASS 替换为你为认证服务中你为 glance 用户选择的密码。

[glance_store] 部分,配置本地文件系统存储和镜像文件位置:

[glance_store]
# ...
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

编辑文件 /etc/glance/glance-registry.conf并完成如下动作:

vim /etc/glance/glance-registry.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

GLANCE_DBPASS 替换为你为镜像服务选择的密码。

[keystone_authtoken][paste_deploy] 部分,配置认证服务访问:

[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = glance
password = GLANCE_PASS
[paste_deploy]
# ...
flavor = keystone

GLANCE_PASS 替换为你为认证服务中你为 glance 用户选择的密码。

写入镜像服务数据库:

su -s /bin/sh -c "glance-manage db_sync" glance

完成安装

启动镜像服务并将其配置为随机启动:

systemctl enable openstack-glance-api.service openstack-glance-registry.service;systemctl start openstack-glance-api.service openstack-glance-registry.service

验证操作

使用 [](https://docs.openstack.org/ocata/zh_CN/install-guide-rdo/glance-verify.html#id1)CirrOS <http://launchpad.net/cirros>__对镜像服务进行验证,CirrOS是一个小型的Linux镜像可以用来帮助你进行 OpenStack部署测试。

在控制节点上执行这些命令。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

下载源镜像:

wget https://cdn.thtown.cn/OpenStack/image/cirros-0.4.0-x86_64-disk.img

使用 QCOW2磁盘格式, bare 容器格式上传镜像到镜像服务并设置公共可见,这样所有的项目都可以访问它:

openstack image create "cirros" \
  --file cirros-0.4.0-x86_64-disk.img \
  --disk-format qcow2 --container-format bare \
  --public
+------------------+------------------------------------------------------+
| Field            | Value                                                |
+------------------+------------------------------------------------------+
| checksum         | 443b7623e27ecf03dc9e01ee93f67afe                     |
| container_format | bare                                                 |
| created_at       | 2022-04-27T07:34:07Z                                 |
| disk_format      | qcow2                                                |
| file             | /v2/images/003509cc-345a-41e6-b7a0-0866e228bdff/file |
| id               | 003509cc-345a-41e6-b7a0-0866e228bdff                 |
| min_disk         | 0                                                    |
| min_ram          | 0                                                    |
| name             | cirros                                               |
| owner            | ce0e09a6236a49cd83b0818f89399885                     |
| protected        | False                                                |
| schema           | /v2/schemas/image                                    |
| size             | 12716032                                             |
| status           | active                                               |
| tags             |                                                      |
| updated_at       | 2022-04-27T07:34:08Z                                 |
| virtual_size     | None                                                 |
| visibility       | public                                               |
+------------------+------------------------------------------------------+

OpenStack 是动态生成 ID 的,因此您看到的输出会与示例中的命令行输出不相同。

确认镜像的上传并验证属性:

openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 003509cc-345a-41e6-b7a0-0866e228bdff | cirros | active |
+--------------------------------------+--------+--------+

九、计算服务Nova

使用 OpenStack Compute 托管和管理云计算系统。OpenStack Compute 是基础架构即服务 (IaaS) 系统的重要组成部分。主要模块是用Python实现的。

安装并配置控制节点

这个部分将描述如何在控制节点上安装和配置 Compute 服务,即 nova。

在安装和配置 Compute 服务前,你必须创建数据库服务的凭据以及 API endpoints。

为了创建数据库,必须完成这些步骤:

用数据库连接客户端以 root 用户连接到数据库服务器:

mysql -u root -p

创建nova_api、nova 和 nova_cell0 数据库:

CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;

对数据库进行正确的授权:

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';

用合适的密码代替 NOVA_DBPASS

退出数据库客户端。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

创建计算服务凭据:

  • 创建 nova 用户:
openstack user create --domain default --password NOVA_PASS nova

  • nova 用户添加 admin 角色:
openstack role add --project service --user nova admin

这个命令执行后没有输出。

  • 创建 nova 服务实体:
openstack service create --name nova --description "OpenStack Compute" compute

创建计算 API 服务终结点:

openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1

openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1

openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1

创建放置服务用户:

openstack user create --domain default --password PLACEMENT_PASS placement

将 Placement 用户添加到具有管理员角色的服务项目中:

openstack role add --project service --user placement admin

这个命令执行后没有输出。

在服务目录中创建放置 API 条目:

openstack service create --name placement --description "Placement API" placement

创建放置 API 服务终端节点:

openstack endpoint create --region RegionOne placement public http://controller:8778

openstack endpoint create --region RegionOne placement internal http://controller:8778

openstack endpoint create --region RegionOne placement admin http://controller:8778

安全并配置组件

默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

安装软件包:

yum install -y openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api

编辑/etc/nova/nova.conf文件并完成下面的操作:

vim /etc/nova/nova.conf

[DEFAULT]部分,只启用计算和元数据API:

[DEFAULT]
# ...
enabled_apis = osapi_compute,metadata

[api_database][database]部分,配置数据库的连接:

[api_database]
# ...
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api

[database]
# ...
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova

用你为 Compute 数据库选择的密码来代替 NOVA_DBPASS

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。

在 [api] 和 [keystone_authtoken] 部分中,配置标识服务访问:

[api]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = NOVA_PASS

使用你在身份认证服务中设置的nova 用户的密码替换NOVA_PASS

[DEFAULT 部分,配置my_ip 来使用控制节点的管理接口的IP 地址。

[DEFAULT]
# ...
my_ip = 控制节点IP

[DEFAULT]部分,启用网络服务支持:

[DEFAULT]
# ...
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

默认情况下,计算服务使用内置的防火墙服务。由于网络服务包含了防火墙服务,你必须使用nova.virt.firewall.NoopFirewallDriver防火墙服务来禁用掉计算服务内置的防火墙服务

[vnc]部分,配置VNC代理使用控制节点的管理接口IP地址 :

[vnc]
enabled = true
# ...
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip

[glance] 区域,配置镜像服务 API 的位置:

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

[oslo_concurrency] 部分,配置锁路径:

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

[placement]部分中,配置放置 API:

[placement]
# ...
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:35357/v3
username = placement
password = PLACEMENT_PASS

PLACEMENT_PASS替换为您在身份服务中为放置用户选择的密码。

由于BUG错误,您必须通过将以下配置添加到 /etc/httpd/conf.d/00-nova-placement-api.conf 来启用对 Placement API 的访问:

vim /etc/httpd/conf.d/00-nova-placement-api.conf
<Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
</Directory>

重启Httpd服务:

systemctl restart httpd

填充 nova-api 数据库:

su -s /bin/sh -c "nova-manage api_db sync" nova

注册 cell0 :

su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

创建 cell1 :

su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

填充 nova 数据库:

su -s /bin/sh -c "nova-manage db sync" nova

验证 nova cell0 和cell1是否已正确注册:

nova-manage cell_v2 list_cells

完成安装

启动 Compute 服务并将其设置为随系统启动:

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

安装和配置计算节点

安全并配置组件

默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

在计算节点操作

安装软件包:

yum install -y openstack-nova-compute

编辑/etc/nova/nova.conf文件并完成下面的操作:

vim /etc/nova/nova.conf

[DEFAULT]部分,只启用计算和元数据API:

[DEFAULT]
# ...
enabled_apis = osapi_compute,metadata

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。

在 [api] 和 [keystone_authtoken] 部分中,配置标识服务访问:

[api]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = NOVA_PASS

使用你在身份认证服务中设置的nova 用户的密码替换NOVA_PASS

[DEFAULT] 部分,配置 my_ip 选项:

[DEFAULT]
# ...
my_ip = 计算节点IP地址

[DEFAULT]部分,启用网络服务支持:

[DEFAULT]
# ...
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

缺省情况下,Compute 使用内置的防火墙服务。由于 Networking 包含了防火墙服务,所以你必须通过使用 nova.virt.firewall.NoopFirewallDriver 来去除 Compute 内置的防火墙服务。

[vnc]部分,启用并配置远程控制台访问:

[vnc]
# ...
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://192.168.145.133:6080/vnc_auto.html

服务器组件监听所有的 IP 地址,而代理组件仅仅监听计算节点管理网络接口的 IP 地址。基本的 URL 指示您可以使用 web 浏览器访问位于该计算节点上实例的远程控制台的位置。

如果你运行浏览器的主机无法解析controller 主机名,你可以将controller替换为你控制节点管理网络的IP地址。

[glance] 区域,配置镜像服务 API 的位置:

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

[oslo_concurrency] 部分,配置锁路径:

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

[placement]部分中,配置放置 API:

[placement]
# ...
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:35357/v3
username = placement
password = PLACEMENT_PASS

完成安装

确定您的计算节点是否支持虚拟机的硬件加速。

egrep -c '(vmx|svm)' /proc/cpuinfo

如果这个命令返回了 非0 的值,那么你的计算节点支持硬件加速且不需要额外的配置

如果这个命令返回了 0,那么你的计算节点不支持硬件加速。你必须配置 libvirt 来使用 QEMU 去代替 KVM

/etc/nova/nova.conf 文件的 [libvirt] 区域做出如下的编辑:

[libvirt]
# ...
virt_type = qemu

确定结束


启动计算服务及其依赖,并将其配置为随系统自动启动:

systemctl enable libvirtd.service openstack-nova-compute.service;systemctl start libvirtd.service openstack-nova-compute.service

在控制器节点上将计算节点添加到单元数据库

获取管理员凭据以启用仅限管理员的 CLI 命令,然后确认数据库中存在计算主机:

. admin-openrc
openstack hypervisor list

发现计算主机:

su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

添加新的计算节点时,必须在控制器节点上运行以注册这些新的计算节点。或者,您可以在/etc/nova/nova.conf中设置适当的间隔:

vim /etc/nova/nova.conf
[scheduler]
discover_hosts_in_cells_interval = 300

验证操作

在控制节点上执行这些命令。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

列出服务组件,以验证是否成功启动并注册了每个进程:

openstack compute service list

该输出应该显示三个服务组件在控制节点上启用,一个服务组件在计算节点上启用。

列出身份认证服务中的 API 端点来验证身份认证服务的连通性:

‎下面的端点列表可能会有所不同,具体取决于 OpenStack 组件的安装。‎

openstack catalog list

openstack image list

‎检查单元格和放置 API 是否成功工作:

nova-status upgrade check

十、网络服务Neutron

OpenStack Networking(neutron),允许创建、插入接口设备,这些设备由其他的OpenStack服务管理。插件式的实现可以容纳不同的网络设备和软件,为OpenStack架构与部署提供了灵活性。

安装并配置控制节点

在你配置OpenStack网络(neutron)服务之前,你必须为其创建一个数据库,服务凭证和API端点。

完成下面的步骤以创建数据库:

用数据库连接客户端以 root 用户连接到数据库服务器:

mysql -u root -p

创建neutron 数据库:

CREATE DATABASE neutron;

neutron 数据库授予合适的访问权限:

GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';

使用合适的密码替换NEUTRON_DBPASS

退出数据库客户端。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

要创建服务证书,完成这些步骤:

创建neutron用户:

openstack user create --domain default --password NEUTRON_PASS neutron

openstack role add --project service --user neutron admin

这个命令执行后没有输出。

创建neutron服务实体:

openstack service create --name neutron --description "OpenStack Networking" network

创建网络服务API端点:

openstack endpoint create --region RegionOne network public http://controller:9696

openstack endpoint create --region RegionOne network internal http://controller:9696

openstack endpoint create --region RegionOne network admin http://controller:9696

配置提供者网络

controller 节点安装和配置网络组件。

安装组件

yum install -y openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables

配置服务组件

Networking 服务器组件的配置包括数据库、认证机制、消息队列、拓扑变化通知和插件。

默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

编辑/etc/neutron/neutron.conf 文件并完成如下操作:

vim /etc/neutron/neutron.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron

使用你设置的数据库密码替换 NEUTRON_DBPASS

[DEFAULT]部分,启用ML2插件并禁用其他插件:

[DEFAULT]
# ...
core_plugin = ml2
service_plugins =

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

用你在RabbitMQ中为openstack选择的密码替换 “RABBIT_PASS”。

在 “[DEFAULT]” 和 “[keystone_authtoken]” 部分,配置认证服务访问:

[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASS

NEUTRON_PASS 替换为你在认证服务中为 neutron 用户选择的密码。

[DEFAULT][nova]部分,配置网络服务来通知计算节点的网络拓扑变化:

[DEFAULT]
# ...
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
[nova]
# ...
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASS

使用你在身份认证服务中设置的nova 用户的密码替换NOVA_PASS

[oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
# ...
lock_path = /var/lib/neutron/tmp

配置 Modular Layer 2 (ML2) 插件

ML2插件使用Linuxbridge机制来为实例创建layer-2虚拟网络基础设施

编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件并完成以下操作:

vim /etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]部分,启用flat和VLAN网络:

[ml2]
# ...
type_drivers = flat,vlan

[ml2]部分,禁用私有网络:

[ml2]
# ...
tenant_network_types =

[ml2]部分,启用Linuxbridge机制:

[ml2]
# ...
mechanism_drivers = linuxbridge

[ml2] 部分,启用端口安全扩展驱动:

[ml2]
# ...
extension_drivers = port_security

[ml2_type_flat]部分,配置公共虚拟网络为flat网络:

[ml2_type_flat]
# ...
flat_networks = provider

[securitygroup]部分,启用 ipset增加安全组的方便性:

[securitygroup]
# ...
enable_ipset = true

配置Linuxbridge代理

Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。

编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件并且完成以下操作:

vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]部分,将公共虚拟网络和公共物理网络接口对应起来:

[linux_bridge]
physical_interface_mappings = provider:ens33

ens33 替换为底层的物理公共网络接口

[vxlan]部分,禁止VXLAN覆盖网络:

[vxlan]
enable_vxlan = false

[securitygroup]部分,启用安全组并配置 Linux 桥接 iptables防火墙驱动:

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

配置DHCP代理

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

编辑/etc/neutron/dhcp_agent.ini文件并完成下面的操作:

vim /etc/neutron/dhcp_agent.ini

[DEFAULT]部分,配置Linuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在公共网络上的实例就可以通过网络来访问元数据

[DEFAULT]
# ...
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

配置元数据代理

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

编辑/etc/neutron/metadata_agent.ini文件并完成以下操作:

vim /etc/neutron/metadata_agent.ini

[DEFAULT] 部分,配置元数据主机以及共享密码:

[DEFAULT]
# ...
nova_metadata_ip = controller
metadata_proxy_shared_secret = METADATA_SECRET

用你为元数据代理设置的密码替换 METADATA_SECRET

配置计算服务来使用网络服务

编辑/etc/nova/nova.conf文件并完成以下操作:

vim /etc/nova/nova.conf

[neutron]部分,配置访问参数,启用元数据代理并设置密码:

[neutron]
# ...
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET

NEUTRON_PASS 替换为你在认证服务中为 neutron 用户选择的密码。

使用你为元数据代理设置的密码替换METADATA_SECRET

完成安装

网络服务初始化脚本需要一个超链接 /etc/neutron/plugin.ini指向ML2插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini“。如果超链接不存在,使用下面的命令创建它:

ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

同步数据库:

su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron

数据库的同步发生在 Networking 之后,因为脚本需要完成服务器和插件的配置文件。

重启计算API 服务:

systemctl restart openstack-nova-api.service

当系统启动时,启动 Networking 服务并配置它启动。

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

安装和配置计算节点

计算节点处理实例的连接和 security groups 。

安装组件

yum install -y openstack-neutron-linuxbridge ebtables ipset

配置通用组件

Networking 通用组件的配置包括认证机制、消息队列和插件。

默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

编辑/etc/neutron/neutron.conf 文件并完成如下操作:

vim /etc/neutron/neutron.conf

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

用你在RabbitMQ中为openstack选择的密码替换 “RABBIT_PASS”。

在 “[DEFAULT]” 和 “[keystone_authtoken]” 部分,配置认证服务访问:

[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = NEUTRON_PASS

NEUTRON_PASS 替换为你在认证服务中为 neutron 用户选择的密码。

[oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
# ...
lock_path = /var/lib/neutron/tmp

提供者网络

配置Linuxbridge代理

Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。

编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件并且完成以下操作:

vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini

[linux_bridge]部分,将公共虚拟网络和公共物理网络接口对应起来:

[linux_bridge]
physical_interface_mappings = provider:ens33

[vxlan]部分,禁止VXLAN覆盖网络:

[vxlan]
enable_vxlan = false

[securitygroup]部分,启用安全组并配置 Linux 桥接 iptables 防火墙驱动:

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

配置计算服务来使用网络服务

编辑/etc/nova/nova.conf文件并完成下面的操作:

vim /etc/nova/nova.conf

[neutron] 部分,配置访问参数:

[neutron]
# ...
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS

NEUTRON_PASS 替换为你在认证服务中为 neutron 用户选择的密码。

完成安装

重启计算服务:

systemctl restart openstack-nova-compute.service

启动Linuxbridge代理并配置它开机自启动:

systemctl enable neutron-linuxbridge-agent.service;systemctl start neutron-linuxbridge-agent.service

验证操作

在控制节点上执行这些命令。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

列出加载的扩展来验证neutron-server进程是否正常启动:

openstack extension list --network

列出代理以验证启动 neutron 代理是否成功:

openstack network agent list

十一、仪表盘Horizon.

Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务。

这个部署示例使用的是 Apache Web 服务器。

这个部分将描述如何在计算节点上安装和配置仪表板。

dashboard仅在核心服务中要求认证服务。你可以将dashboard与其他服务,如镜像服务、计算服务和网络服务等结合使用。你也可以在单击服务环境如对象存储中使用dashboard。

安全并配置组件

默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

安装软件包:

yum install -y openstack-dashboard

编辑文件 /etc/openstack-dashboard/local_settings 并完成如下动作:

vim /etc/openstack-dashboard/local_settings

compute1 节点上配置仪表盘以使用 OpenStack 服务:

OPENSTACK_HOST = "controller"

允许主机访问仪表板:‎

ALLOWED_HOSTS = ['*']

配置 memcached 会话存储服务:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

发现SESSION_ENGINE没有 我们自己新建一个

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': 'controller:11211',
    },
}

启用第3版认证API:

OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST

启用对域的支持

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

配置API版本:

OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}

将默认配置为通过仪表板创建的用户的默认域:

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"

通过仪表盘创建的用户默认角色配置为 user

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

禁用支持3层网络服务:

OPENSTACK_NEUTRON_NETWORK = {
    ...
    'enable_router': False,
    'enable_quotas': False,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
}

可以选择性地配置时区:

TIME_ZONE = "Asia/Shanghai"

完成安装

重启web服务器以及会话存储服务:

systemctl restart httpd.service

验证操作

验证仪表盘的操作。

在浏览器中输入 计算节点IP/dashboard访问仪表盘。

域:default

用户:admin

密码:ADMIN_PASS

十二、创建实例

创建虚拟网络

在启动实例之前,您必须创建必须的虚拟机网络设施。

创建提供者网络

在控制节点上,加载 admin 凭证来获取管理员能执行的命令访问权限:

. admin-openrc

创建网络:

openstack network create  --share --external \
  --provider-physical-network provider \
  --provider-network-type flat provider

在网络上创建一个子网:

//解析
openstack subnet create --network provider \
  --allocation-pool start=分配的第一个IP,end=配的最后一个IP \  这个范围不能包括任何已经使用的IP地址。
  --dns-nameserver DNS服务器IP --gateway 网关地址 \
  --subnet-range 掩码CIDR provider
openstack subnet create --network provider \
  --allocation-pool start=192.168.145.140,end=192.168.145.150 \
  --dns-nameserver 114.114.114.114 --gateway 192.168.145.2 \
  --subnet-range 192.168.145.0/24 provider

创建m1.nano类型

默认的最小规格的主机需要512 MB内存。对于环境中计算节点内存不足4 GB的,我们推荐创建只需要64 MB的m1.nano规格的主机。若单纯为了测试的目的,请使用m1.nano规格的主机来加载CirrOS镜像

openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano

生成一个键值对

在启动实例前,你必须添加一个公共密钥到计算服务。

导入demo项目凭证

. demo-openrc

生成密钥对并添加公钥:

ssh-keygen -q -N ""

回车一下

openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

验证公钥的添加:

openstack keypair list

增加安全组规则

默认情况下, default安全组适用于所有实例并且包括拒绝远程访问实例的防火墙规则。对诸如CirrOS这样的Linux镜像,我们推荐至少允许ICMP (ping) 和安全shell(SSH)规则。

添加规则到 default 安全组。

  • Permit ICMP (ping):

    openstack security group rule create --proto icmp default

  • 允许安全 shell (SSH) 的访问:

    openstack security group rule create --proto tcp --dst-port 22 default

启动一个实例

启动一台实例,您必须至少指定一个类型、镜像名称、网络、安全组、密钥和实例名称。

在控制节点上,获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. demo-openrc

一个实例指定了虚拟机资源的大致分配,包括处理器、内存和存储。

列出可用类型:

    openstack flavor list

列出可用镜像:

openstack image list

列出可用网络:

openstack network list

列出可用的安全组:

启动云主机

启动实例:

使用provider公有网络的ID替换PUBLIC_NET_ID

openstack server create --flavor m1.nano --image cirros \
  --nic net-id=PROVIDER_NET_ID --security-group default \
  --key-name mykey provider-instance

//PROVIDER_NET_ID填写openstack network list指令查出的网络ID
openstack server create --flavor m1.nano --image cirros \
  --nic net-id=cb9b69a8-5036-44cf-adb3-580a7df45dec --security-group default \
  --key-name mykey provider-instance

检查实例的状态:

openstack server list

Windows添加hosts

在Windows路径C:\Windows\System32\drivers\etc中找到hosts文件编辑它,鼠标右键,打开方式选择你熟悉的文档编辑器;

加入以下配置并保存:

控制节点IP controller
计算节点IP compute1
192.168.145.133 controller
192.168.145.134 compute1

使用虚拟控制台访问实例

获取会话URL并从web浏览器访问它:

openstack console url show provider-instance

登录后发现小问题booting from hard disk,我们解决它

在计算节点编辑nova.conf 文件

vim /etc/nova/nova.conf
[libvirt] 
... 
cpu_mode = none 
virt_type = qemu

重启Nova服务

systemctl restart openstack-nova-compute

在web页面可以看见刚才启动的实例,

再次访问实例,进行ping操作;

十三、块存储服务Cinder

块存储服务(cinder)为实例提供块存储。存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的。还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等。

典型情况下,块服务API和调度器服务运行在控制节点上。取决于使用的驱动,卷服务器可以运行在控制节点、计算节点或单独的存储节点。

这个部分描述如何在单独节点上安装和配置块设备存储服务,即 cinder。这个服务需要至少一个额外的存储节点,以向实例提供卷。

创建数据库

在控制节点完成下面的步骤以创建数据库:

用数据库连接客户端以 root 用户连接到数据库服务器:

mysql -u root -p

创建 cinder 数据库:

CREATE DATABASE cinder;

允许 cinder 数据库合适的访问权限:

GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';

用合适的密码替换 CINDER_DBPASS

服务证书

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

创建服务证书:

创建一个 cinder 用户:

openstack user create --domain default --password CINDER_PASS cinder

添加 admin 角色到 cinder 用户上。

openstack role add --project service --user cinder admin

‎创建cinderv2cinderv3服务实体

openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2

openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

块设备存储服务要求两个服务实体。

API 入口

创建块设备存储服务的 API 入口点:

openstack endpoint create --region RegionOne \
  volumev2 public http://controller:8776/v2/%\(project_id\)s

openstack endpoint create --region RegionOne \
  volumev2 internal http://controller:8776/v2/%\(project_id\)s

openstack endpoint create --region RegionOne \
  volumev2 admin http://controller:8776/v2/%\(project_id\)s

openstack endpoint create --region RegionOne \
  volumev3 public http://controller:8776/v3/%\(project_id\)s

openstack endpoint create --region RegionOne \
  volumev3 internal http://controller:8776/v3/%\(project_id\)s

openstack endpoint create --region RegionOne \
  volumev3 admin http://controller:8776/v3/%\(project_id\)s

块设备存储服务每个服务实体都需要端点。

安全并配置组件

安装软件包:

yum install -y openstack-cinder

编辑 /etc/cinder/cinder.conf,同时完成如下动作:

vim /etc/cinder/cinder.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

用你为块设备存储数据库选择的密码替换 CINDER_DBPASS

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。

[DEFAULT]”和 [keystone_authtoken] 部分,配置认证服务访问:

[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = CINDER_PASS

CINDER_PASS 替换为你在认证服务中为 cinder 用户选择的密码。

[DEFAULT 部分,配置my_ip 来使用控制节点的管理接口的IP 地址。

[DEFAULT]
# ...
my_ip = 控制节点IP地址

[oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp

初始化块设备服务的数据库:

su -s /bin/sh -c "cinder-manage db sync" cinder

忽略输出中任何不推荐使用的信息。

配置计算服务以使用块设备存储

在控制节点编辑文件 /etc/nova/nova.conf 并添加如下到其中:

vim /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne

完成安装

重启计算API 服务:

systemctl restart openstack-nova-api.service

启动块设备存储服务,并将其配置为开机自启:

systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service;systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service

安装并配置一个存储节点

这个部分描述怎样为块存储服务安装并配置存储节点。为简单起见,这里配置一个有一个空的本地块存储设备的存储节点。这个向导用的是 /dev/sdb,但是你可以为你特定的节点中替换成不同的值。

在你安装和配置块存储服务之前,你必须准备好存储设备新建主机或者虚拟机 这里我使用block1

Ⅱ. OpenStack-Ocata 服务器网络配置文章中hosts已经添加block1,请查看此文章对block1节点进行相关配置。

Ⅲ.OpenStack-Ocata 网络时间协议(NTP) 同步时间文章中对block1进行配置时间同步。

Ⅳ.OpenStack-Ocata 安装OpenStack包文章中查看更换YUM源目录,进行更换YUM源。

安装基本工具

yum install -y vim net-tools tree lrzsz bash-completion wget

配置网络接口

编辑网卡配置/etc/sysconfig/network-scripts/ifcfg-ens33文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
#UUID="86fb4d7c-a361-4f6a-b082-15e7fecf0107"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="块存储节点IP"
NETMASK="255.255.255.0"
GATEWAY="服务器或者虚拟机的网关"
DNS1="114.114.114.114"

配置名称解析

设置节点主机名为 block1

hostnamectl set-hostname block1
hostname

编辑/etc/hosts文件

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# controller
控制节点IP         controller

# compute1
计算节点IP         compute1

# block1
块存储节点IP         block1

# object1
#192.168.145.136         object1

# object2
#192.168.145.137         object2

block1节点上创建一个硬盘,如下图:

block1节点上扫描一下挂载的硬盘

echo "- - -" > /sys/class/scsi_host/host0/scan

输入lsblk后如果没有扫描到新硬盘,请扫描/sys/class/scsi_host/下的所以文件夹

我们会在host文件夹下发现host0/host1/ host2/ 我们一个一个扫描,直到lsblk命令出现新的硬盘。

echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan

发现sdb30G的硬盘。

安装工具包

安装 LVM 包:

yum install lvm2

启动LVM的metadata服务并且设置该服务随系统启动:

systemctl enable lvm2-lvmetad.service;systemctl start lvm2-lvmetad.service

使用pvcreatesdb创建为物理卷

pvcreate /dev/sdb

创建 LVM 卷组 cinder-volumes

vgcreate cinder-volumes /dev/sdb

块存储服务会在这个卷组中创建逻辑卷。

编辑/etc/lvm/lvm.conf文件

只有实例可以访问块存储卷组。但是,底层的操作系统管理着与这些卷相关联的设备。默认情况下,LVM卷扫描工具会扫描/dev 目录,查找包含卷的块存储设备。如果项目在他们的卷上使用了LVM,扫描工具便会在检测到这些卷时尝试缓存它们,这可能会在底层操作系统和项目卷上产生各种问题。所以您必须重新配置LVM,让它扫描仅包含cinder-volume卷组的设备。

vim /etc/lvm/lvm.conf

搜索devices部分,添加一个过滤器,只接受/dev/sdb设备,拒绝其他所有设备:
存储节点:

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

使用了LVM,所以我们需要在计算节点上修改/etc/lvm/lvm.conf文件

计算节点:

vim /etc/lvm/lvm.conf
devices {
#...
filter = [ "a/sda/", "r/.*/"]

每个过滤器组中的元素都以a开头,即为 **accept**,或以 r 开头,即为**reject**,并且包括一个设备名称的正则表达式规则。过滤器组必须以r/.*/结束,过滤所有保留设备。

[scode type=”red”]
解释:

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

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

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

devices {
#...
filter = [ "a/sda/", "r/.*/"]

[/scode]

前往计算节点查看是否使用了 LVM

安全并配置组件

存储节点安装软件包:

yum install -y openstack-cinder targetcli python-keystone

编辑 /etc/cinder/cinder.conf,同时完成如下动作:

vim /etc/cinder/cinder.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

用你为块设备存储数据库选择的密码替换 CINDER_DBPASS

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。

[DEFAULT][keystone_authtoken]部分,配置认证服务访问:

[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = CINDER_PASS

CINDER_PASS 替换为你在认证服务中为 cinder 用户选择的密码。

[DEFAULT] 部分,配置 my_ip 选项:

[DEFAULT]
# ...
my_ip = 存储节点IP 地址

[lvm]部分中,配置LVM后端,包括LVM驱动,cinder-volumes 卷组 ,iSCSI 协议和适当的 iSCSI服务。如果 [lvm]部分不存在,则创建它:

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm

[DEFAULT] 部分,启用 LVM 后端:

[DEFAULT]
# ...
enabled_backends = lvm

[DEFAULT] 区域,配置镜像服务 API 的位置:

[DEFAULT]
# ...
glance_api_servers = http://controller:9292

[oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp

完成安装

启动块存储卷服务及其依赖的服务,并将其配置为随系统启动:

systemctl enable openstack-cinder-volume.service target.service;systemctl start openstack-cinder-volume.service target.service

验证操作

验证块设备存储服务的操作,在控制节点上执行这些命令。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

列出服务组件以验证是否每个进程都成功启动:

openstack volume service list

现在OpenStack 环境中已经包含了块设备存储服务。

十四、Cinder对接NFS共享存储

对Cinder使用NFS做后端存储

cinder服务和nova服务很相似。

nova:不提供虚拟化,支持多种虚拟化技术,kvm,xen,qemu,lxc

cinder:不提供存储,支持多种存储技术,lvm,nfs,glusterFS,ceph

控制节点安装NFS(服务端)

安装包

yum install nfs-utils rpcbind -y

创建共享目录

mkdir /nfsdata/
ll -d /nfsdata/

修改配置文件

vim /etc/exports
/nfsdata *(rw,no_root_squash)
cat /etc/exports

启动服务

systemctl start nfs
systemctl enable nfs

查看服务状态

systemctl status rpcbind nfs

配置存储节点(客户端)

安装包

yum install nfs-utils -y

修改/etc/cinder/cinder.conf配置文件

vim /etc/cinder/cinder.conf

在开头[DEFAULT]enabled_backends新加,nfs

enabled_backends = lvm,nfs

搜索[lvm]添加:

volume_backend_name = Openstack-lvm

在这新加[nfs]

[nfs]
volume_backend_name = openstack-NFS
volume_driver = cinder.volume.drivers.nfs.NfsDriver
nfs_shares_config = /etc/cinder/nfs_shares

编辑nfs_shares文件

vim /etc/cinder/nfs_shares
控制节点IP:/nfsdata

设置文件所有者和文件关联组

chown -R cinder:cinder /etc/cinder/nfs_shares

挂载共享

mount -t nfs 控制节点IP:/nfsdata /mnt

重启cinder-volume服务

systemctl restart openstack-cinder-volume.service 
systemctl status openstack-cinder-volume.service

创建磁盘类型并关联

控制节点进行

创建类型:

. admin-openrc
cinder type-create lvm
cinder type-create nfs

将磁盘类型与磁盘关联:

cinder type-key lvm set volume_backend_name=Openstack-lvm
cinder type-key nfs set volume_backend_name=openstack-NFS

控制节点验证操作

source admin-openrc 
cinder service-list

发现 block1@nfs

查看NFS类型卷

管理员 –> 系统 –> 里查看类型

卷类型 –> –> 查看扩展规格 查看卷类型扩展规格

项目 –> 计算 –> 创建卷

十五、对象存储Object Storage

对象存储是一个多租户对象存储系统,具有高度的扩展性。

本次使用的为CentOS操作系统。

在每个存储节点上执行。

配置网络

查看此文章:OpenStack-Ocata 服务器网络配置

时间同步

查看此文章:OpenStack-Ocata 网络时间协议(NTP) 同步时间

安装软件包

查看此文章:OpenStack-Ocata 安装OpenStack包

安装和配置控制器节点

代理服务依赖于身份验证和授权机制,例如身份服务。与其他服务不同的是,它还提供了一种内部机制,允许它在没有任何其他 OpenStack 服务的情况下运行。在配置对象存储服务之前,必须创建服务凭证和 API 端点。

对象存储服务不使用控制器节点上的数据库。因为,它在每个存储节点上使用分布式数据库。

使用admin-openrc脚本获取管理员权限

. admin-openrc

创建swift用户

openstack user create --domain default --password SWIFT_PASS swift

密码为SWIFT_PASS

admin角色添加到swift用户:

openstack role add --project service --user swift admin

此命令不提供任何输出。

创建swift服务实体:

openstack service create --name swift --description "OpenStack Object Storage" object-store

创建对象存储服务 API 端点:

openstack endpoint create --region RegionOne \
  object-store public http://controller:8080/v1/AUTH_%\(project_id\)s

openstack endpoint create --region RegionOne \
  object-store internal http://controller:8080/v1/AUTH_%\(project_id\)s

openstack endpoint create --region RegionOne \
  object-store admin http://controller:8080/v1

非必要选项:

我有多添加endpoint,如果和我一样请查看 swiftendpoint 是否多余

openstack endpoint list | grep swift

请使用openstack endpoint delete删除它

openstack endpoint delete ID

安装和配置组件

yum install -y openstack-swift-proxy python-swiftclient python-keystoneclient python-keystonemiddleware

完整的 OpenStack 环境已经包含其中的一些包。

从opendev源存储库中获取代理服务配置文件:

opendev地址:

curl -o /etc/swift/proxy-server.conf https://opendev.org/openstack/swift/raw/branch/master/etc/proxy-server.conf-sample

编辑/etc/swift/proxy-server.conf文件

vim /etc/swift/proxy-server.conf

[DEFAULT]中,绑定端口、用户和配置目录:

[DEFAULT]
bind_port = 8080
swift_dir = /etc/swift
user = swift

[pipeline:main]中,删除tempurltempauth模块并添加authtokenkeystoneauth 模块:

[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server

不要更改模块的顺序。

[app:proxy-server]中,启用自动帐户创建:

[app:proxy-server]
use = egg:swift#proxy
account_autocreate = True

[filter:keystoneauth]中,配置操作员角色:

[filter:keystoneauth]
use = egg:swift#keystoneauth
operator_roles = admin,user

[filter:authtoken]中,配置身份服务访问:

[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = swift
password = SWIFT_PASS
delay_auth_decision = True

替换为您在身份服务中SWIFT_PASS为用户选择的密码。

[filter:cache]中,配置memcached位置:

[filter:cache]
use = egg:swift#memcache
memcache_servers = controller:11211

安装和配置存储节点

在存储节点上安装和配置对象存储服务之前,必须准备好2台存储设备,并且加上2块硬盘。

挂载后在节点上扫描一下挂载的硬盘

echo "- - -" > /sys/class/scsi_host/host0/scan

输入lsblk后如果没有扫描到新硬盘,请扫描/sys/class/scsi_host/下的所以文件夹

img

我们会在host文件夹下发现host0/host1/ host2/ 我们一个一个扫描,直到lsblk命令出现新的硬盘。

echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan

在每个存储节点上执行。

安装支持的实用程序包:

yum install -y xfsprogs rsync

/dev/sdb将和设备格式化/dev/sdc为 XFS:

mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc

创建挂载点目录结构:

mkdir -p /srv/node/sdb
mkdir -p /srv/node/sdc

编辑/etc/fstab文件并将以下内容添加到其中:

vim /etc/fstab
/dev/sdb /srv/node/sdb xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
/dev/sdc /srv/node/sdc xfs noatime,nodiratime,nobarrier,logbufs=8 0 2

挂载目录:

mount /srv/node/sdb
mount /srv/node/sdc

创建或编辑/etc/rsyncd.conf文件以包含以下内容:

vim /etc/rsyncd.conf
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = 存储节点IP地址

[account]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/account.lock

[container]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/container.lock

[object]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/object.lock

启动rsyncd服务并将其配置为在系统启动时启动:

systemctl enable rsyncd.service;systemctl start rsyncd.service

安装和配置组件

安装软件包:

yum install -y openstack-swift-account openstack-swift-container openstack-swift-object

从对象存储源存储库中获取记帐、容器和对象服务配置文件:

curl -o /etc/swift/account-server.conf https://opendev.org/openstack/swift/raw/branch/master/etc/account-server.conf-sample
curl -o /etc/swift/container-server.conf https://opendev.org/openstack/swift/raw/branch/master/etc/container-server.conf-sample
curl -o /etc/swift/object-server.conf https://opendev.org/openstack/swift/raw/branch/master/etc/object-server.conf-sample

编辑/etc/swift/account-server.conf文件并完成以下操作:

vim /etc/swift/account-server.conf

配置[DEFAULT]绑定IP地址、绑定端口、用户、配置目录、挂载点目录:

[DEFAULT]
...
bind_ip = 存储节点的IP地址
bind_port = 6202
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True

在该[pipeline:main]部分中,启用相应的模块:

[pipeline:main]
pipeline = healthcheck recon account-server

在该[filter:recon]部分中,配置缓存目录:

[filter:recon]
use = egg:swift#recon
...
recon_cache_path = /var/cache/swift

编辑/etc/swift/container-server.conf文件并完成以下操作:

vim /etc/swift/container-server.conf

配置[DEFAULT]绑定IP地址、绑定端口、用户、配置目录、挂载点目录:

[DEFAULT]
...
bind_ip = 存储节点的IP地址
bind_port = 6201
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True

在该[pipeline:main]部分中,启用相应的模块:

[pipeline:main]
pipeline = healthcheck recon container-server

在该[filter:recon]部分中,配置缓存目录:

[filter:recon]
use = egg:swift#recon
...
recon_cache_path = /var/cache/swift

编辑/etc/swift/object-server.conf文件并完成以下操作:

vim /etc/swift/object-server.conf

配置[DEFAULT]绑定IP地址、绑定端口、用户、配置目录、挂载点目录:

[DEFAULT]
...
bind_ip = 存储节点的IP地址
bind_port = 6200
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True

在该[pipeline:main]部分中,启用相应的模块:

[pipeline:main]
pipeline = healthcheck recon object-server

在该[filter:recon]部分中,配置缓存和锁定目录:

[filter:recon]
use = egg:swift#recon
...
recon_cache_path = /var/cache/swift
recon_lock_path = /var/lock

确保正确拥有挂载点目录结构:

chown -R swift:swift /srv/node

创建recon目录并确保它的正确所有权:

mkdir -p /var/cache/swift
chown -R root:swift /var/cache/swift
chmod -R 775 /var/cache/swift

创建初始帐户、容器和对象

创建账户圈

控制节点使用帐户圈来维护容器列表。

切换到/etc/swift目录。

cd /etc/swift

创建基础account.builder文件:

swift-ring-builder account.builder create 10 3 1

将每个存储节点添加到圈中:

swift-ring-builder account.builder \
  add --region 1 --zone 1 --ip 储节点IP地址 --port 6202 \
  --device 存储设备名称 --weight 权重

例如我的:

swift-ring-builder account.builder add --region 1 --zone 1 --ip 192.168.145.136 --port 6202 --device sdb --weight 100
swift-ring-builder account.builder add --region 1 --zone 1 --ip 192.168.145.136 --port 6202 --device sdc --weight 100
swift-ring-builder account.builder add --region 1 --zone 2 --ip 192.168.145.137 --port 6202 --device sdc --weight 100
swift-ring-builder account.builder add --region 1 --zone 2 --ip 192.168.145.137 --port 6202 --device sdb --weight 100

验证圈内容:

swift-ring-builder account.builder

重新平衡圈:

swift-ring-builder account.builder rebalance

创建容器圈

切换到/etc/swift目录。

cd /etc/swift

创建基础container.builder文件:

swift-ring-builder container.builder create 10 3 1

将每个存储节点添加到圈中:

swift-ring-builder container.builder \
  add --region 1 --zone 1 --ip 存储节点IP地址 --port 6201 \
  --device 设备名称 --weight 权重

例如我的:

swift-ring-builder container.builder add \
  --region 1 --zone 1 --ip 192.168.145.136 --port 6201 --device sdb --weight 100
swift-ring-builder container.builder add \
  --region 1 --zone 1 --ip 192.168.145.136 --port 6201 --device sdc --weight 100
swift-ring-builder container.builder add \
  --region 1 --zone 2 --ip 192.168.145.137 --port 6201 --device sdb --weight 100
swift-ring-builder container.builder add \
  --region 1 --zone 2 --ip 192.168.145.137 --port 6201 --device sdc --weight 100

验证内容:

swift-ring-builder container.builder

重新平衡:

swift-ring-builder container.builder rebalance

创建对象圈

切换到/etc/swift目录。

cd /etc/swift

创建基础object.builder文件:

swift-ring-builder object.builder create 10 3 1

将每个存储节点添加到圈中:

swift-ring-builder object.builder \
  add --region 1 --zone 1 --ip 储节点IP地址 --port 6200 \
  --device 存储设备名称 --weight 权重

例如我的:

swift-ring-builder object.builder add \
  --region 1 --zone 1 --ip 192.168.145.136 --port 6200 --device sdb --weight 100
swift-ring-builder object.builder add \
  --region 1 --zone 1 --ip 192.168.145.136 --port 6200 --device sdc --weight 100
swift-ring-builder object.builder add \
  --region 1 --zone 2 --ip 192.168.145.137 --port 6200 --device sdb --weight 100
swift-ring-builder object.builder add \
  --region 1 --zone 2 --ip 192.168.145.137 --port 6200 --device sdc --weight 100

验证圈内容:

swift-ring-builder object.builder

重新平衡圈:

swift-ring-builder object.builder rebalance

account.ring.gzcontainer.ring.gzobject.ring.gz文件复制到每个存储节点的/etc/swift目录中。

scp *.gz 192.168.145.136:/etc/swift/
scp *.gz 192.168.145.137:/etc/swift/

完成安装

在控制节点下载配置文件至/etc/swift/目录并命名为swift.conf

curl -o /etc/swift/swift.conf \
  https://cdn.thtown.cn/OpenStack/swift/swift.conf-sample

编辑/etc/swift/swift.conf文件:

vim /etc/swift/swift.conf

[swift-hash]中,为环境配置哈希路径前缀和后缀。

[swift-hash]
...
swift_hash_path_suffix = HASH_PATH_SUFFIX
swift_hash_path_prefix = HASH_PATH_SUFFIX

对这些价值观保密,不要更改或丢失它们。

[storage-policy:0]中,配置默认存储策略:

[storage-policy:0]
...
name = Policy-0
default = yes

swift.conf文件复制到存储节点/etc/swift目录。

scp /etc/swift/swift.conf 192.168.145.136:/etc/swift/
scp /etc/swift/swift.conf 192.168.145.137:/etc/swift/

在控制器节点和运行代理服务的任何其他节点上,启动对象存储代理服务及其依赖项,并将它们配置为在系统启动时启动:

systemctl enable openstack-swift-proxy.service memcached.service;systemctl start openstack-swift-proxy.service memcached.service

在存储节点上,启动对象存储服务并将它们配置为在系统启动时启动:

systemctl enable openstack-swift-account.service openstack-swift-account-auditor.service \
  openstack-swift-account-reaper.service openstack-swift-account-replicator.service
systemctl start openstack-swift-account.service openstack-swift-account-auditor.service openstack-swift-account-reaper.service openstack-swift-account-replicator.service
systemctl enable openstack-swift-container.service \
  openstack-swift-container-auditor.service openstack-swift-container-replicator.service \
  openstack-swift-container-updater.service
systemctl start openstack-swift-container.service openstack-swift-container-auditor.service openstack-swift-container-replicator.service openstack-swift-container-updater.service
systemctl enable openstack-swift-object.service openstack-swift-object-auditor.service \
  openstack-swift-object-replicator.service openstack-swift-object-updater.service
systemctl start openstack-swift-object.service openstack-swift-object-auditor.service openstack-swift-object-replicator.service openstack-swift-object-updater.service

验证操作

在控制器节点上执行这些步骤。

. admin-openrc
swift stat

如果你的验证出现如下错误:

[root@controller swift]# swift stat
HTTPConnectionPool(host='controller', port=8080): Max retries exceeded with url: /v1/AUTH_ce0e09a6236a49cd83b0818f89399885 (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f3a009c4290>: Failed to establish a new connection: [Errno 111] Connection refused',))

查看状态:

systemctl status openstack-swift-proxy.service

出现次错误请查看 proxy-server.conf 文件 vim /etc/swift/proxy-server.conf 和此文章:proxy-server.conf 对比

输入 cat 文件 | grep -v '^#' | grep -v '^$' > 文件.bak 删除注释行和空行

创建container1容器:

openstack container create container1

将测试文件上传到container1容器:

touch 1.txt
openstack object create container1 1.txt

image-20220525190906081

替换FILE为要上传到 container1容器的本地文件的名称。

列出container1容器中的文件:

openstack object list container1

container1容器下载测试文件:

openstack object save container1 1.txt

替换FILE为上传到 container1容器的文件的名称。

十六、将glance镜像保存在对象存储中

创建一个容器

openstack container create glance

查看glance容器状态:

swift stat glance

进行分片储存

cirros-0.4.0-x86_64-disk.img 镜像文件 分片上传到 glance 容器

swift upload glance -S 10000000 cirros-0.4.0-x86_64-disk.img
swift stat glance cirros-0.4.0-x86_64-disk.img

查看数据片

swift list glance_segments

前往WEB端 查看:

后端存储

在控制节点修改/etc/glance/glance-api.conf 文件

vim /etc/glance/glance-api.conf 
[glance_store]
#stores = file,http
#default_store = file
filesystem_store_datadir = /var/lib/glance/images/
default_store = swift
stores=glance.store.filesystem.Store,glance.store.swift.Store
swift_store_auth_address=http://controller:5000/v3
swift_store_create_container_on_put=True
swift_store_region=RegionOne
swift_store_endpoint_type=internalURL
swift_store_container=glance
swift_store_user=glance
swift_store_key=000000
swift_store_multi_tenant=True
swift_store_admin_tenants=service

保存退出,重启所有服务:

systemctl restart openstack-*

上传镜像:

glance image-create --name "test_glance" --disk-format qcow2 --container-format bare --progress --file /root/cirros-0.4.0-x86_64-disk.img

查看结果

十七、heat编排服务

Heat是一个基于模板来编排复合云应用的服务。Heat 目前支持两种格式的模板,一种是基于 JSON 格式的 CFN 模板,另外一种是基于 YAML格式的 HOT 模板。CFN 模板主要是为了保持对 AWS 的兼容性。HOT 模板是Heat 自有的,资源类型更加丰富,更能体现出 Heat 特点的模板。

我们在控制节点进行部署。

数据和角色准备

创建数据库

root用户登录数据库:

mysql -u root -p

创建heat数据库:

CREATE DATABASE heat;

heat数据库授予访问权限:

GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'HEAT_DBPASS';
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'HEAT_DBPASS';

替换HEAT_DBPASS为合适的密码。

退出数据库

. admin-openrc

创建服务凭证

创建heat用户:

openstack user create --domain default --password HEAT_PASS heat

admin角色添加到heat用户:

openstack role add --project service --user heat admin

创建heatheat-cfn服务实体:

openstack service create --name heat --description "Orchestration" orchestration

openstack service create --name heat-cfn --description "Orchestration"  cloudformation

创建编排服务 API 端点

openstack endpoint create --region RegionOne orchestration public http://controller:8004/v1/%\(tenant_id\)s

openstack endpoint create --region RegionOne orchestration internal http://controller:8004/v1/%\(tenant_id\)s

openstack endpoint create --region RegionOne orchestration admin http://controller:8004/v1/%\(tenant_id\)s

openstack endpoint create --region RegionOne cloudformation public http://controller:8000/v1

openstack endpoint create --region RegionOne cloudformation internal http://controller:8000/v1

openstack endpoint create --region RegionOne cloudformation admin http://controller:8000/v1

身份服务管理堆栈

为堆栈创建heat包含项目和用户的域:

openstack domain create --description "Stack projects and users" heat

创建heat_domain_admin用户来管理heat域中的项目和用户:

openstack user create --domain heat --password HEAT_DOMAIN_PASS heat_domain_admin

admin角色添加到域中的heat_domain_admin用户 heat,以启用用户的管理堆栈管理权限heat_domain_admin

openstack role add --domain heat --user-domain heat --user heat_domain_admin admin

创建heat_stack_owner角色:

openstack role create heat_stack_owner

heat_stack_owner角色添加到demo项目和用户以启用用户的堆栈管理demo

openstack role add --project demo --user demo heat_stack_owner

创建heat_stack_user角色:

openstack role create heat_stack_user

安装和配置组件

安装软件包:

yum install -y openstack-heat-api openstack-heat-api-cfn openstack-heat-engine

编辑/etc/heat/heat.conf文件:

可选操作

备份文件

cp /etc/heat/heat.conf /etc/heat/heat.conf.bak

输入 cat 文件 | grep -v '^#' | grep -v '^$' > 文件.bak 删除注释行和空行

cat /etc/heat/heat.conf.bak | grep -v '^#' | grep -v '^

vim /etc/heat/heat.conf

[database]部分中,配置数据库访问:

[database]
connection = mysql+pymysql://heat:HEAT_DBPASS@controller/heat

[DEFAULT]部分中,配置RabbitMQ消息队列访问:

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller

[keystone_authtoken][trustee][clients_keystone][ec2authtoken]部分中,配置身份服务访问:

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = heat
password = HEAT_PASS

找一处自己将[keystone_authtoken]添加

[trustee]
auth_type = password
auth_url = http://controller:35357
username = heat
password = HEAT_PASS
user_domain_name = default

[clients_keystone]
auth_uri = http://controller:35357

[ec2authtoken]
auth_uri = http://controller:5000

在该[DEFAULT]部分中,配置元数据和等待条件 URL:

[DEFAULT]
heat_metadata_server_url = http://controller:8000
heat_waitcondition_server_url = http://controller:8000/v1/waitcondition

在该[DEFAULT]部分中,配置堆栈域和管理凭据:

[DEFAULT]
stack_domain_admin = heat_domain_admin
stack_domain_admin_password = HEAT_DOMAIN_PASS
stack_user_domain_name = heat

填充编排数据库:

su -s /bin/sh -c "heat-manage db_sync" heat

完成安装

启动 Orchestration 服务并将它们配置为在系统启动时启动:

systemctl enable openstack-heat-api.service openstack-heat-api-cfn.service openstack-heat-engine.service

systemctl start openstack-heat-api.service openstack-heat-api-cfn.service openstack-heat-engine.service

验证操作

在控制器节点上执行这些命令。

获取admin租户凭据:

. admin-openrc

列出服务组件以验证每个进程的成功启动和注册:

openstack orchestration service list

启动实例

查看实例类型

openstack flavor list

如下图为 m1.nano记住它,我们要用。

查看密钥

openstack keypair list

如下图为 mykey2记住它,我们要用。

创建模板

创建demo-template.yml并且修改它:

注意汉字标注!!

heat_template_version: 2015-10-15
description: Launch a basic instance with CirrOS image using the
             ``刚才查到的类型 我的是m1.nano`` flavor, ``刚才查到的密钥 我的是mykey2`` key,  and one network.

parameters:
  NetID:
    type: string
    description: Network ID to use for the instance.

resources:
  server:
    type: OS::Nova::Server
    properties:
      image: cirros
      flavor: 刚才查到的类型 我的是m1.nano
      key_name: 刚才查到的密钥 我的是mykey2
      networks:
      - network: { get_param: NetID }

outputs:
  instance_name:
    description: Name of the instance.
    value: { get_attr: [ server, name ] }
  instance_ip:
    description: IP address of the instance.
    value: { get_attr: [ server, first_address ] }

注意上面只是说明!

vim demo-template.yml

完整的:

heat_template_version: 2015-10-15
description: Launch a basic instance with CirrOS image using the
             ``m1.nano`` flavor, ``mykey2`` key,  and one network.

parameters:
  NetID:
    type: string
    description: Network ID to use for the instance.

resources:
  server:
    type: OS::Nova::Server
    properties:
      image: cirros
      flavor: m1.nano
      key_name: mykey2
      networks:
      - network: { get_param: NetID }

outputs:
  instance_name:
    description: Name of the instance.
    value: { get_attr: [ server, name ] }
  instance_ip:
    description: IP address of the instance.
    value: { get_attr: [ server, first_address ] }

创建堆栈

确定可用网络。

openstack network list

此输出可能与您的环境不同,只创建了提供者网络。

设置NET_ID环境变量以反映网络的 ID。例如,使用提供商网络:

export NET_ID=$(openstack network list | awk '/ provider / { print $2 }')

在提供商网络上创建一个包含一个 CirrOS 实例的堆栈:

openstack stack create -t demo-template.yml --parameter "NetID=$NET_ID" stack

验证:

openstack stack list

显示实例的名称和 IP 地址,并与 OpenStack 客户端的输出进行比较:

openstack stack output show --all stack

openstack server list

删除堆栈。

openstack stack delete --yes stack

> /etc/heat/heat.conf

 

[database]部分中,配置数据库访问:

 

[DEFAULT]部分中,配置RabbitMQ消息队列访问:

 

[keystone_authtoken][trustee][clients_keystone][ec2authtoken]部分中,配置身份服务访问:

 

找一处自己将[keystone_authtoken]添加

 

 

 

在该[DEFAULT]部分中,配置元数据和等待条件 URL:

 

在该[DEFAULT]部分中,配置堆栈域和管理凭据:

 

填充编排数据库:

 

完成安装

启动 Orchestration 服务并将它们配置为在系统启动时启动:

 
 

验证操作

在控制器节点上执行这些命令。

获取admin租户凭据:

 

列出服务组件以验证每个进程的成功启动和注册:

 

启动实例

查看实例类型

 

如下图为 m1.nano记住它,我们要用。

查看密钥

 

如下图为 mykey2记住它,我们要用。

创建模板

创建demo-template.yml并且修改它:

注意汉字标注!!

 

注意上面只是说明!

 

完整的:

 

创建堆栈

确定可用网络。

 

此输出可能与您的环境不同,只创建了提供者网络。

设置NET_ID环境变量以反映网络的 ID。例如,使用提供商网络:

 

在提供商网络上创建一个包含一个 CirrOS 实例的堆栈:

 

验证:

 

显示实例的名称和 IP 地址,并与 OpenStack 客户端的输出进行比较:

 
 

删除堆栈。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞2322 分享
评论 抢沙发

请登录后发表评论

    赶紧收藏我们,查看更多心仪的内容?按Ctrl+D收藏我们 或 发现更多