企业运维之 openstack 的介绍以及组件搭建
1. openstack 的介绍
OpenStack是一个云操作系统,它控制整个数据中心的计算、存储和网络资源的大型池,所有这些都通过具有通用身份验证机制的api进行管理和配置。
还提供了一个仪表板,允许管理员控制,同时允许用户通过web界面提供资源。
除了标准的基础设施即服务功能外,其他组件还提供编排、故障管理和服务管理等服务,以确保用户应用程序的高可用性。
整个OpenStack是由控制节点,计算节点,网络节点,存储节点四大部分组成。
openstack重要集成组件:
Nova - 计算服务:是一个完整的 OpenStack 计算资源管理和访问工具,负责处理规划、创建和删除操作。
Neutron-网络服务:Neutron 能够连接其他 OpenStack 服务并连接网络。
Swift - 对象存储服务: 是一种高度容错的对象存储服务,使用 RESTful API 来存储和检索非结构数据对象。
Cinder-块存储服务:通过自助服务 API 访问持久块存储。
Glance - 镜像服务:Glance 可存储和检索多个位置的虚拟机磁盘镜像。
Keystone - 认证服务:Keystone 认证所有 OpenStack 服务并对其进行授权。同时,它也是所有服务的端点目录。
Horizon - UI服务
Ceilometer-监控服务:计费
Heat-集群服务:编排
dashboard:web管理界面
OpenStack 中项目
OpenStack 架构由大量开源项目组成。其中包含 6 个稳定可靠的核心服务,用于处理计算、网络、存储、身份和镜像; 同时,还为用户提供了十多种开发成熟度各异的可选服务。OpenStack 的 6 个核心服务主要担纲系统的基础架构,其余项目则负责管理控制面板、编排、裸机部署、信息传递、容器及统筹管理等操作。
2. openstack 的搭建
此处需要新开一个虚拟机至少4G内存;双网卡;CPU 设为直通: host-passthrough
是为了虚拟机里支持 kvm 硬件虚拟化。
此处直接访问 openstack 的官网来看其相关设置以及配置;
此处我们选择适用于 centos7 和 linux7 的对应版本;
3. 控制结点
- 网卡配置
设定网卡信息和网关,查看 ip 和网关;激活第二块网卡。
[root@ops1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.25.25.250 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
172.25.15.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
[root@server1 ~]# cd /etc/sysconfig/network-scripts/
在该目录下查看有 ifcfg-eth 文件,
如果没有需要在内核文件中加上 net.ifnames=0,然后重启。
[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@server1 network-scripts]# vim ifcfg-eth1
[root@server1 network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
[root@server1 network-scripts]# ifup eth1
[root@ops1 network-scripts]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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 state UP group default qlen 1000
link/ether 52:54:00:25:f8:d8 brd ff:ff:ff:ff:ff:ff
inet 172.25.25.1/24 brd 172.25.25.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe25:f8d8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:c8:d2:ab brd ff:ff:ff:ff:ff:ff
inet6 fe80::5054:ff:fec8:d2ab/64 scope link
valid_lft forever preferred_lft forever
- 域名解析
[root@server1 network-scripts]# vim /etc/hosts
[root@ops1 network-scripts]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.25.250 foundation39.ilt.example.com
172.25.25.1 controller
172.25.25.2 compute1
172.25.25.3 block1
172.25.25.4 server4
172.25.25.5 server5
172.25.25.6 server6
172.25.25.7 server7
172.25.25.8 server8
[root@server1 network-scripts]# hostnamectl set-hostname controller
[root@server1 network-scripts]# hostname
controller
- 时间同步
openstack 对于时间要求很严格,要求所有节点的时间必须时间同步;如果时间不同步,会导致云主机无法启动。
服务端
先将服务端的时间同步到真实主机,然后再将其作为服务端共享给集群中的其他主机。
[root@westos images]# vim /etc/chrony.conf
23 allow 172.25.25.0/24
[root@westos ~]# systemctl restart chronyd.service
[root@westos ~]# systemctl enable --now chronyd
[root@controller ~]# yum install -y chrony.x86_64
[root@controller ~]# vim /etc/chrony.conf
3 server 172.25.25.250 iburst
[root@controller ~]# systemctl restart chronyd.service
[root@controller ~]# 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
===============================================================================
^* foundation39.ilt.example> 3 6 17 16 +4436ns[ +24us] +/- 148ms
- 安装 openstack 软件包
在主机的apache 发布目录中,将软件包复制到该目录中;
[root@westos openstack]# cp -r /run/media/westos/disk/lnmp/mitaka/ .
[root@westos openstack]# pwd
/var/www/html/openstack
[root@westos openstack]# ls
mitaka
在控制节点将安装源指向宿主机的发布目录;
[root@controller yum.repos.d]# cat openstack.repo
[openstack]
name=mitaka
baseurl=http://172.25.25.250/openstack/mitaka
gpgcheck=0
[root@controller yum.repos.d]# yum repolist
在安装之前,先在主机上升级包,然后安装客户端;
[root@controller yum.repos.d]# yum upgrade ##升级
[root@controller yum.repos.d]# yum install python-openstackclient -y #安装 OpenStack 客户端
- SQL数据库
整个openstack 的数据都会持久化保存到 SQL 数据库中;此处使用mariadb 数据库。
安装并配置组件
安装软件包:
[root@controller yum.repos.d]# yum install mariadb mariadb-server python2-PyMySQL -y
[root@controller yum.repos.d]# cd /etc/my.cnf.d/
[root@controller my.cnf.d]# ls
auth_gssapi.cnf enable_encryption.preset mysql-clients.cnf tokudb.cnf
client.cnf mariadb-server.cnf openstack.cnf
[root@controller my.cnf.d]# cat openstack.cnf ##配置数据库
[mysqld]
bind-address = 172.25.25.1
default-storage-engine = innodb #默认引擎
innodb_file_per_table
max_connections = 4096 #最大连接数
collation-server = utf8_general_ci
character-set-server = utf8
启动数据库,并做数据库的初始化;
[root@controller my.cnf.d]# systemctl enable --now mariadb.service
[root@controller my.cnf.d]# mysql_secure_installation
nosql 不需要,不是核心组件.
- 消息队列
安装安装包,启动消息队列服务并将其配置为随系统启动:
[root@controller my.cnf.d]# yum install rabbitmq-server -y
[root@controller my.cnf.d]# systemctl enable --now rabbitmq-server.service
添加 openstack 用户,给openstack
用户配置写和读权限:
[root@controller my.cnf.d]# rabbitmqctl add_user openstack openstack
Creating user "openstack" ...
[root@controller my.cnf.d]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/"
其中三个.* 计算网络时会用的到;
三个 .*
代表的含义:代表权限
[root@controller ~]# rabbitmq-plugins list ##列出所有的插件
[root@controller ~]# rabbitmq-plugins enable rabbitmq_management
#打开管理界面之后,会提供一个web 的接口
[root@controller ~]# netstat -antlp
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 4323/beam.smp
此时在网页中访问:http://172.25.25.1:15672/
用 guest 用户登陆,密码也是 guest,此时会看到 .* 的权限。
也可以用命令 rabbitmqctl --help
来看.
[root@controller ~]# rabbitmqctl list_users #列出用户
Listing users ...
openstack []
guest [administrator]
[root@controller ~]# rabbitmqctl list_user_permissions openstack #列出用户权限
Listing permissions for user "openstack" ...
/ .* .* .*
[root@controller ~]# rabbitmqctl authenticate_user openstack openstack ##密码校验
Authenticating user "openstack" ...
Success
- Memcached
认证服务认证缓存使用 memcached缓存命令。
安装软件,并启动服务;
[root@controller ~]# yum install memcached python-memcached -y
[root@controller ~]# 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" #将其注释掉,默认监听所有
[root@controller ~]# systemctl enable --now memcached.service
memcache 的默认端口是11211:
[root@controller ~]# netstat -antlp |grep :11211
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 4161/memcached
tcp6 0 0 :::11211 :::* LISTEN 4161/memcached
4. 认证服务
除了认证服务之外还有目录服务,目录服务里面有所有 api 用户的认证授权。
OpenStack:term:Identity service
为认证管理,授权管理和服务目录服务管理提供单点整合。其它OpenStack服务将身份认证服务当做通用统一API来使用。此外,提供用户信息但是不在OpenStack项目中的服务(如LDAP服务)可被整合进先前存在的基础设施中。
为了从identity服务中获益,其他的OpenStack服务需要与它合作。当某个OpenStack服务收到来自用户的请求时,该服务询问Identity服务,验证该用户是否有权限进行此次请求。
身份服务包含这些组件:
1)服务器
一个中心化的服务器使用RESTful 接口来提供认证和授权服务。
2)驱动
驱动或服务后端被整合进集中式服务器中。它们被用来访问OpenStack外部仓库的身份信息, 并且它们可能已经存在于OpenStack被部署在的基础设施(例如,SQL数据库或LDAP服务器)中。
3)模块
中间件模块运行于使用身份认证服务的OpenStack组件的地址空间中。这些模块拦截服务请求,取出用户凭据,并将它们送入中央是服务器寻求授权。中间件模块和OpenStack组件间的整合使用Python Web服务器网关接口。
当安装OpenStack身份服务,用户必须将之注册到其OpenStack安装环境的每个服务。身份服务才可以追踪那些OpenStack服务已经安装,以及在网络中定位它们。
- 完成下面的步骤以创建数据库:
用数据库连接客户端以 root 用户连接到数据库服务器.
创建 keystone 数据库,并对其授权;
MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone'; ##本机
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone'; ##远程
Query OK, 0 rows affected (0.00 sec)
测试:
[root@controller ~]# mysql -u keystone -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.1.20-MariaDB MariaDB Server
- 生成一个随机值在初始的配置中作为管理员的令牌,并安装对应组件;
[root@controller ~]# openssl rand -hex 10
1b41b1910e8948276332
安装组件,并编辑配置文件:
[root@controller ~]# yum install openstack-keystone httpd mod_wsgi -y
[root@controller ~]# grep -v ^# /etc/keystone/keystone.conf | uniq
#相关参数在对应的模块下面书写
[root@controller ~]# openssl rand -hex 10
fba442c0df1a5fd4d048
[root@controller ~]# vim /etc/keystone/keystone.conf
1 [DEFAULT]
2 admin_token = fba442c0df1a5fd4d048 定义初始管理令牌的值:
527 [database]
528 connection = mysql+pymysql://keystone:keystone@controller/keystone
#配置数据库访问
数据库:用pymysql 来连接:用户:密码:代表数据库主机:数据库名称
1985 [token]
1986 provider = fernet #配置Fernet UUID令牌的提供者。
- 初始化身份认证服务的数据库
以 ketstone 用户认证身份来同步数据库;
[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[root@controller ~]# mysql -p
MariaDB [(none)]> use keystone
MariaDB [keystone]> show tables;
+------------------------+
| Tables_in_keystone |
+------------------------+
| access_token |
| assignment |
| config_register |
| consumer |
| credential |
| domain |
| endpoint |
| endpoint_group |
| federated_user |
| federation_protocol |
| group |
| id_mapping |
| identity_provider |
| idp_remote_ids |
| implied_role |
| local_user |
| mapping |
| migrate_version |
| password |
| policy |
| policy_association |
| project |
| project_endpoint |
| project_endpoint_group |
| region |
| request_token |
| revocation_event |
| role |
| sensitive_config |
| service |
| service_provider |
| token |
| trust |
| trust_role |
| user |
| user_group_membership |
| whitelisted_config |
+------------------------+
37 rows in set (0.00 sec)
[root@controller ~]# id keystone
uid=163(keystone) gid=163(keystone) groups=163(keystone)
- 初始化Fernet keys
会在/etc/keystone/
生成 fernet-keys;
[root@controller ~]# cd /etc/keystone/
[root@controller keystone]# ls
default_catalog.templates keystone-paste.ini policy.json
keystone.conf logging.conf sso_callback_template.html
[root@controller keystone]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@controller keystone]# ls
default_catalog.templates keystone.conf logging.conf sso_callback_template.html
fernet-keys keystone-paste.ini policy.json
- 配置 Apache HTTP 服务器
1)编辑/etc/httpd/conf/httpd.conf
文件,配置ServerName
选项为控制节点;
[root@controller keystone]# vim /etc/httpd/conf/httpd.conf
96
97 ServerName controller
98
2)创建文件 /etc/httpd/conf.d/wsgi-keystone.conf
[root@controller keystone]# vim /etc/httpd/conf.d/wsgi-keystone.conf
Listen 5000 ##public 连接端口
Listen 35357 ##仅限管理员使用
<VirtualHost *:5000>
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%{cu}t %M"
ErrorLog /var/log/httpd/keystone-error.log
CustomLog /var/log/httpd/keystone-access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:35357>
WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-admin
WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%{cu}t %M"
ErrorLog /var/log/httpd/keystone-error.log
CustomLog /var/log/httpd/keystone-access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
3)完成安装
启动 Apache HTTP 服务并配置其随系统启动;
[root@controller keystone]# systemctl enable --now httpd.service
[root@controller keystone]# netstat -antlp | grep httpd #5000 和35357 已经成功
tcp6 0 0 :::5000 :::* LISTEN 4755/httpd
tcp6 0 0 :::80 :::* LISTEN 4755/httpd
tcp6 0 0 :::35357 :::* LISTEN 4755/httpd
- 服务的配置
1)配置认证令牌
[root@controller keystone]# export OS_TOKEN=e03924be99601d038779
2)配置端点URL:v3 版本
[root@controller keystone]# export OS_URL=http://controller:35357/v3
3)配置认证 API 版本
[root@controller keystone]# export OS_IDENTITY_API_VERSION=3
- 创建服务实体和API端点
-
在Openstack环境中,认证服务管理服务目录。服务使用这个目录来决定您的环境中可用的服务。
创建服务实体和身份认证服务:
[root@controller keystone]# openstack service create --name keystone --description "OpenStack Identity" identity
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Identity |
| enabled | True |
| id | e6b36ed580fe4282ac80a99e5520b34d |
| name | keystone |
| type | identity |
+-------------+----------------------------------+
[root@controller keystone]# openstack service list
+----------------------------------+----------+----------+
| ID | Name | Type |
+----------------------------------+----------+----------+
| e6b36ed580fe4282ac80a99e5520b34d | keystone | identity |
+----------------------------------+----------+----------+
#OpenStack 是动态生成 ID 的,输出会与示例中的命令行输出不相同
[root@controller keystone]# openstack service --help
2)身份认证服务管理了一个与您环境相关的 API 端点的目录。服务使用这个目录来决定如何与您环境中的其他服务进行通信。
OpenStack使用三个API端点变种代表每种服务:admin,internal和public。默认情况下,管理API端点允许修改用户和租户而公共和内部APIs不允许这些操作。在生产环境中,处于安全原因,变种为了服务不同类型的用户可能驻留在单独的网络上。对实例而言,公共API网络为了让顾客管理他们自己的云在互联网上是可见的。管理API网络在管理云基础设施的组织中操作也是有所限制的。内部API网络可能会被限制在包含OpenStack服务的主机上。此外,OpenStack支持可伸缩性的多区域。为了简单起见,本指南为所有端点变种和默认RegionOne
区域都使用管理网络。
创建认证服务的 API 端点:
[root@controller keystone]# openstack endpoint create --region RegionOne identity public http://controller:5000/v3
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 3d8fe893b61b46748cf685426741c76e |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | e6b36ed580fe4282ac80a99e5520b34d |
| service_name | keystone |
| service_type | identity |
| url | http://controller:5000/v3 |
+--------------+----------------------------------+
[root@controller keystone]# openstack endpoint create --region RegionOne identity internal http://controller:5000/v3
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | f647d21959994460abfcb4a6e02ceb86 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | e6b36ed580fe4282ac80a99e5520b34d |
| service_name | keystone |
| service_type | identity |
| url | http://controller:5000/v3 |
+--------------+----------------------------------+
[root@controller keystone]# openstack endpoint create --region RegionOne identity admin http://controller:35357/v3
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | fe4e67cd761642efa4f051ede3185238 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | e6b36ed580fe4282ac80a99e5520b34d |
| service_name | keystone |
| service_type | identity |
| url | http://controller:35357/v3 |
+--------------+----------------------------------+
每个添加到OpenStack环境中的服务要求一个或多个服务实体和三个认证服务中的API 端点变种。
- 创建域、项目、用户和角色
身份认证服务为每个OpenStack服务提供认证服务。认证服务使用 T domains, projects (tenants), :term:users<user>
和 :term:roles<role>
的组合。
1)创建域default
:
[root@controller keystone]# openstack domain create --description "Default Domain" default
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Default Domain |
| enabled | True |
| id | 06d4dfeb3e7948ae8761a34d096864b3 |
| name | default |
+-------------+----------------------------------+
2) 在环境中,为进行管理操作,创建管理的项目、用户和角色:
创建 admin 项目:
[root@controller keystone]# openstack project create --domain default --description "Admin Project" admin
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Admin Project |
| domain_id | 06d4dfeb3e7948ae8761a34d096864b3 |
| enabled | True |
| id | 89eb25af39ef4ae5942005878a0660f3 |
| is_domain | False |
| name | admin |
| parent_id | 06d4dfeb3e7948ae8761a34d096864b3 |
+-------------+----------------------------------+
创建 admin 用户:设定密码为 admin 可以直接用–password admin 是非交互的模式;
[root@controller keystone]# openstack user create --domain default --password admin admin
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | 06d4dfeb3e7948ae8761a34d096864b3 |
| enabled | True |
| id | bebdc426e83f4271bce45089804cef1a |
| name | admin |
+-----------+----------------------------------+
创建 admin 角色:
[root@controller keystone]# openstack role create admin
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | None |
| id | aaca350bf56d44dfae9a6fe99c113141 |
| name | admin |
+-----------+----------------------------------+
以上信息会存储到数据库里面,当核心组件没有部署完成,看不到结果,只有在启动云主机之后才会看到信息;没启动之前没办法判断是否成功。
添加admin
角色到 admin 项目和用户上:这个命令执行后没有输出.
[root@controller keystone]# openstack role add --project admin --user admin admin
3)创建一个添加到环境中每个服务包含独有用户的 service 项目。创建service
项目:
[root@controller keystone]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | 06d4dfeb3e7948ae8761a34d096864b3 |
| enabled | True |
| id | 481fe2b76552431db515739514bbcdfa |
| is_domain | False |
| name | service |
| parent_id | 06d4dfeb3e7948ae8761a34d096864b3 |
+-------------+----------------------------------+
4)常规(非管理)任务使用无特权的项目和用户。
创建 demo
项目和用户:
[root@controller keystone]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| domain_id | 06d4dfeb3e7948ae8761a34d096864b3 |
| enabled | True |
| id | ccc1279be29e4a438ca95831d0ed3ea2 |
| is_domain | False |
| name | demo |
| parent_id | 06d4dfeb3e7948ae8761a34d096864b3 |
+-------------+----------------------------------+
[root@controller keystone]# openstack user create --domain default --password demo demo #创建demo用户
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | 06d4dfeb3e7948ae8761a34d096864b3 |
| enabled | True |
| id | 5297901905ca4ea2bc2e2ea1c4500338 |
| name | demo |
+-----------+----------------------------------+
[root@controller keystone]# openstack role create user
#创建 user 角色
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | None |
| id | 95771672ad534e27ad96a1672d1c0067 |
| name | user |
+-----------+----------------------------------+
[root@controller keystone]# openstack role add --project demo --user demo user
#添加 user角色到demo 项目和用户
注:当为这个项目创建额外用户时,不要重复这一步.
- 验证操作
注: 在安装其他服务之前确认身份认证服务的操作.
1 )重置OS_TOKEN
和OS_URL
环境变量:
[root@controller keystone]# unset OS_TOKEN OS_URL
2)作为 admin 用户,请求认证令牌:
[root@controller keystone]# 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 token issue
Password:
+------------+----------------------------------------------------------------------------------+
| Field | Value |
+------------+----------------------------------------------------------------------------------+
| expires | 2021-07-04T15:14:01.786141Z |
| id | gAAAAABg4cIp9v2c0i8vuAW35OxI3VrECkHVZDCISaOMpERllkN0IMV1LHe19W2jX0Sh45C-it9aRMwY |
| | _jQEOvrPCarIHTWh3ndyU0ZjXWBKVRskxJmTQjOaqEyaZjpJOvtj3pnpEHXt2FjQ4apDzXFAxD9yYkPP |
| | EHoz9dtdIoyAzJlwqjMUJ8k |
| project_id | 89eb25af39ef4ae5942005878a0660f3 |
| user_id | bebdc426e83f4271bce45089804cef1a |
+------------+----------------------------------------------------------------------------------+
3 )作为demo
用户,请求认证令牌:
[root@controller keystone]# openstack --os-auth-url http://controller:5000/v3 \
> --os-project-domain-name default --os-user-domain-name default \
> --os-project-name demo --os-username demo token issue
Password:
+------------+----------------------------------------------------------------------------------+
| Field | Value |
+------------+----------------------------------------------------------------------------------+
| expires | 2021-07-04T15:17:17.822763Z |
| id | gAAAAABg4cLtT9j9hB02SMCQj0no1JjiKrpcKeK3Ldche2VgykUowqD6G_X2SdZjNtYMQKWwo-NfMS-s |
| | DjIszaPWw59pOV9ncUmpQTtbZyk4s5zOcWgqQ7DBHa2TdgSzfHGgux2xVHTorhXqC6r_dBOI1jQRM5EW |
| | x6UzH1gKPfzmhTB3M_SzjNE |
| project_id | ccc1279be29e4a438ca95831d0ed3ea2 |
| user_id | 5297901905ca4ea2bc2e2ea1c4500338 |
+------------+----------------------------------------------------------------------------------+
这个命令使用demo
用户的密码和API端口5000,这样只会允许对身份认证服务API的常规(非管理)访问。
5. 创建 OpenStack 客户端环境脚本
- 创建脚本
创建admin
和demo
项目和用户创建客户端环境变量脚本。
1 )编辑文件 admin-openrc
和demo-openrc
:
[root@controller ~]# vim admin-openrc
[root@controller ~]# cat 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
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
[root@controller ~]# vim demo-openrc
[root@controller ~]# cat 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
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
[root@controller ~]# source admin-openrc #是当前环境变量生效
[root@controller ~]# openstack user list #列出创建的用户
[root@controller ~]# openstack project list #列出创建的项目
[root@controller ~]# openstack endpoint list #列出服务连接端点
当普通用户生效时,他并不能列出创建的用户信息。
6. 镜像组件(镜像服务)
OpenStack镜像服务是IaaS的核心服务,如同 :ref:get_started_conceptual_architecture
所示。它接受磁盘镜像或服务器镜像API请求,和来自终端用户或OpenStack计算组件的元数据定义。它也支持包括OpenStack对象存储在内的多种类型仓库上的磁盘镜像或服务器镜像存储。
大量周期性进程运行于OpenStack镜像服务上以支持缓存。同步复制(Replication)服务保证集群中的一致性和可用性。其它周期性进程包括auditors, updaters, 和 reapers。
OpenStack镜像服务包括以下组件:
glance-api
接收镜像API的调用,诸如镜像发现、恢复、存储。
glance-registry
存储、处理和恢复镜像的元数据,元数据包括项诸如大小和类型。
数据库
存放镜像元数据,用户是可以依据个人喜好选择数据库的,多数的部署使用MySQL或SQLite。
镜像文件的存储仓库
支持多种类型的仓库,它们有普通文件系统、对象存储、RADOS块设备、HTTP、以及亚马逊S3。记住,其中一些仓库仅支持只读方式使用。
元数据定义服务
通用的API,是用于为厂商,管理员,服务,以及用户自定义元数据。这种元数据可用于不同的资源,例如镜像,工件,卷,配额以及集合。一个定义包括了新属性的键,描述,约束以及可以与之关联的资源的类型。
安装和配置
- 安装和配置镜像服务之前,必须创建创建一个数据库、服务凭证和API端点。
1)完成下面的步骤以创建数据库:
用数据库连接客户端以 root 用户连接到数据库服务器:
[root@controller ~]# mysql -pwestos
MariaDB [(none)]> CREATE DATABASE glance; #创建 glance 数据库:
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance';
#对glance数据库授予恰当的权限:
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance';
Query OK, 0 rows affected (0.00 sec)
2)获得 admin 凭证来获取只有管理员能执行的命令的访问权限
创建 glance 用户
[root@controller ~]# openstack user create --domain default --password glance glance
添加 admin 角色到 glance 用户和 service 项目上:
[root@controller ~]# openstack role add --project service --user glance admin
创建glance
服务实体:
[root@controller ~]# openstack service create --name glance --description "OpenStack Image" image
3)创建镜像服务的 API 端点:
[root@controller ~]# openstack endpoint create --region RegionOne image public http://controller:9292
[root@controller ~]# openstack endpoint create --region RegionOne image internal http://controller:9292
[root@controller ~]# openstack endpoint create --region RegionOne image admin http://controller:9292
- 安装并配置组件
默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(…)表示默认的配置选项你应该保留。
1)安装软件包:
[root@controller ~]# yum install openstack-glance -y
2)编辑文件 /etc/glance/glance-api.conf 并修改信息:
[root@controller ~]# vim /etc/glance/glance-api.conf
618 [database]
619 connection = mysql+pymysql://glance:glance@controller/glance
#配置数据库访问
1114 [keystone_authtoken]
1115 auth_uri = http://controller:5000
1116 auth_url = http://controller:35357
1117 memcached_servers = controller:11211
1118 auth_type = password
1119 project_domain_name = default
1120 user_domain_name = default
1121 project_name = service
1122 username = glance
1123 password = glance
#将GLANCE_DBPASS 替换为你为镜像服务选择的密码。
1688 [paste_deploy]
1689 flavor = keystone
在 [glance_store] 部分,配置本地文件系统存储和镜像文件位置:
736 [glance_store]
737 stores = file,http
738 default_store = file
739 filesystem_store_datadir = /var/lib/glance/images/
编辑文件 /etc/glance/glance-registry.conf
修改文件内容:
[root@controller ~]# vim /etc/glance/glance-registry.conf
在 [database] 部分,配置数据库访问:
359 [database]
360 connection = mysql+pymysql://glance:glanc@controller/glance
在 [keystone_authtoken] 和 [paste_deploy] 部分,配置认证服务访问:
837 [keystone_authtoken]
838 auth_uri = http://controller:5000
839 auth_url = http://controller:35357
840 memcached_servers = controller:11211
841 auth_type = password
842 project_domain_name = default
843 user_domain_name = default
844 project_name = service
845 username = glance
846 password = glance
1393 [paste_deploy]
1394 flavor = keystone
- 写入镜像服务数据库:
[root@controller ~]# su -s /bin/sh -c "glance-manage db_sync" glance
- 完成安装
启动镜像服务、配置开机自启启动:
[root@controller ~]# systemctl enable --now openstack-glance-api.service openstack-glance-registry.service
- 验证操作
1)下载一个镜像 cirros-0.4.0-x86_64-disk.img
[root@controller ~]# ls
admin-openrc cirros-0.4.0-x86_64-disk.img demo-openrc
[root@controller ~]# ll /var/lib/glance/images/
total 0
2)使用 QCOW2 磁盘格式, bare 容器格式上传镜像到镜像服务并设置公共可见,这样所有的项目都可以访问它:
[root@controller ~]# 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 | 2021-07-05T01:00:42Z |
| disk_format | qcow2 |
| file | /v2/images/7c183f90-89fb-4d6c-9ef7-debd81d84cc3/file |
| id | 7c183f90-89fb-4d6c-9ef7-debd81d84cc3 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | 89eb25af39ef4ae5942005878a0660f3 |
| protected | False |
| schema | /v2/schemas/image |
| size | 12716032 |
| status | active |
| tags | |
| updated_at | 2021-07-05T01:00:43Z |
| virtual_size | None |
| visibility | public |
+------------------+------------------------------------------------------+
3)确认镜像的上传并验证属性:
上传完成之后,会在/var/lib/glance/images/
中生成镜像,此镜像必须是用指令生成,而不能直接拷贝进去。
[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 7c183f90-89fb-4d6c-9ef7-debd81d84cc3 | cirros | active |
+--------------------------------------+--------+--------+
[root@controller ~]# ls /var/lib/glance/images/
7c183f90-89fb-4d6c-9ef7-debd81d84cc3
从上面两个组件的创建过程基本可以确定openstack组件的创建过程:
- 先在数据库里面创建库,然后创建数据库用户并授权;
- 创建 openstack 用户(在 keystone做认证账号);
- 创建服务;
- 创建镜像服务的API接口;
- 安装并修改配置文件,启动服务。
7. 计算服务
使用OpenStack计算服务来托管和管理云计算系统。OpenStack计算服务是基础设施即服务(IaaS)系统的主要部分,模块主要由Python实现。
OpenStack计算组件请求OpenStack Identity服务进行认证;请求OpenStack Image服务提供磁盘镜像;为OpenStack dashboard提供用户与管理员接口。磁盘镜像访问限制在项目与用户上;配额以每个项目进行设定(例如,每个项目下可以创建多少实例)。OpenStack组件可以在标准硬件上水平大规模扩展,并且下载磁盘镜像启动虚拟机实例。
OpenStack计算服务由下列组件所构成:
nova-api 服务
接收和响应来自最终用户的计算API请求。此服务支持OpenStack计算服务API,Amazon EC2 API,以及特殊的管理API用于赋予用户做一些管理的操作。它会强制实施一些规则,发起多数的编排活动,例如运行一个实例。
nova-api-metadata 服务
接受来自虚拟机发送的元数据请求。nova-api-metadata
服务一般在安装nova-network
服务的多主机模式下使用。
nova-compute服务
一个持续工作的守护进程,通过Hypervior的API来创建和销毁虚拟机实例。
过程是蛮复杂的。最为基本的,守护进程同意了来自队列的动作请求,转换为一系列的系统命令如启动一个KVM实例,然后,到数据库中更新它的状态。
nova-scheduler服务
拿到一个来自队列请求虚拟机实例,然后决定那台计算服务器主机来运行它。
nova-conductor模块
媒介作用于nova-compute
服务与数据库之间。它排除了由nova-compute
服务对云数据库的直接访问。nova-conductor模块可以水平扩展。但是,不要将它部署在运行nova-compute
服务的主机节点上。
nova-cert模块
服务器守护进程向Nova Cert服务提供X509证书。用来为euca-bundle-image
生成证书。仅仅是在EC2 API的请求中使用。
nova-network worker 守护进程
与nova-compute
服务类似,从队列中接受网络任务,并且操作网络。执行任务例如创建桥接的接口或者改变IPtables的规则。
nova-consoleauth 守护进程
授权控制台代理所提供的用户令牌。详情可查看nova-novncproxy
和 nova-xvpvncproxy。该服务必须为控制台代理运行才可奏效。在集群配置中你可以运行二者中任一代理服务而非仅运行一个nova-consoleauth服务。
nova-novncproxy 守护进程
提供一个代理,用于访问正在运行的实例,通过VNC协议,支持基于浏览器的novnc客户端。
nova-spicehtml5proxy 守护进程
提供一个代理,用于访问正在运行的实例,通过 SPICE 协议,支持基于浏览器的 HTML5 客户端。
nova-xvpvncproxy 守护进程
提供一个代理,用于访问正在运行的实例,通过VNC协议,支持OpenStack特定的Java客户端。
nova-cert 守护进程
X509 证书。
nova客户端
用于用户作为租户管理员或最终用户来提交命令。
队列
一个在守护进程间传递消息的中央集线器
SQL数据库
存储构建时和运行时的状态,为云基础设施,包括有:
可用实例类型
使用中的实例
可用网络
项目
理论上,OpenStack计算可以支持任何和SQL-Alchemy所支持的后端数据库,通常使用SQLite3来做测试可开发工作,MySQL和PostgreSQL 作生产环境。
控制节点
- 在控制节点安装并配置Compute 服务
在安装和配置 Compute 服务前,必须创建数据库服务的凭据以及 API endpoints。
[root@controller ~]# mysql -pwestos
MariaDB [(none)]> CREATE DATABASE nova_api;
#创建 nova_api 和 nova 数据库
MariaDB [(none)]> CREATE DATABASE nova;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
#对数据库进行正确的授权
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'nova';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova';
- 创建服务证书
1)创建 nova 用户
[root@controller ~]# openstack user create --domain default --password nova nova
2)给 nova 用户添加 admin 角色:
[root@controller ~]# openstack role add --project service --user nova admin
3)创建 nova 服务实体:
[root@controller ~]# openstack service create --name nova --description "OpenStack Compute" compute
- 创建 Compute 服务 API 端点
[root@controller ~]# openstack endpoint create --region RegionOne \
> compute public http://controller:8774/v2.1/%\(tenant_id\)s
[root@controller ~]# openstack endpoint create --region RegionOne \
> compute internal http://controller:8774/v2.1/%\(tenant_id\)s
[root@controller ~]# openstack endpoint create --region RegionOne \
> compute admin http://controller:8774/v2.1/%\(tenant_id\)s
- 安装并配置组件
1) 安装软件包
[root@controller ~]# yum install openstack-nova-api openstack-nova-conductor \
> openstack-nova-console openstack-nova-novncproxy \
> openstack-nova-scheduler -y
2)编辑/etc/nova/nova.conf
文件
[root@controller ~]# vim /etc/nova/nova.conf
1 [DEFAULT]
2 enabled_apis = osapi_compute,metadata
#只启用计算和元数据API
3 backend = rabbit
#配置 “RabbitMQ” 消息队列访问
4 auth_strategy = keystone
#配置认证服务访问
5 my_ip = 172.25.25.1
#配置``my_ip`` 来使用控制节点的管理接口的IP 地址
6 use_neutron = True
7 firewall_driver = nova.virt.firewall.NoopFirewallDriver
#使能 Networking 服务
2161 [api_database]
2162 connection = mysql+pymysql://nova:nova@controller/nova_api
#配置数据库的连接
3108 [database]
3109 connection = mysql+pymysql://nova:nova@controller/nova
3331 [glance]
3332 api_servers = http://controller:9292
#配置镜像服务 API 的位置
3529 [keystone_authtoken]
3530 auth_uri = http://controller:5000
3531 auth_url = http://controller:35357
3532 memcached_servers = controller:11211
3533 auth_type = password
3534 project_domain_name = default
3535 user_domain_name = default
3536 project_name = service
3537 username = nova
3538 password = nova
#配置认证服务访问
4303 [oslo_concurrency]
4304 lock_path = /var/lib/nova/tmp
#配置锁路径
4408 [oslo_messaging_rabbit]
4409 rabbit_host = controller
4410 rabbit_userid = openstack
4411 rabbit_password = openstack
#配置 “RabbitMQ” 消息队列访问
5371 [vnc]
5372 vncserver_listen = $my_ip
5373 vncserver_proxyclient_address = $my_ip
#配置VNC代理使用控制节点的管理接口IP地址
3)同步Compute 数据库
[root@controller ~]# su -s /bin/sh -c "nova-manage api_db sync" nova
[root@controller ~]# su -s /bin/sh -c "nova-manage db sync" nova
- 完成安装
启动 Compute 服务并将其设置为开机自启
[root@controller ~]# systemctl enable openstack-nova-api.service \
> openstack-nova-consoleauth.service openstack-nova-scheduler.service \
> openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@controller ~]# systemctl start openstack-nova-api.service \
> openstack-nova-consoleauth.service openstack-nova-scheduler.service \
> openstack-nova-conductor.service openstack-nova-novncproxy.service
计算节点
在开一台虚拟机,内存2G,CPU做直通,两块网卡。
虚拟机环境设置。
[root@computer1 ~]# vim /etc/hosts
[root@computer1 ~]# cd /etc/sysconfig/network-scripts/
[root@computer1 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@computer1 network-scripts]# vim ifcfg-eth1
[root@computer1 network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
[root@computer1 network-scripts]# ifup eth1
[root@computer1 network-scripts]# ip addr
[root@computer1 yum.repos.d]# cat openstack.repo
[openstack]
name=mitaka
baseurl=http://172.25.25.250/openstack/mitaka
gpgcheck=0
[root@computer1 yum.repos.d]# yum repolist
[root@computer1 yum.repos.d]# yum install -y chrony
[root@computer1 ~]# vim /etc/chrony.conf
3 server 172.25.25.250 iburst
[root@computer1 ~]# systemctl enable --now chronyd
[root@computer1 ~]# chronyc sources -v
计算服务支持多种虚拟化方式,计算节点需支持对虚拟化的硬件加速。
- 安装并配置组件
1)安装软件包:
[root@computer1 ~]# yum install openstack-nova-compute -y
2)编辑/etc/nova/nova.conf
文件:
[root@computer1 ~]# vim /etc/nova/nova.conf
1 [DEFAULT]
2 rpc_backend = rabbit
#配置RabbitMQ消息队列的连接
3 auth_strategy = keystone
#配置认证服务访问
4 my_ip = 172.25.25.2
#配置 my_ip 选项,指向当前主机的IP
5 use_neutron = True
6 firewall_driver = nova.virt.firewall.NoopFirewallDriver
#使用 Networking 服务
3328 [glance]
3329 api_servers = http://controller:9292
#配置镜像服务 API 的位置
3529 [keystone_authtoken]
3530 auth_uri = http://controller:5000
3531 auth_url = http://controller:35357
3532 memcached_servers = controller:11211
3533 auth_type = password
3534 project_domain_name = default
3535 user_domain_name = default
3536 project_name = service
3537 username = nova
3538 password = nova
#配置认证服务访问
4299 [oslo_concurrency]
4300 lock_path = /var/lib/nova/tmp
#配置锁路径
4411 [oslo_messaging_rabbit]
4412 rabbit_host = controller
4413 rabbit_userid = openstack
4414 rabbit_password = openstack
#配置``RabbitMQ``消息队列的连接
5368 [vnc]
5369 enabled = True
5370 vncserver_listen = 0.0.0.0
5371 vncserver_proxyclient_address = $my_ip
5372 novncproxy_base_url = http://controller:6080/vnc_auto.html
#启用并配置远程控制台访问
- 完成安装
1)确定计算节点是否支持虚拟机的硬件加速
[root@computer1 ~]# egrep -c '(vmx|svm)' /proc/cpuinfo
0
#如果这个命令返回了 one or greater 的值,那么你的计算节点支持硬件加速且不需要额外的配置。
#如果这个命令返回了 zero 值,那么你的计算节点不支持硬件加速。你必须配置 libvirt 来使用 QEMU 去代替 KVM
[root@computer1 ~]# vim /etc/nova/nova.conf
3672 [libvirt]
3673 virt_type = qemu
2)启动计算服务及其依赖,并将其配置为开机自启
[root@computer1 ~]# systemctl enable --now libvirtd.service openstack-nova-compute.service
- 验证计算服务的操作
控制节点列出服务组件,以验证是否成功启动并注册了每个进程。
[root@controller ~]# openstack compute service list
+----+------------------+------------+----------+---------+-------+----------------------------+
| Id | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-conductor | controller | internal | enabled | up | 2021-07-05T02:32:21.000000 |
| 2 | nova-scheduler | controller | internal | enabled | up | 2021-07-05T02:32:24.000000 |
| 3 | nova-consoleauth | controller | internal | enabled | up | 2021-07-05T02:32:24.000000 |
| 6 | nova-compute | computer1 | nova | enabled | up | 2021-07-05T02:32:24.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+
8. 网络服务
OpenStack Networking(neutron),允许创建、插入接口设备,这些设备由其他的OpenStack服务管理。插件式的实现可以容纳不同的网络设备和软件,为OpenStack架构与部署提供了灵活性。
它包含下列组件:
neutron-server
接收和路由API请求到合适的OpenStack网络插件,以达到预想的目的。
OpenStack网络插件和代理
插拔端口,创建网络和子网,以及提供IP地址,这些插件和代理依赖于供应商和技术而不同,OpenStack网络基于插件和代理为Cisco 虚拟和物理交换机、NEC OpenFlow产品,Open vSwitch,Linux bridging以及VMware NSX 产品穿线搭桥。
常见的代理L3(3层),DHCP(动态主机IP地址),以及插件代理。
消息队列
大多数的OpenStack Networking安装都会用到,用于在neutron-server和各种各样的代理进程间路由信息。也为某些特定的插件扮演数据库的角色,以存储网络状态
OpenStack网络主要和OpenStack计算交互,以提供网络连接到它的实例。
网络服务提供网络,子网以及路由这些对象的抽象概念。每个抽象概念都有自己的功能,可以模拟对应的物理设备:网络包括子网,路由在不同的子网和网络间进行路由转发。
对于任意一个给定的网络都必须包含至少一个外部网络。不像其他的网络那样,外部网络不仅仅是一个定义的虚拟网络。相反,它代表了一种OpenStack安装之外的能从物理的,外部的网络访问的视图。外部网络上的IP地址可供外部网络上的任意的物理设备所访问。
外部网络之外,任何 Networking 设置拥有一个或多个内部网络。这些软件定义的网络直接连接到虚拟机。仅仅在给定网络上的虚拟机,或那些在通过接口连接到相近路由的子网上的虚拟机,能直接访问连接到那个网络上的虚拟机。
如果外部网络想要访问实例或者相反实例想要访问外部网络,那么网络之间的路由就是必要的了。每一个路由都配有一个网关用于连接到外部网络,以及一个或多个连接到内部网络的接口。就像一个物理路由一样,子网可以访问同一个路由上其他子网中的机器,并且机器也可以访问路由的网关访问外部网络。
另外,你可以将外部网络的IP地址分配给内部网络的端口。不管什么时候一旦有连接连接到子网,那个连接被称作端口。你可以给实例的端口分配外部网络的IP地址。通过这种方式,外部网络上的实体可以访问实例。
网络服务同样支持安全组。安全组允许管理员在安全组中定义防火墙规则。一个实例可以属于一个或多个安全组,网络为这个实例配置这些安全组中的规则,阻止或者开启端口,端口范围或者通信类型。
每一个Networking使用的插件都有其自有的概念。虽然对操作VNI和OpenStack环境不是至关重要的,但理解这些概念能帮助你设置Networking。所有的Networking安装使用了一个核心插件和一个安全组插件(或仅是空操作安全组插件)。另外,防火墙即服务(FWaaS)和负载均衡即服务(LBaaS)插件是可用的。
控制节点
- 创建数据库,创建用户并授权
[root@controller ~]# mysql -pwestos
MariaDB [(none)]> CREATE DATABASE neutron;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';
- 创建服务证书
创建neutron
用户,添加admin
角色到neutron
用户,创建neutron
服务实体
[root@controller ~]# openstack user create --domain default --password neutron neutron
[root@controller ~]# openstack role add --project service --user neutron admin
[root@controller ~]# openstack service create --name neutron \
> --description "OpenStack Networking" network
- 创建网络服务API端点
[root@controller ~]# openstack endpoint create --region RegionOne \
> network public http://controller:9696
[root@controller ~]# openstack endpoint create --region RegionOne \
> network internal http://controller:9696
[root@controller ~]# openstack endpoint create --region RegionOne \
> network admin http://controller:9696
- 配置网络
采用尽可能简单的架构进行部署,只支持实例连接到公有网络(外部网络)。没有私有网络(个人网络),路由器以及浮动IP地址。只有admin
或者其他特权用户才可以管理公有网络。
1)在controller节点上安装并配置网络组件
[root@controller ~]# yum install openstack-neutron openstack-neutron-ml2 \
> openstack-neutron-linuxbridge ebtables -y
[root@controller ~]# vim /etc/neutron/neutron.conf
1 [DEFAULT]
2 core_plugin = ml2
3 service_plugins =
#启用ML2插件并禁用其他插件
4 rpc_backend = rabbit #消息队列
5 auth_strategy = keystone #认证
6 notify_nova_on_port_status_changes = True
7 notify_nova_on_port_data_changes = True
#配置网络服务来通知计算节点的网络拓扑变化
654 [database]
655 connection = mysql+pymysql://neutron:neutron@controller/neutron
#配置数据库访问
766 [keystone_authtoken] #认证
767 auth_uri = http://controller:5000
768 auth_url = http://controller:35357
769 memcached_servers = controller:11211
770 auth_type = password
771 project_domain_name = default
772 user_domain_name = default
773 project_name = service
774 username = neutron
775 password = neutron
945 [nova]
946 auth_url = http://controller:35357
947 auth_type = password
948 project_domain_name = default
949 user_domain_name = default
950 region_name = RegionOne
951 project_name = service
952 username = nova
953 password = nova
#置网络服务来通知计算节点的网络拓扑变化
1052 [oslo_concurrency]
1053 lock_path = /var/lib/neutron/tmp
1143 [oslo_messaging_rabbit] #消息队列
1144 rabbit_host = controller
1145 rabbit_userid = openstack
1146 rabbit_password = openstack
2)配置 Modular Layer 2 (ML2) 插件
ML2插件使用Linuxbridge机制来为实例创建layer-2虚拟网络基础设施
[root@controller ~]# vim /etc/neutron/plugins/ml2/ml2_conf.ini
99 [ml2]
100 type_drivers = flat,vlan #启用flat和VLAN网络
101 tenant_network_types = #禁用私有网络
102 mechanism_drivers = linuxbridge #启用Linuxbridge机制
103 extension_drivers = port_security #启用端口安全扩展驱动
148 [ml2_type_flat]
149 flat_networks = provider #配置公共虚拟网络为flat网络
219 [securitygroup]
220 enable_ipset = True #启用 ipset 增加安全组规则的高效性
3)配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
[root@controller ~]# vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
127 [linux_bridge]
128 physical_interface_mappings = provider:eth1
#将公共虚拟网络和公共物理网络接口对应起来
145 [securitygroup]
146 enable_security_group = True
147 firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
#启用安全组并配置 Linuxbridge iptables firewall driver
164 [vxlan]
165 enable_vxlan = False
#禁止VXLAN覆盖网络
4)配置DHCP代理
动态分配IP,配置Linuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在公共网络上的实例就可以通过网络来访问元数据。
[root@controller ~]# vim /etc/neutron/dhcp_agent.ini
1 [DEFAULT]
2 interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
3 dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
4 enable_isolated_metadata = True
5)配置元数据代理
负责提供配置信息;
[root@controller ~]# vim /etc/neutron/metadata_agent.ini
[DEFAULT] #配置元数据主机以及共享密码
nova_metadata_ip = controller
metadata_proxy_shared_secret = westos
6)为计算节点配置网络服务
[root@controller ~]# vim /etc/nova/nova.conf
4149 [neutron]
4150 url = http://controller:9696
4151 auth_url = http://controller:35357
4152 auth_type = password
4153 project_domain_name = default
4154 user_domain_name = default
4155 region_name = RegionOne
4156 project_name = service
4157 username = neutron
4158 password = neutron
4159 #配置访问参数,启用元数据代理并设置密码
4160 service_metadata_proxy = True
4161 metadata_proxy_shared_secret = westos
- 完成安装启动
1)网络服务初始化脚本需要一个超链接 指向ML2插件配置文件。
[root@controller ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
2)同步数据库:
[root@controller ~]# 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 之后,因为脚本需要完成服务器和插件的配置文件。
3)重启计算API 服务
[root@controller ~]# systemctl restart openstack-nova-api.service
4)当系统启动时,启动 Networking 服务并配置它启动
[root@controller ~]# systemctl enable neutron-server.service \
> neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
> neutron-metadata-agent.service
[root@controller ~]# systemctl start neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service
- 验证操作
列出加载的扩展来验证neutron-server
进程是否正常启动
[root@controller ~]# neutron ext-list
[root@controller ~]# neutron agent-list
#列出代理以验证启动 neutron 代理是否成功
#输出结果应该包括控制节点上的三个代理和每个计算节点上的一个代理
注: 没有完成计算节点的配置之前,只有三那个控制节点的代理。
计算节点
- 安装和配置
1) 安装
[root@computer1 ~]# yum install openstack-neutron-linuxbridge ebtables ipset -y
2)配置
Networking 通用组件的配置包括认证机制、消息队列和插件
[root@computer1 ~]# vim /etc/neutron/neutron.conf
1 [DEFAULT]
2 rpc_backend = rabbit #消息队列
3 auth_strategy = keystone #认证访问
763 [keystone_authtoken] #认证访问
764 auth_uri = http://controller:5000
765 auth_url = http://controller:35357
766 memcached_servers = controller:11211
767 auth_type = password
768 project_domain_name = default
769 user_domain_name = default
770 project_name = service
771 username = neutron
772 password = neutron
1039 [oslo_concurrency] #配置锁路径
1040 lock_path = /var/lib/neutron/tmp
1152 [oslo_messaging_rabbit] #消息队列
1153 rabbit_host = controller
1154 rabbit_userid = openstack
1155 rabbit_password = openstack
配置网络:
- 配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
[root@computer1 ~]# vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
127 [linux_bridge] #将公共虚拟网络和公共物理网络接口对应起来
128 physical_interface_mappings = provider:eth1
145 [securitygroup] #启用安全组并配置
146 enable_security_group = True
147 firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
166 [vxlan] #禁止VXLAN覆盖网络
167 enable_vxlan = False
- 为计算节点配置网络服务
[root@computer1 ~]# vim /etc/nova/nova.conf
4146 [neutron]
4147 url = http://controller:9696
4148 auth_url = http://controller:35357
4149 auth_type = password
4150 project_domain_name = default
4151 user_domain_name = default
4152 region_name = RegionOne
4153 project_name = service
4154 username = neutron
4155 password = neutron
- 完成安装
重启计算服务,启动Linuxbridge代理并配置它开机自启动
[root@computer1 ~]# systemctl restart openstack-nova-compute.service
[root@computer1 ~]# systemctl enable --now neutron-linuxbridge-agent.service
9. 启动一个实例
在启动实例之前,必须创建必须的虚拟机网络设施。对于网络选项1,实例使用提供者(外部)网络。
- 创建网络
创建提供者网络
在控制节点,用管理员的身份来创建网络,然后再创建一个子网;
[root@controller ~]# neutron net-create --shared --provider:physical_network provider \
> --provider:network_type flat provider
[root@controller ~]# neutron subnet-create --name provider --allocation-pool start=172.25.25.100,end=172.25.25.200 --dns-nameserver 114.114.114.114 --gateway 172.25.25.250 provider 172.25.25.0/24
Created a new subnet:
+-------------------+----------------------------------------------------+
| Field | Value |
+-------------------+----------------------------------------------------+
| allocation_pools | {"start": "172.25.25.100", "end": "172.25.25.200"} |
| cidr | 172.25.25.0/24 |
| created_at | 2021-07-05T04:08:43 |
| description | |
| dns_nameservers | 114.114.114.114 |
| enable_dhcp | True |
| gateway_ip | 172.25.25.250 |
| host_routes | |
| id | b4006a6d-3bf8-4734-88ef-464d3eeed17f |
| ip_version | 4 |
| ipv6_address_mode | |
| ipv6_ra_mode | |
| name | provider |
| network_id | f7b57c57-8e72-42a5-a49c-8ec8698c0672 |
| subnetpool_id | |
| tenant_id | 89eb25af39ef4ae5942005878a0660f3 |
| updated_at | 2021-07-05T04:08:43 |
+-------------------+----------------------------------------------------+
- 创建m1.nano规格的主机
默认的最小规格的主机需要512 MB内存。对于环境中计算节点内存不足4 GB的,我们推荐创建只需要64 MB的m1.nano
规格的主机。若单纯为了测试的目的,请使用m1.nano
规格的主机来加载CirrOS镜像.
[root@controller ~]# openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
+----------------------------+---------+
| Field | Value |
+----------------------------+---------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| disk | 1 |
| id | 0 |
| name | m1.nano |
| os-flavor-access:is_public | True |
| ram | 64 |
| rxtx_factor | 1.0 |
| swap | |
| vcpus | 1 |
+----------------------------+---------+
[root@controller ~]# openstack flavor list
+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 0 | m1.nano | 64 | 1 | 0 | 1 | True |
| 1 | m1.tiny | 512 | 1 | 0 | 1 | True |
| 2 | m1.small | 2048 | 20 | 0 | 1 | True |
| 3 | m1.medium | 4096 | 40 | 0 | 2 | True |
| 4 | m1.large | 8192 | 80 | 0 | 4 | True |
| 5 | m1.xlarge | 16384 | 160 | 0 | 8 | True |
+----+-----------+-------+------+-----------+-------+-----------+
- 生成一个键值对
大部分云镜像支持公共密钥认证而不是传统的密码认证。在启动实例前,必须添加一个公共密钥到计算服务。
[root@controller ~]# source demo-openrc #导入租户demo的凭证
[root@controller ~]# ssh-keygen -q -N "" #生成秘钥对
Enter file in which to save the key (/root/.ssh/id_rsa):
[root@controller ~]# openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
+-------------+-------------------------------------------------+
| Field | Value |
+-------------+-------------------------------------------------+
| fingerprint | 08:1c:c5:95:44:38:99:d9:ef:45:25:87:69:0d:d5:8e |
| name | mykey |
| user_id | 58f11da551514705bb20eec064c71460 |
+-------------+-------------------------------------------------+
[root@controller ~]# openstack keypair list #验证公钥的添加
+-------+-------------------------------------------------+
| Name | Fingerprint |
+-------+-------------------------------------------------+
| mykey | 08:1c:c5:95:44:38:99:d9:ef:45:25:87:69:0d:d5:8e |
+-------+-------------------------------------------------+
- 增加安全组规则
默认情况下,default
安全组适用于所有实例并且包括拒绝远程访问实例的防火墙规则。
[root@controller ~]# openstack security group rule create --proto icmp default
#允许 ICMP
+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| id | 6daa0c44-b2d0-4f58-bba0-5ac6cd8c20b0 |
| ip_protocol | icmp |
| ip_range | 0.0.0.0/0 |
| parent_group_id | 87622178-82dd-4d88-946c-e07805530d88 |
| port_range | |
| remote_security_group | |
+-----------------------+--------------------------------------+
[root@controller ~]# openstack security group rule create --proto tcp --dst-port 22 default
#允许安全 shell (SSH) 的访问
+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| id | 5148e849-fa4c-47e1-9415-259a774064bd |
| ip_protocol | tcp |
| ip_range | 0.0.0.0/0 |
| parent_group_id | 87622178-82dd-4d88-946c-e07805530d88 |
| port_range | 22:22 |
| remote_security_group | |
+-----------------------+--------------------------------------+
- 启动一个实例
1)在公有网络上创建实例
确定实例选项:启动一台实例,必须至少指定一个类型、镜像名称、网络、安全组、密钥和实例名称。
用在控制节点上,以普通用户的身份获取只有管理员能执行的命令的访问权限,一个实例指定了虚拟机资源的大致分配,包括处理器、内存和存储。
[root@controller ~]# openstack flavor list #列出可用类型
+----+-----------+-------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-----------+-------+------+-----------+-------+-----------+
| 0 | m1.nano | 64 | 1 | 0 | 1 | True |
| 1 | m1.tiny | 512 | 1 | 0 | 1 | True |
| 2 | m1.small | 2048 | 20 | 0 | 1 | True |
| 3 | m1.medium | 4096 | 40 | 0 | 2 | True |
| 4 | m1.large | 8192 | 80 | 0 | 4 | True |
| 5 | m1.xlarge | 16384 | 160 | 0 | 8 | True |
+----+-----------+-------+------+-----------+-------+-----------+
[root@controller ~]# openstack image list #列出可用镜像
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| cd1af194-3d2c-4bb8-b5cb-206f69304b70 | cirros | active |
+--------------------------------------+--------+--------+
[root@controller ~]# openstack network list #列出可用网络
+--------------------------------------+----------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+----------+--------------------------------------+
| 531e14a6-e61d-4259-a474-f9bbda3c4ad2 | provider | ad992cd3-5729-405d-b8e4-b8d7acf3a0eb |
+--------------------------------------+----------+--------------------------------------+
[root@controller ~]# openstack security group list #列出可用的安全组
+----------------------------+---------+------------------------+----------------------------+
| ID | Name | Description | Project |
+----------------------------+---------+------------------------+----------------------------+
| 87622178-82dd-4d88-946c- | default | Default security group | 43ad020c64a1489e9108ef1096 |
| e07805530d88 | | | 11b7f4 |
+----------------------------+---------+------------------------+----------------------------+
2)创建实例
[root@controller ~]# openstack server create --flavor m1.nano --image cirros --nic net-id=531e14a6-e61d-4259-a474-f9bbda3c4ad2 --security-group default --key-name mykey provider-instance
+--------------------------------------+-----------------------------------------------+
| Field | Value |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-STS:power_state | 0 |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | PDzCeLX26tie |
| config_drive | |
| created | 2021-07-05T11:08:45Z |
| flavor | m1.nano (0) |
| hostId | |
| id | 15178845-44f7-4fd6-a14b-499a08d49641 |
| image | cirros (cd1af194-3d2c-4bb8-b5cb-206f69304b70) |
| key_name | mykey |
| name | provider-instance |
| os-extended-volumes:volumes_attached | [] |
| progress | 0 |
| project_id | 43ad020c64a1489e9108ef109611b7f4 |
| properties | |
| security_groups | [{u'name': u'default'}] |
| status | BUILD |
| updated | 2021-07-05T11:08:45Z |
| user_id | 58f11da551514705bb20eec064c71460 |
+--------------------------------------+-----------------------------------------------+
[root@controller ~]# openstack server list #检查实例的状态
+--------------------------------------+-------------------+--------+------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+-------------------+--------+------------------------+
| 15178845-44f7-4fd6-a14b-499a08d49641 | provider-instance | ACTIVE | provider=172.25.25.101 |
+--------------------------------------+-------------------+--------+------------------------+
[root@controller ~]# openstack console url show provider-instance
#获取实例的 Virtual Network Computing (VNC) 会话URL并从web浏览器访问它
+-------+---------------------------------------------------------------------------------+
| Field | Value |
+-------+---------------------------------------------------------------------------------+
| type | novnc |
| url | http://controller:6080/vnc_auto.html?token=f0bc3330-08af-42be-bb2a-7206218a9662 |
+-------+---------------------------------------------------------------------------------+
此时在真实主机中做好控制节点的解析之后,便可访问:http://controller:6080/vnc_auto.html?token=f0bc3330-08af-42be-bb2a-7206218a9662
CirrOS 镜像包含传统的用户名/密码认证方式并需在登录提示中提供这些这些认证。登录到 CirrOS 后,证使用ping
验证网络的连通性。
3)验证能否远程访问实例,在控制节点或其他公有网络上的主机使用 SSH远程访问实例
[root@westos ~]# ping 172.25.25.101
PING 172.25.25.101 (172.25.25.101) 56(84) bytes of data.
64 bytes from 172.25.25.101: icmp_seq=1 ttl=64 time=7.39 ms
^C
--- 172.25.25.101 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 7.390/7.390/7.390/0.000 ms
[root@controller ~]# ssh cirros@172.25.25.101
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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:65:7f:53 brd ff:ff:ff:ff:ff:ff
inet 172.25.25.101/24 brd 172.25.25.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe65:7f53/64 scope link
valid_lft forever preferred_lft forever
10. 搭建 web 界面(Dashboard)
Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务。
- 安装和配置
1)安装并配置组件
[root@controller ~]# yum install openstack-dashboard -y
[root@controller ~]# vim /etc/openstack-dashboard/local_settings
30 ALLOWED_HOSTS = ['*', ] #允许所有主机访问仪表板
62 OPENSTACK_API_VERSIONS = { #配置API版本
63 "identity": 3,
64 "image": 2,
65 "volume": 2,
66 }
70 OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True #启用对域的支持
78 OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'default' #通过仪表盘创建用户时的默认域配置为 default
141 SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
142 #配置 memcached 会话存储服务
143 CACHES = {
144 'default': {
145 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
146 'LOCATION': 'controller:11211',
147 }
148 }
158 OPENSTACK_HOST = "controller" #配置仪表盘使用 OpenStack 服务
159 OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
#启用第3版认证API
160 OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
#通过仪表盘创建的用户默认角色配置为 user
275 OPENSTACK_NEUTRON_NETWORK = {
276 'enable_router': False,
277 'enable_quotas': False,
278 'enable_ipv6': False,
279 'enable_distributed_router': False,
280 'enable_ha_router': False,
281 'enable_lb': False,
282 'enable_firewall': False,
283 'enable_vpn': False,
284 'enable_fip_topology_check': False,
#选择网络参数1,需要禁用支持3层网络服务
385 TIME_ZONE = "Asia/Shanghai" #选择性地配置时区
2)完成安装
重启web服务器以及会话存储服务
[root@controller ~]# systemctl restart httpd.service memcached.service
完成之后来测试:http://controller/dashboard
访问控制节点的dashboard;
先用管理员来登陆测试:
在用普通用户来登陆测试:
现在用图形的方式操作一下,将建立的云主机删除;
然后用管理员的身份来删除子网,然后删除该网络;
然后用管理员在创建一个子网;
在用demo用户登陆来创建云主机。