title: openstack queens部署 #标题tags: openstack #标签
date: 2021-02-11
categories: openstack # 分类
学习openstack第一天,记录下openstack部署过程。
参考:
- openstack官方文档
- 老男孩教育openstack全新架构实战
openstack概念简介
openstack通过各种补充服务提供一个IAAS的解决方案,每个服务都提供便于集成的应用程序接口,下面是openstack中涉及到的服务以及其功能。
服务 | 项目名称 | 功能 |
---|---|---|
Dashboard | Horizon | 提供了一个基于web的自服务门户,与OpenStack底层服务交互,诸如启动一个实例,分配IP地址以及配置访问控制。 |
Compute | Nova | 在OpenStack环境中计算实例的生命周期管理。按需响应包括生成、调度、回收虚拟机等操作。 |
Networking | Neutron | 确保为其它OpenStack服务提供网络连接即服务,比如OpenStack计算。为用户提供API定义网络和使用。基于插件的架构其支持众多的网络提供商和技术。 |
存储 | ||
Object Storage | Swift | 通过一个 RESTful,基于HTTP的应用程序接口存储和任意检索的非结构化数据对象。它拥有高容错机制,基于数据复制和可扩展架构。它的实现并像是一个文件服务器需要挂载目录。在此种方式下,它写入对象和文件到多个硬盘中,以确保数据是在集群内跨服务器的多份复制。 |
Block Storage | Cinder | 为运行实例而提供的持久性块存储。它的可插拔驱动架构的功能有助于创建和管理块存储设备。 |
共享服务 | ||
Identity service | Keystone | 为其他OpenStack服务提供认证和授权服务,为所有的OpenStack服务提供一个端点目录。 |
Image service | 存储和检索虚拟机磁盘镜像,OpenStack计算会在实例部署时使用此服务。 | |
Glance服务 | 存储和检索虚拟机磁盘镜像,OpenStack计算会在实例部署时使用此服务。 | |
Telemetry服务 | 为OpenStack云的计费、基准、扩展性以及统计等目的提供监测和计量。 | |
高层次服务 | ||
Orchestration服务 | Heat服务请参见http://docs.openstack.org/developer/heat/ | Orchestration服务支持多样化的综合的云应用,通过调用OpenStack-native REST API和CloudFormation-compatible Query API,支持HOT <Heat Orchestration Template (HOT)> 格式模板或者AWS CloudFormation格式模板 |
架构示意图
架构硬件需求
控制器
控制节点上运行身份认证服务,镜像服务,计算服务的管理部分,网络服务的管理部分,多种网络代理以及仪表板。也需要包含一些支持服务,例如:SQL数据库、消息队列和NTP。
计算节点
计算节点上运行计算服务中管理实例的管理程序部分。默认情况下,计算服务使用 KVM。
你可以部署一个及以上计算节点。每个计算节点至少需要两块网卡。
块设备存储
可选的块存储节点上包含了磁盘,块存储服务和共享文件系统会向实例提供这些磁盘。
为了简单起见,计算节点和本节点之间的服务流量使用管理网络。生产环境中应该部署一个单独的存储网络以增强性能和安全。
你可以部署超过一个块存储节点。每个块存储节点要求至少一块网卡。
对象存储
可选的对象存储节点包含了磁盘。对象存储服务用这些磁盘来存储账号,容器和对象。
为了简单起见,计算节点和本节点之间的服务流量使用管理网络。生产环境中应该部署一个单独的存储网络以增强性能和安全。
这个服务要求两个节点。每个节点要求最少一块网卡。你可以部署超过两个对象存储节点。
网络
从下面的虚拟网络选项中选择一种选项。
网络选项1:公共网络
公有网络选项使用尽可能简单的方式主要通过layer-2(网桥/交换机)服务以及VLAN网络的分割来部署OpenStack网络服务。本质上,它建立虚拟网络到物理网络的桥,依靠物理网络基础设施提供layer-3服务(路由)。另外也会通过DHCP
为实例提供IP地址信息。
注:这个选项不支持私有网络,layer-3服务以及一些高级服务,例如:LBaaS and FWaaS。如果你需要这些服务,请考虑私有网络选项。
网络选项2:私有网络
私有网络选项扩展了公有网络选项,增加了启用 self-service覆盖分段方法的layer-3(路由)服务,比如
VXLAN。本质上,它使用 NAT
路由虚拟网络到物理网络。另外,这个选项也提供高级服务的基础,比如LBaas和FWaaS。
环境准备
OS | 主机名 | IP | roles |
---|---|---|---|
Centos 7.5 | controller | 192.168.20.2 | 控制节点 |
Centos 7.5 | compute01 | 192.168.20.3 | 计算节点 |
注:如果你是使用vmware来做测试,那么需要开启cpu虚拟化功能,如下:
为了方便记忆,文章中涉及到的所有密码均设置为
123.com
,若用于生产,请自行替换为符合复杂度的密码。
系统初始化
系统初始化这一小节的所有操作,没有特别注明的,均需在所有节点上执行。
关闭防火墙及selinux
# 关防火墙
$ systemctl stop firewalld && systemctl disable firewalld
# 关selinux
setenforce 0
sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/selinux/config
sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux
修改主机名
# 控制节点执行
$ hostnamectl set-hostname controller
# 计算节点执行
$ hostnamectl set-hostname compute01
# 所有节点执行刷新生效
bash
source /etc/profile
配置hosts解析记录
$ cat >> /etc/hosts << EOF
192.168.20.2 controller
192.168.20.3 compute01
EOF
调整内核参数
$ cat > /etc/sysctl.conf << EOF
kernel.sysrq = 0
kernel.core_uses_pid = 1
fs.file-max=655360
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.pid_max = 655360
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_orphans = 655360
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.gc_timeout = 100
# 禁止icmp重定向报文
net.ipv4.conf.all.accept_redirects = 0
# 禁止icmp源路由
net.ipv4.conf.all.accept_source_route = 0
net.core.somaxconn = 65535
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
vm.swappiness = 3
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF
$ sysctl -p > /dev/null
调整最大可打开文件数
$ mv /etc/security/limits.conf{,.bak}
cat > /etc/security/limits.conf << EOF
* - nofile 650000
* - memlock unlimited
* - stack 655360
* - nproc unlimited
EOF
执行此操作后,需要重新打开终端,才可生效。
安装基础组件
配置ntp
控制节点配置为ntp服务端
在控制节点上执行这些步骤。
# 安装软件包
$ yum -y install chrony
# 编辑配置文件
$ mv /etc/chrony.conf{,.bak}
cat > /etc/chrony.conf << EOF
bindcmdaddress 0.0.0.0
server ntp.aliyun.com iburst
allow 192.168.20.0/24
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF
# 启动chronyd
systemctl enable chronyd && systemctl restart chronyd
计算节点同步控制节点时间
# 安装软件包
$ yum -y install chrony
# 编辑配置文件
$ mv /etc/chrony.conf{,.bak}
cat > /etc/chrony.conf << EOF
server controller iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF
$ systemctl enable chronyd && systemctl restart chronyd
# 最好先手动测试下,可以同步时间
$ yum -y install ntp
$ ntpdate -u 192.168.20.2
配置openstack yum源
# 更换为阿里云源
$ mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache fast
########################## 不要按照官方文档安装mitaka版本了 #########################
# 启用openstack库(由于版本较旧,直接yum已找不到相关包,所以需要先下载到本地)
$ wget https://buildlogs.centos.org/centos/7/cloud/x86_64/openstack-mitaka/centos-release-openstack-mitaka-1-1.el7.noarch.rpm
yum -y localinstall centos-release-openstack-mitaka-1-1.el7.noarch.rpm
# 我因为按照官方安装了mitaka版本,造成最后上传镜像的size一直为0
# 掉到这个坑里一天了,换成 queens 版本就好了
######################## 请直接执行下面命令安装queens 版本 ###########################
$ yum -y install centos-release-openstack-queens
# 如果未来queens安装提示找不到安装包,就到阿里云看看现有的版本包吧,链接如下:
$ https://mirrors.aliyun.com/centos/7/cloud/x86_64/
安装openstack客户端
$ yum -y install python-openstackclient openstack-selinux
接下来的所有操作,如果没有特别说明,均是在控制节点执行。
安装数据库
大多数 OpenStack 服务使用 SQL 数据库来存储信息。 一般数据库运行在控制节点上。我这里为了方便起见,yum安装个MariaDB。OpenStack 服务也支持其他 SQL 数据库,包括PostgreSQL
。
此操作在控制节点上执行
# 安装数据库
$ yum -y install mariadb mariadb-server python2-PyMySQL
# 定义数据库配置文件
$ cat > /etc/my.cnf.d/openstack.cnf << EOF
[mysqld]
bind-address = 192.168.20.2
default-storage-engine = innodb
innodb_file_per_table
max_connections = 40960
collation-server = utf8_general_ci
character-set-server = utf8
EOF
# 启动数据库
$ systemctl enable mariadb && systemctl start mariadb
# 运行mysql_secure_installation命令,对数据库进行安全初始化
$ mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): # 默认密码为空,直接回车即可
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] y # 输入 y,设置密码
New password: # 第一次输入密码
Re-enter new password: # 再次输入密码
Password updated successfully!
Reloading privilege tables..
... Success!
# 接下来的所有提示,直接输入 “ y ” 后回车即可。
安装消息队列
# 安装
$ yum -y install rabbitmq-server
# 设置开机自启并启动
$ systemctl enable rabbitmq-server && systemctl start rabbitmq-server
# 开启监控页面
$ rabbitmq-plugins enable rabbitmq_management
# 确认所有端口在监听
$ ss -napl | grep 5672
tcp LISTEN 0 128 *:25672 *:* users:(("beam.smp",pid=35240,fd=45))
tcp LISTEN 0 1024 *:15672 *:* users:(("beam.smp",pid=35240,fd=56))
tcp LISTEN 0 128 [::]:5672 [::]:* users:(("beam.smp",pid=35240,fd=54))
# 创建openstack用户并授权
rabbitmqctl add_user openstack 123.com
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
# 设置openstack为管理员(可不执行,但不执行不可使用此用户登录到rabbitmq的管理页面)
$ rabbitmqctl set_user_tags openstack administrator
# 可以使用默认用户名/密码(guest/guest)用户登录到管理页面
访问15672端口,查看管理页面如下(使用openstack用户登录即可):
安装memcached
# 安装
$ yum -y install memcached python-memcached
# 调整配置文件监听所有地址
$ cat > /etc/sysconfig/memcached << EOF
PORT="11211"
USER="memcached"
MAXCONN="10240"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::"
EOF
# 设置为开机自启并启动
$ systemctl enable memcached && systemctl start memcached
# 确定端口在监听
$ ss -lnpt | grep 11211
LISTEN 0 1024 *:11211 *:* users:(("memcached",pid=36802,fd=26))
LISTEN 0 1024 [::]:11211 [::]:* users:(("memcached",pid=36802,fd=27))
安装Etcd
OpenStack服务可以使用Etcd(分布式可靠的键值存储)进行分布式键锁定,存储配置,跟踪服务活动性和其他情况。
$ yum -y install etcd
# 将你的主节点IP定义为变量My_ip
My_ip=192.168.20.2
# 修改配置文件
cat > /etc/etcd/etcd.conf << EOF
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://${My_ip}:2380"
ETCD_LISTEN_CLIENT_URLS="http://${My_ip}:2379"
ETCD_NAME="controller"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://${My_ip}:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://${My_ip}:2379"
ETCD_INITIAL_CLUSTER="controller=http://${My_ip}:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
# 启动etcd
$ systemctl enable etcd && systemctl start etcd
安装认证服务
OpenStackIdentity service
为认证管理,授权管理和服务目录服务管理提供单点整合。其它OpenStack服务将身份认证服务当做通用统一API来使用。此外,提供用户信息但是不在OpenStack项目中的服务(如LDAP服务)可被整合进先前存在的基础设施中。
为了从identity服务中获益,其他的OpenStack服务需要与它合作。当某个OpenStack服务收到来自用户的请求时,该服务询问Identity服务,验证该用户是否有权限进行此次请求。
身份服务包含这些组件:
- 服务器
一个中心化的服务器使用RESTful 接口来提供认证和授权服务。- 驱动
驱动或服务后端被整合进集中式服务器中。它们被用来访问OpenStack外部仓库的身份信息, 并且它们可能已经存在于OpenStack被部署在的基础设施(例如,SQL数据库或LDAP服务器)中。- 模块
中间件模块运行于使用身份认证服务的OpenStack组件的地址空间中。这些模块拦截服务请求,取出用户凭据,并将它们送入中央是服务器寻求授权。中间件模块和OpenStack组件间的整合使用Python Web服务器网关接口。
当安装OpenStack身份服务,用户必须将之注册到其OpenStack安装环境的每个服务。身份服务才可以追踪那些OpenStack服务已经安装,以及在网络中定位它们。
创建数据库
在配置 OpenStack 身份认证服务前,必须创建一个数据库和管理员令牌。
# 登录到数据库
$ mysql -uroot -p123.com
# 创建相关库并授权访问
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY '123.com';
安装keystone服务
# 安装
$ yum -y install openstack-keystone httpd mod_wsgi
配置keystone服务
# 生成一个随机值在初始的配置中作为管理员的令牌。
$ openssl rand -hex 10
c8e3130d15bd3c7282d9
# 备份并声称无注释的配置文件
$ mv /etc/keystone/keystone.conf{,.bak}
egrep -v '^$|^#' /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf
# 安装辅助工具,方便修改配置文件
$ yum -y install openstack-utils
# 指定数据库连接信息
$ openstack-config --set /etc/keystone/keystone.conf \
database connection mysql+pymysql://keystone:123.com@controller/keystone
# 配置Fernet UUID令牌的提供者
$ openstack-config --set /etc/keystone/keystone.conf \
token provider fernet
$ cat /etc/keystone/keystone.conf # 查看最后配置文件如下
[DEFAULT]
[assignment]
[auth]
[cache]
[catalog]
[cors]
[cors.subdomain]
[credential]
[database]
connection = mysql+pymysql://keystone:123.com@controller/keystone
[domain_config]
[endpoint_filter]
[endpoint_policy]
[eventlet_server]
[eventlet_server_ssl]
[federation]
[fernet_tokens]
[identity]
[identity_mapping]
[kvs]
[ldap]
[matchmaker_redis]
[memcache]
[oauth1]
[os_inherit]
[oslo_messaging_amqp]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_middleware]
[oslo_policy]
[paste_deploy]
[policy]
[resource]
[revoke]
[role]
[saml]
[shadow_users]
[signing]
[ssl]
[token]
provider = fernet
[tokenless_auth]
[trust]
初始化认证服务的数据库
# 初始化
$ su -s /bin/sh -c "keystone-manage db_sync" keystone
# 初始化成功后即可看到新增了哪些表
$ mysql keystone -u root -p123.com -e '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 |
+------------------------+
初始化Fernet keys
$ keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
$ keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
引导keystone服务
$ keystone-manage bootstrap --bootstrap-password 123.com \
--bootstrap-admin-url http://controller:5000/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id RegionOne
配置httpd服务
# 配置ServerName选项为控制节点:
$ echo 'ServerName controller' >> /etc/httpd/conf/httpd.conf
# 配置网页目录
$ ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
启动httpd
$ systemctl enable httpd && systemctl start httpd
配置管理帐户
# 下面的 OS_PASSWORD 值就是上面引导keystone服务 --bootstrap-password 指定的
$ export OS_USERNAME=admin
export OS_PASSWORD=123.com
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
创建域、项目、用户和角色
这里套用下阿里云等来解释下域、项目、用户和角色:
- 域:对应阿里云的华北一区、华南一区等;
- 项目:一个团队/公司就是一个项目(在之前,项目也被称为“租户”);
- 用户:一个团队/公司开通了一个项目,项目中可能会开通多个子张账号,一个子账号就是一个用户;
- 角色:一般是用户权限的集合,如这个角色拥有增删改查的权限,将角色和用户进行绑定,那么这个用户将拥有这个角色的所有权限。
身份认证服务为每个OpenStack服务提供认证服务。认证服务使用 domains, projects (tenants), users<user>
和 roles<role>
的组合。
创建域
尽管在前面的引导操作程序步骤中已经存在“Default”域,但是创建新域的正式方法是:
$ openstack domain create --description "An Example Domain" example
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | An Example Domain |
| enabled | True |
| id | 2237f7b7d3034a73b919cff0d68520a9 |
| name | example |
| tags | [] |
+-------------+----------------------------------+
创建项目
使用一个service
项目,其中包含你添加到环境中的每个服务的唯一用户。
$ openstack project create --domain Default \
--description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | 24ac7f19cd944f4cba1d77469b2a73ed |
| is_domain | False |
| name | service |
| parent_id | default |
+-------------+----------------------------------+
创建一个普通项目和用户
常规(非管理员)任务应使用没有特权的项目和用户。例如,这里创建demo
项目和用户。
1、创建demo项目:
# 为该项目创建其他用户时,请不要重复此步骤。
$ openstack project create --domain Default \
--description "Demo Project" demo
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| domain_id | default |
| enabled | True |
| id | 231ad6e7ebba47d6a1e57e1cc07ae446 |
| is_domain | False |
| name | demo |
| parent_id | default |
+-------------+----------------------------------+
2、创建demo
用户:
$ openstack user create --domain Default \
--password 123.com demo
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | aeda23aa78f44e859900e22c24817832 |
| name | demo |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
3、创建user角色
$ openstack role create user
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | None |
| id | 8d8a5771188f4f9fae97edebed89bc9b |
| name | user |
+-----------+----------------------------------+
4、将user
角色和demo
项目、用户进行绑定:
$ openstack role add --project demo --user demo user
注:可以重复此过程以创建其他项目和用户。
验证操作
1、重置OS_TOKEN
和OS_URL
环境变量:
$ unset OS_AUTH_URL OS_PASSWORD
2、使用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 token issue
Password: # 输入admin用户的密码
+------------+--------------------------------------------------------------------------+
| Field | Value |
+------------+--------------------------------------------------------------------------+
| expires | 2021-02-09T14:51:45.000000Z |
| id | gAAAAABgIpNx4qHext8s9KOOesZByDfUKZEIiyHvy0A6xIkVlJJtio3CCisOt58QdbByzptR |
| | ob-2TBPWG4aW5htOk2xVqaEhU8HOnhXN1yPO6SflUlxnWr--p3FLbV6vV2r2QdghqfH- |
| | siV5ibgecuTKt_lAzyQlHKNxQ3adOtO8O5kJ7sqzMHg |
| project_id | 45bb817145db4c6aaa420e3f68a65d7f |
| user_id | 927c5a862d80453c929832276a4f3df0 |
+------------+--------------------------------------------------------------------------+
3、使用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 token issue
Password: # 输入demo的密码
+------------+--------------------------------------------------------------------------+
| Field | Value |
+------------+--------------------------------------------------------------------------+
| expires | 2021-02-09T14:53:00.000000Z |
| id | gAAAAABgIpO8ocJlNoeXXvEhMUwc1Qgv292_Y00N1T3YRnGpCKyVgaIPOS7u27NSIhIJ- |
| | kVXH5FyRX02qhJebL-bbxQmIRbiu3YqPZdScpFqpeJBIVG4eMmKPGZEPWnDzCDP- |
| | qQjKYtqQjNNgqX3oaO-IjBzpPjHKq4LsFTJtpfmiTn8VhjffY0 |
| project_id | 5d4bc084dfb4491e840f44523148f8a2 |
| user_id | cb10307eb3194f39a2d52df5b8945403 |
+------------+--------------------------------------------------------------------------+
创建openstack客户端环境脚本
在上面我们使用环境变量和命令选项的组合通过openstack
客户端与身份认证服务交互。为了提升客户端操作的效率,OpenStack支持简单的客户端环境变量脚本,即OpenRC 文件。这些脚本通常包含客户端所有常见的选项,当然也支持独特的选项。
创建脚本
创建admin
和demo
项目和用户创建客户端环境变量脚本。这篇文章接下来的部分会引用这些脚本,为客户端操作加载合适的的凭证。
# 创建admin用户凭证变量(将OS_PASSWORD值替换为你实际的密码)
$ cd # 为了安全起见,最好写在家目录下
$ cat > admin-openrc << EOF
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=123.com
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
# 创建demo用户凭证变量(将OS_PASSWORD值替换为你实际的密码)
$ cat > demo-openrc << EOF
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=123.com
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
使用脚本
使用特定租户和用户运行客户端,你可以在运行之前简单地加载相关客户端脚本。例如:
1、加载admin-openrc
文件来身份认证服务的环境变量位置和admin
项目和用户证书:
$ source admin-openrc
# 将加载脚本命令写入root的环境变量中,以便每次重新登录后自动加载
$ echo 'source admin-openrc' >> .bashrc
2、请求认证令牌:
$ openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2021-02-11T09:51:48+0000 |
| id | gAAAAABgJPAkMlKhpGYe-_8SY5-ljZLSB2YprICFmFLBwIf0qccdY9OBwxwK0_U2MC01jbrG18LxmprB4DW09_8sRbsX6PQ01ALY5qkM4D5Dc2hs6e1CFAUqgCVn184ZBGgNWjKOuG0zh81r0_WBYMLItuzG1vlzWuE2ETia53V07D2WKhieoT4 |
| project_id | 87534890ad8f4cd698bd4eb6aaabf9b0 |
| user_id | 0a3b251986314107ac910059a4056380 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
安装镜像服务
镜像服务 (glance) 允许用户发现、注册和获取虚拟机镜像。它提供了一个 REST API,允许我们查询虚拟机镜像的 metadata 并获取一个现存的镜像。我们可以将虚拟机镜像存储到各种位置,从简单的文件系统到对象存储系统—-例如 OpenStack 对象存储, 并通过镜像服务使用。
OpenStack镜像服务是IaaS的核心服务,它接受磁盘镜像或服务器镜像API请求,和来自终端用户或OpenStack计算组件的元数据定义。它也支持包括OpenStack对象存储在内的多种类型仓库上的磁盘镜像或服务器镜像存储。
大量周期性进程运行于OpenStack镜像服务上以支持缓存。同步复制(Replication)服务保证集群中的一致性和可用性。其它周期性进程包括auditors、updaters和reapers。
OpenStack镜像服务包括以下组件:
- glance-api:接收镜像API的调用,诸如镜像发现、恢复、存储。
- glance-registry:存储、处理和恢复镜像的元数据,元数据包括项诸如大小和类型。
数据库:存放镜像元数据,用户是可以依据个人喜好选择数据库的,多数的部署使用MySQL或SQLite。- 镜像文件的存储仓库:支持多种类型的仓库,它们有普通文件系统、对象存储、RADOS块设备、HTTP、以及亚马逊S3。记住,其中一些仓库仅支持只读方式使用。
- 元数据定义服务:通用的API,是用于为厂商,管理员,服务,以及用户自定义元数据。这种元数据可用于不同的资源,例如镜像,工件,卷,配额以及集合。一个定义包括了新属性的键,描述,约束以及可以与之关联的资源的类型。
glance-registry是私有内部服务,用于服务OpenStack Image服务。不要向用户暴露该服务
创建glance数据库
# 登录到数据库
$ mysql -u root -p123.com
# 创建库并授权账号
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
IDENTIFIED BY '123.com';
keystone中创建相关账号
# 加载admin凭证
$ source admin-openrc
# 创建glance用户
$ openstack user create --domain Default --password 123.com glance
# 添加 admin 角色到 glance 用户和 service 项目上。
$ openstack role add --project service --user glance admin
keystone中添加服务实体及API端点
# 创建glance服务实体:
$ openstack service create --name glance \
--description "OpenStack Image" image
# 创建镜像服务的 API 端点:
$ openstack endpoint create --region RegionOne \
image public http://controller:9292
$ openstack endpoint create --region RegionOne \
image internal http://controller:9292
$ openstack endpoint create --region RegionOne \
image admin http://controller:9292
安装软件包
$ yum -y install openstack-glance
定义配置文件
# 修改glance-api配置文件
$ mv /etc/glance/glance-api.conf{,.bak}
egrep -v '^$|^#' /etc/glance/glance-api.conf.bak > /etc/glance/glance-api.conf
openstack-config --set /etc/glance/glance-api.conf database connection mysql+pymysql://glance:123.com@controller/glance
openstack-config --set /etc/glance/glance-api.conf glance_store stores file,http
openstack-config --set /etc/glance/glance-api.conf glance_store default_store file
openstack-config --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir /var/lib/glance/images/
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_uri http://controller:5000
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_url http://controller:5000
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_type password
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_name service
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken username glance
openstack-config --set /etc/glance/glance-api.conf keystone_authtoken password 123.com
openstack-config --set /etc/glance/glance-api.conf paste_deploy flavor keystone
# 修改glance-registry配置文件
$ mv /etc/glance/glance-registry.conf{,.bak}
egrep -v '^$|^#' /etc/glance/glance-registry.conf.bak > /etc/glance/glance-registry.conf
openstack-config --set /etc/glance/glance-registry.conf database connection mysql+pymysql://glance:123.com@controller/glance
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_uri http://controller:5000
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_url http://controller:5000
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_type password
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_name service
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken username glance
openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken password 123.com
openstack-config --set /etc/glance/glance-registry.conf paste_deploy flavor keystone
写入镜像服务数据库
$ su -s /bin/sh -c "glance-manage db_sync" glance
忽略输出中任何不推荐使用的信息,如下:
设置开机自启并启动
$ systemctl enable openstack-glance-api \
openstack-glance-registry
systemctl start openstack-glance-api \
openstack-glance-registry
上传测试镜像进行验证
# 下载源镜像(体积很小,专用于测试的)
$ wget http://download.cirros-cloud.net/0.4.0/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 | 2021-02-11T09:09:14Z |
| disk_format | qcow2 |
| file | /v2/images/252d2b9b-0211-4d70-86d6-9cb17a72b297/file |
| id | 252d2b9b-0211-4d70-86d6-9cb17a72b297 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | 87534890ad8f4cd698bd4eb6aaabf9b0 |
| protected | False |
| schema | /v2/schemas/image |
| size | 12716032 |
| status | active |
| tags | |
| updated_at | 2021-02-11T09:09:14Z |
| virtual_size | None |
| visibility | public |
+------------------+------------------------------------------------------+
# 确认镜像已上传成功
$ openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 252d2b9b-0211-4d70-86d6-9cb17a72b297 | cirros | active |
+--------------------------------------+--------+--------+
# 镜像默认存在此路径下
$ ls /var/lib/glance/images/
252d2b9b-0211-4d70-86d6-9cb17a72b297
控制节点安装配置计算服务
使用OpenStack计算服务来托管和管理云计算系统。OpenStack计算服务是基础设施即服务(IaaS)系统的主要部分,模块主要由Python实现。
OpenStack计算组件请求OpenStack Identity服务进行认证;请求OpenStack Image服务提供磁盘镜像;为OpenStack dashboard提供用户与管理员接口。磁盘镜像访问限制在项目与用户上;配额以每个项目进行设定(例如,每个项目下可以创建多少实例)。OpenStack组件可以在标准硬件上水平大规模扩展,并且下载磁盘镜像启动虚拟机实例。
OpenStack计算服务由下列组件所构成(只列举部分重要组件):
- nova-api :接收和响应来自最终用户的计算API请求。相当于整个计算服务中的老大,负责管理虚机生命周期。
- nova-api-metadata :接受来自虚拟机发送的元数据请求。
- nova-compute:一个持续工作的守护进程,通过Hypervior的API来创建和销毁虚拟机实例。例如:KVM 或 QEMU 的 libvirt。它运行在每一个计算节点上。
- nova-scheduler:拿到一个来自队列请求虚拟机实例,然后决定哪台计算服务器主机来运行它。
- nova-conductor:用于nova-compute服务与数据库之间。它替代了由
nova-compute
服务对数据库的直接访问。nova-conductor模块可以水平扩展。但是,不要将它部署在运行nova-compute
服务的主机节点上。- nova-network:早期openstack版本管理虚机的网络(已弃用,使用neutron来代替,现在安装只是为了兼容旧版本。)
- nova-consoleauth 和 nova-novncproxy:web版的vnc来直接操作云主机,前者用于提供认证功能,后者是提供一个代理,用于访问正在运行的实例,通过VNC协议,支持基于浏览器的novnc客户端。
安装并配置控制节点
在控制节点执行这些操作。
数据库建库授权
# 登录到数据库
$ mysql -u root -p123.com
# 建库
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
# 创建用户
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
IDENTIFIED BY '123.com';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
IDENTIFIED BY '123.com';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
IDENTIFIED BY '123.com';
keystone注册服务
# 加载环境变量
$ source admin-openrc
# 创建nova用户(如果需要直接在命令行指定密码,请使用 --password 选项)
$ openstack user create --domain Default \
--password-prompt nova
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | 5733c399e3324dde993cd99d3777e63d |
| enabled | True |
| id | ac07788abdba4960b574329c36a648d6 |
| name | nova |
+-----------+----------------------------------+
# 给 nova 用户添加 admin 角色
$ openstack role add --project service --user nova admin
# 创建nova 服务实体
$ openstack service create --name nova \
--description "OpenStack Compute" compute
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Compute |
| enabled | True |
| id | 646056a13aa945a58fd8567811d764fb |
| name | nova |
| type | compute |
+-------------+----------------------------------+
# 创建 Compute 服务 API 端点
$ openstack endpoint create --region RegionOne \
compute public http://controller:8774/v2.1
+--------------+-------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------+
| enabled | True |
| id | 3c1caa473bfe4390a11e7177894bcc7b |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+-------------------------------------------+
$ openstack endpoint create --region RegionOne \
compute internal http://controller:8774/v2.1
+--------------+-------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------+
| enabled | True |
| id | e3c918de680746a586eac1f2d9bc10ab |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+-------------------------------------------+
$ openstack endpoint create --region RegionOne \
compute admin http://controller:8774/v2.1
+--------------+-------------------------------------------+
| Field | Value |
+--------------+-------------------------------------------+
| enabled | True |
| id | 38f7af91666a47cfb97b4dc790b94424 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 060d59eac51b4594815603d75a00aba2 |
| service_name | nova |
| service_type | compute |
| url | http://controller:8774/v2.1 |
+--------------+-------------------------------------------+
创建placement用户并注册服务
$ openstack user create --domain Default --password 123.com placement
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | 804102f88d1443dba8ee40df0faf03e6 |
| enabled | True |
| id | 6faf2948819e48a8baf4ef3296b08b76 |
| name | placement |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
$ openstack role add --project service --user placement admin
# 创建服务实体
$ openstack service create --name placement --description "Placement API" placement
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Placement API |
| enabled | True |
| id | 6b3fe491c83f4e02a1edcdea8611676c |
| name | placement |
| type | placement |
+-------------+----------------------------------+
# 注册endpoint
$ openstack endpoint create --region RegionOne placement public http://controller:8778
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 2b1b2637908b4137a9c2e0470487cbc0 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 2d1a27022e6e4185b86adac4444c495f |
| service_name | placement |
| service_type | placement |
| url | http://controller:8778 |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne placement internal http://controller:8778
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 02bcda9a150a4bd7993ff4879df971ab |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 2d1a27022e6e4185b86adac4444c495f |
| service_name | placement |
| service_type | placement |
| url | http://controller:8778 |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne placement admin http://controller:8778
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 3d71177b9e0f406f98cbff198d74b182 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 2d1a27022e6e4185b86adac4444c495f |
| service_name | placement |
| service_type | placement |
| url | http://controller:8778 |
+--------------+----------------------------------+
安装组件
$ yum -y install openstack-nova-api openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy \
openstack-nova-scheduler openstack-nova-placement-api
修改配置文件
# 备份默认配置文件
$ mv /etc/nova/nova.conf{,.bak}
egrep -v '^$|^#' /etc/nova/nova.conf.bak > /etc/nova/nova.conf
# 修改如下
openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata
openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:123.com@controller
openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.20.2
openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True
openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
openstack-config --set /etc/nova/nova.conf api_database connection mysql+pymysql://nova:123.com@controller/nova_api
openstack-config --set /etc/nova/nova.conf database connection mysql+pymysql://nova:123.com@controller/nova
openstack-config --set /etc/nova/nova.conf api auth_strategy keystone
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:5000/v3
openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service
openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova
openstack-config --set /etc/nova/nova.conf keystone_authtoken password 123.com
openstack-config --set /etc/nova/nova.conf vnc enabled True
openstack-config --set /etc/nova/nova.conf vnc server_listen '$my_ip'
openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address '$my_ip'
openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292
openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
openstack-config --set /etc/nova/nova.conf placement region_name RegionOne
openstack-config --set /etc/nova/nova.conf placement project_domain_name Default
openstack-config --set /etc/nova/nova.conf placement project_name service
openstack-config --set /etc/nova/nova.conf placement auth_type password
openstack-config --set /etc/nova/nova.conf placement user_domain_name Default
openstack-config --set /etc/nova/nova.conf placement auth_url http://controller:5000/v3
openstack-config --set /etc/nova/nova.conf placement username placement
openstack-config --set /etc/nova/nova.conf placement password 123.com
开启placement api的访问
$ cat >> /etc/httpd/conf.d/00-nova-placement-api.conf << EOF
<Directory /usr/bin>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
EOF
# 重启httpd
$ systemctl restart httpd
同步compute数据库:
$ su -s /bin/sh -c "nova-manage api_db sync" nova
$ su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
$ su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
57562b82-a93b-40bd-a698-57a9db693bbc
$ su -s /bin/sh -c "nova-manage db sync" nova
# 忽略下面输出的提示信息
/usr/lib/python2.7/site-packages/pymysql/cursors.py:170: Warning: (1831, u'Duplicate index `block_device_mapping_instance_uuid_virtual_name_device_name_idx`. This is deprecated and will be disallowed in a future release.')
result = self._query(query)
/usr/lib/python2.7/site-packages/pymysql/cursors.py:170: Warning: (1831, u'Duplicate index `uniq_instances0uuid`. This is deprecated and will be disallowed in a future release.')
result = self._query(query)
# 验证nova cell0和cell1是否正确注册:
$ nova-manage cell_v2 list_cells
+-------+--------------------------------------+------------------------------------+-------------------------------------------------+
| 名称 | UUID | Transport URL | 数据库连接 |
+-------+--------------------------------------+------------------------------------+-------------------------------------------------+
| cell0 | 00000000-0000-0000-0000-000000000000 | none:/ | mysql+pymysql://nova:****@controller/nova_cell0 |
| cell1 | 57562b82-a93b-40bd-a698-57a9db693bbc | rabbit://openstack:****@controller | mysql+pymysql://nova:****@controller/nova |
+-------+--------------------------------------+------------------------------------+-------------------------------------------------+
[
启动并设置为开机自启
# systemctl enable openstack-nova-api \
openstack-nova-consoleauth openstack-nova-scheduler \
openstack-nova-conductor openstack-nova-novncproxy
# systemctl start openstack-nova-api \
openstack-nova-consoleauth openstack-nova-scheduler \
openstack-nova-conductor openstack-nova-novncproxy
验证操作
$ openstack compute service list # 能看到如下输出即表示配置无误
+----+------------------+------------+----------+---------+-------+----------------------------+
| Id | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-conductor | controller | internal | enabled | up | 2021-02-10T03:49:51.000000 |
| 2 | nova-scheduler | controller | internal | enabled | up | 2021-02-10T03:49:51.000000 |
| 3 | nova-consoleauth | controller | internal | enabled | up | 2021-02-10T03:49:51.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+
安装配置计算节点
在计算节点执行这些操作。
计算节点只需要安装nova-compute服务,以便调用libvirtd来创建虚机。
安装软件包
$ yum -y install openstack-nova-compute openstack-utils
修改配置文件
# 备份默认配置文件
$ mv /etc/nova/nova.conf{,.bak}
egrep -v '^$|^#' /etc/nova/nova.conf.bak > /etc/nova/nova.conf
# 定义本机IP
My_ip=192.168.20.3
# 修改配置文件如下
openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata
openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:123.com@controller
openstack-config --set /etc/nova/nova.conf DEFAULT my_ip ${My_ip}
openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True
openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
openstack-config --set /etc/nova/nova.conf api auth_strategy keystone
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:5000/v3
openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service
openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova
openstack-config --set /etc/nova/nova.conf keystone_authtoken password 123.com
openstack-config --set /etc/nova/nova.conf vnc enabled True
openstack-config --set /etc/nova/nova.conf vnc server_listen 0.0.0.0
openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address '$my_ip'
openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://controller:6080/vnc_auto.html
openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292
openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
openstack-config --set /etc/nova/nova.conf placement region_name RegionOne
openstack-config --set /etc/nova/nova.conf placement project_domain_name Default
openstack-config --set /etc/nova/nova.conf placement project_name service
openstack-config --set /etc/nova/nova.conf placement auth_type password
openstack-config --set /etc/nova/nova.conf placement auth_url http://controller:5000/v3
openstack-config --set /etc/nova/nova.conf placement user_domain_name Default
openstack-config --set /etc/nova/nova.conf placement username placement
openstack-config --set /etc/nova/nova.conf placement password 123.com
确认安装
# 确定你的计算节点是否支持虚拟机的硬件加速:
$ egrep -c '(vmx|svm)' /proc/cpuinfo
2
# 如果此命令返回一个非0数字,则您的计算节点支持硬件加速,通常不需要其他配置。
# 如果此命令返回值为0,则你的计算节点不支持硬件加速,并且你必须配置libvirt为使用QEMU而不是KVM。
# 需要执行如下命令修改配置文件
$ openstack-config --set /etc/nova/nova.conf libvirt virt_type qemu
启动并加入开机自启
$ systemctl enable libvirtd openstack-nova-compute
systemctl start libvirtd openstack-nova-compute
如果你的openstack-nova-compute
服务启动失败,请检查 /var/log/nova/nova-compute.log
日志。
将计算节点添加到数据库中
在控制节点执行下面的命令:
# 获取管理员凭据以启用仅管理员的CLI命令,然后确认数据库中有计算主机:
$ source admin-openrc
$ openstack compute service list --service nova-compute
+----+--------------+-----------+------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+--------------+-----------+------+---------+-------+----------------------------+
| 6 | nova-compute | compute01 | nova | enabled | up | 2021-02-11T10:24:00.000000 |
+----+--------------+-----------+------+---------+-------+----------------------------+
# 发现计算节点
$ su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': 57562b82-a93b-40bd-a698-57a9db693bbc
Checking host mapping for compute host 'compute01': 4526491e-cf06-4803-b537-27413d5ebe4c
Creating host mapping for compute host 'compute01': 4526491e-cf06-4803-b537-27413d5ebe4c
注意:添加新的计算节点时,必须在控制器节点上运行以注册这些新的计算节点。另外,你可以在中设置适当的间隔 ,如下:
[scheduler]
discover_hosts_in_cells_interval = 300
验证操作
$ source admin-openrc
# 列出服务组件以验证每个进程的成功启动和注册:
$ openstack compute service list
# 此输出应在控制器节点上启用的三个服务组件和在计算节点上启用的一个服务组件。
+----+------------------+------------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-conductor | controller | internal | enabled | up | 2021-02-11T10:31:03.000000 |
| 4 | nova-scheduler | controller | internal | enabled | up | 2021-02-11T10:31:05.000000 |
| 5 | nova-consoleauth | controller | internal | enabled | up | 2021-02-11T10:31:05.000000 |
| 6 | nova-compute | compute01 | nova | enabled | up | 2021-02-11T10:31:10.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+
# 列出身份服务中的API端点以验证与身份服务的连接性:
$ openstack catalog list
+-----------+-----------+-----------------------------------------+
| Name | Type | Endpoints |
+-----------+-----------+-----------------------------------------+
| nova | compute | RegionOne |
| | | admin: http://controller:8774/v2.1 |
| | | RegionOne |
| | | internal: http://controller:8774/v2.1 |
| | | RegionOne |
| | | public: http://controller:8774/v2.1 |
| | | |
| keystone | identity | RegionOne |
| | | admin: http://controller:5000/v3/ |
| | | RegionOne |
| | | internal: http://controller:5000/v3 |
| | | RegionOne |
| | | public: http://controller:5000/v3 |
| | | |
| placement | placement | RegionOne |
| | | public: http://controller:8778 |
| | | RegionOne |
| | | admin: http://controller:8778 |
| | | RegionOne |
| | | internal: http://controller:8778 |
| | | |
| glance | image | RegionOne |
| | | internal: http://controller:9292 |
| | | RegionOne |
| | | admin: http://controller:9292 |
| | | RegionOne |
| | | public: http://controller:9292 |
| | | |
+-----------+-----------+-----------------------------------------+
# 确认镜像列表
$ openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 252d2b9b-0211-4d70-86d6-9cb17a72b297 | cirros | active |
+--------------------------------------+--------+--------+
# 检查单元格和展示位置API是否正常运行:
$ nova-status upgrade check
+-------------------------------+
| 升级检查结果 |
+-------------------------------+
| 检查: Cells v2 |
| 结果: 成功 |
| 详情: None |
+-------------------------------+
| 检查: Placement API |
| 结果: 成功 |
| 详情: None |
+-------------------------------+
| 检查: Resource Providers |
| 结果: 成功 |
| 详情: None |
+-------------------------------+
| 检查: Ironic Flavor Migration |
| 结果: 成功 |
| 详情: None |
+-------------------------------+
| 检查: API Service Version |
| 结果: 成功 |
| 详情: None |
+-------------------------------+
配置计算节点支持实例冷迁移
如果想让openstack环境支持实例冷迁移到其他节点上,需要提前配置,因为只有基于配置了冷迁移后创建的实例,才可以冷迁移,如果先创建的实例,后配置的冷迁移相关修改,那么之前创建的实例,也都是不能进行冷迁移的。
冷迁移必备条件
- 主机间的nova用户可互相免密登录
- nova节点要属于同一个可用域
- 可用域至少需要两个计算节点,并且有充足的资源可供迁移
配置计算节点之间nova用户免密登录
# 所有计算节点均需执行
$ usermod -s /bin/bash nova
# 接下来如果没有特殊说明,均是在任意某一个固定计算节点执行
$ su - nova
ssh-keygen -t rsa -q -N ''
# 定义计算节点IP列表
$ Computers=(
192.168.20.3
192.168.20.4
)
# 配置免密登录
$ cd /var/lib/nova/.ssh/
cp -fa id_rsa.pub authorized_keys
# 切换至其他用户,比如root(主要是为了可以向其他节点发送.ssh目录)
$ su -
# 将.ssh配置文件目录发送至其他所有计算节点
$ for i in ${Computers[@]};do rsync -az /var/lib/nova/.ssh $i:/var/lib/nova/;done
做完上述操作后,自行测试免密登录是否配置成功即可。
修改控制节点配置
# 定义scheduler调度策略
openstack-config --set /etc/nova/nova.conf DEFAULT scheduler_default_filters RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
# 重启scheduler
$ systemctl restart openstack-nova-scheduler
修改计算节点配置
# 修改计算节点nova配置文件
$ openstack-config --set /etc/nova/nova.conf DEFAULT allow_resize_to_same_host True
# 重启nova-compute服务
$ systemctl restart openstack-nova-compute
安装cinder存储服务
如果省略这一步骤,也不影响,后续所有实例都将存储在实例所在的计算节点上,如果安装配置了cinder服务,则都将存储在cinder的后端存储上,如果你仅用于学习,可以先跳过安装cinder,不影响后续操作,如果想要安装cinder,请参考博文:openstack之安装cinder服务。
安装neutron网络服务
OpenStack网络(neutron)管理OpenStack环境中所有虚拟网络基础设施(VNI),物理网络基础设施(PNI)的接入层。OpenStack网络允许租户创建包括像 firewall、load balancer和virtual private network 、等这样的高级虚拟网络拓扑。
网络服务提供网络,子网以及路由这些对象的抽象概念。每个抽象概念都有自己的功能,可以模拟对应的物理设备:网络包括子网,路由在不同的子网和网络间进行路由转发。
对于任意一个给定的网络都必须包含至少一个外部网络。不像其他的网络那样,外部网络不仅仅是一个定义的虚拟网络。相反,它代表了一种OpenStack安装之外的能从物理的,外部的网络访问的视图。外部网络上的IP地址可供外部网络上的任意的物理设备所访问。
外部网络之外,任何 Networking 设置拥有一个或多个内部网络。这些软件定义的网络直接连接到虚拟机。仅仅在给定网络上的虚拟机,或那些在通过接口连接到相近路由的子网上的虚拟机,能直接访问连接到那个网络上的虚拟机。
如果外部网络想要访问实例或者相反实例想要访问外部网络,那么网络之间的路由就是必要的了。每一个路由都配有一个网关用于连接到外部网络,以及一个或多个连接到内部网络的接口。就像一个物理路由一样,子网可以访问同一个路由上其他子网中的机器,并且机器也可以访问路由的网关访问外部网络。
另外,你可以将外部网络的IP地址分配给内部网络的端口。不管什么时候一旦有连接连接到子网,那个连接被称作端口。你可以给实例的端口分配外部网络的IP地址。通过这种方式,外部网络上的实体可以访问实例。
网络服务同样支持安全组。安全组允许管理员在安全组中定义防火墙规则。一个实例可以属于一个或多个安全组,网络为这个实例配置这些安全组中的规则,阻止或者开启端口,端口范围或者通信类型。
每一个Networking使用的插件都有其自有的概念。虽然对操作VNI和OpenStack环境不是至关重要的,但理解这些概念能帮助你设置Networking。所有的Networking安装使用了一个核心插件和一个安全组插件(或仅是空操作安全组插件)。另外,防火墙即服务(FWaaS)和负载均衡即服务(LBaaS)插件是可用的。
网络服务中的主要组件如下:
- neutron-server:接受和响应外部的网络管理请求;
- neutron-linuxbridge-agent:负责创建桥接网卡;
- neutron-dhcp-agent:负责分配IP;
- neutron-metadata-agent:配合nova-metadata-api实现虚拟机的定制化操作;
- L3-agent:实现三层网络vxlan(网络层)。
在控制节点执行这些操作。
数据库建库授权
$ mysql -u root -p123.com
# 创库、授权
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
IDENTIFIED BY '123.com';
注册到keystone
$ source admin-openrc
# 创建neutron用户
$ openstack user create --domain Default --password 123.com neutron
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | 804102f88d1443dba8ee40df0faf03e6 |
| enabled | True |
| id | f86224aa66d24674a088bca24507cdcd |
| name | neutron |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
# 添加admin角色到neutron
$ openstack role add --project service --user neutron admin
# 创建neutron实体
$ openstack service create --name neutron \
--description "OpenStack Networking" network
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Networking |
| enabled | True |
| id | 97b0428617c14f2284d8e00140f51728 |
| name | neutron |
| type | network |
+-------------+----------------------------------+
# 创建网络服务API端点
$ openstack endpoint create --region RegionOne \
network public http://controller:9696
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 9cd116af7b8e4caa8a3f0e3b468cc309 |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 018b47ad22e34492b16ed4322c8a3c3d |
| service_name | neutron |
| service_type | network |
| url | http://controller:9696 |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne \
network internal http://controller:9696
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 99e78179e83e47ddb6be52fb600c6f92 |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 018b47ad22e34492b16ed4322c8a3c3d |
| service_name | neutron |
| service_type | network |
| url | http://controller:9696 |
+--------------+----------------------------------+
$ openstack endpoint create --region RegionOne \
network admin http://controller:9696
+--------------+----------------------------------+
| Field | Value |
+--------------+----------------------------------+
| enabled | True |
| id | 26c62c13c66648db825868f144e34114 |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 018b47ad22e34492b16ed4322c8a3c3d |
| service_name | neutron |
| service_type | network |
| url | http://controller:9696 |
+--------------+----------------------------------+
安装软件包
在控制节点执行这些操作。
$ yum -y install openstack-neutron openstack-neutron-ml2 \
openstack-neutron-linuxbridge ebtables
配置公共网络服务
openstack支持两种网络,一种是公共网络(就是指二层网络),一种是私有网络(就是指三层网络),若想要使用三层网络,就必须配置二层网络。
这里我们统一使用公共网络
配置服务组件
# 备份默认配置文件
$ mv /etc/neutron/neutron.conf{,.bak}
egrep -v '^$|^#' /etc/neutron/neutron.conf.bak &> /etc/neutron/neutron.conf
# 修改配置文件如下
openstack-config --set /etc/neutron/neutron.conf database connection mysql+pymysql://neutron:123.com@controller/neutron
openstack-config --set /etc/neutron/neutron.conf DEFAULT core_plugin ml2
openstack-config --set /etc/neutron/neutron.conf DEFAULT service_plugins
openstack-config --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone
openstack-config --set /etc/neutron/neutron.conf DEFAULT notify_nova_on_port_status_changes True
openstack-config --set /etc/neutron/neutron.conf DEFAULT notify_nova_on_port_data_changes True
openstack-config --set /etc/neutron/neutron.conf DEFAULT transport_url rabbit://openstack:123.com@controller
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_uri http://controller:5000
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:35357
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_type password
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_name service
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken username neutron
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken password 123.com
openstack-config --set /etc/neutron/neutron.conf nova auth_url http://controller:35357
openstack-config --set /etc/neutron/neutron.conf nova auth_type password
openstack-config --set /etc/neutron/neutron.conf nova project_domain_name Default
openstack-config --set /etc/neutron/neutron.conf nova user_domain_name Default
openstack-config --set /etc/neutron/neutron.conf nova region_name RegionOne
openstack-config --set /etc/neutron/neutron.conf nova project_name service
openstack-config --set /etc/neutron/neutron.conf nova username nova
openstack-config --set /etc/neutron/neutron.conf nova password 123.com
openstack-config --set /etc/neutron/neutron.conf oslo_concurrency lock_path /var/lib/neutron/tmp
配置ML2插件
这里的ML2插件使用Linuxbridge机制来为实例创建layer-2虚拟网络基础设施,对应的还有一个机制叫做open vswitch,如果有兴趣,可以参考Neutron中Linux bridge与Open vSwitch两种plugin优劣势对比来详细了解两种插件的区别。
# 备份默认配置文件
$ mv /etc/neutron/plugins/ml2/ml2_conf.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/plugins/ml2/ml2_conf.ini.bak &> /etc/neutron/plugins/ml2/ml2_conf.ini
# 修改如下
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers flat,vlan
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers linuxbridge
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2_type_flat flat_networks provider
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini securitygroup enable_ipset true
配置Linuxbridge代理
# 备份默认配置文件
$ mv /etc/neutron/plugins/ml2/linuxbridge_agent.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak &> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
# 修改如下(第一行末尾的ens33是管理IP对应的物理网卡名称,请注意你的是否和我一致,不一致则修改)
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini linux_bridge physical_interface_mappings provider:ens33
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini vxlan enable_vxlan false
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup enable_security_group True
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
# 执行如下确保你的操作系统支持网桥过滤
# 主要是将下面两个内核参数值设置为1:
$ modprobe br_netfilter
cat >> /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl -p
配置DHCP代理
# 备份默认配置文件
$ mv /etc/neutron/dhcp_agent.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/dhcp_agent.ini.bak &> /etc/neutron/dhcp_agent.ini
# 修改如下
openstack-config --set /etc/neutron/dhcp_agent.ini DEFAULT interface_driver linuxbridge
openstack-config --set /etc/neutron/dhcp_agent.ini DEFAULT dhcp_driver neutron.agent.linux.dhcp.Dnsmasq
openstack-config --set /etc/neutron/dhcp_agent.ini DEFAULT enable_isolated_metadata True
配置元数据代理
# 备份默认配置文件
$ mv /etc/neutron/metadata_agent.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/metadata_agent.ini.bak &> /etc/neutron/metadata_agent.ini
# 修改如下
openstack-config --set /etc/neutron/metadata_agent.ini DEFAULT nova_metadata_host controller
openstack-config --set /etc/neutron/metadata_agent.ini DEFAULT metadata_proxy_shared_secret 123.com
为控制节点上的计算服务配置网络服务
# 修改如下:
openstack-config --set /etc/nova/nova.conf neutron url http://controller:9696
openstack-config --set /etc/nova/nova.conf neutron auth_url http://controller:35357
openstack-config --set /etc/nova/nova.conf neutron auth_type password
openstack-config --set /etc/nova/nova.conf neutron project_domain_name Default
openstack-config --set /etc/nova/nova.conf neutron user_domain_name Default
openstack-config --set /etc/nova/nova.conf neutron region_name RegionOne
openstack-config --set /etc/nova/nova.conf neutron project_name service
openstack-config --set /etc/nova/nova.conf neutron username neutron
openstack-config --set /etc/nova/nova.conf neutron password 123.com
openstack-config --set /etc/nova/nova.conf neutron service_metadata_proxy true
openstack-config --set /etc/nova/nova.conf neutron metadata_proxy_shared_secret 123.com
完成安装
1、网络服务初始化脚本需要一个软链接 /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
2、同步数据库
$ 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
3、重启控制节点计算api服务
$ systemctl restart openstack-nova-api
4、启动各个网络组件服务并加入开机自启
$ systemctl enable neutron-server \
neutron-linuxbridge-agent neutron-dhcp-agent \
neutron-metadata-agent
$ systemctl start neutron-server \
neutron-linuxbridge-agent neutron-dhcp-agent \
neutron-metadata-agent
5、确认各个组件已运行
# 如果没有查看到下面三个,请等一会再查看确认下
$ openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 282b5209-1d59-4757-83a1-4dc182fce394 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent |
| 7097b871-f617-46bb-85dc-11a6c2cf61eb | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent |
| 9e871155-a5b7-4f66-8e02-35e8f8e8b2bd | Linux bridge agent | controller | None | :-) | UP | neutron-linuxbridge-agent |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
安装配置计算节点
接下来的操作,在计算节点执行。
安装组件
$ yum -y install openstack-neutron-linuxbridge ebtables ipset
修改配置文件
# 备份默认配置文件
$ mv /etc/neutron/neutron.conf{,.bak}
egrep -v '^$|^#' /etc/neutron/neutron.conf.bak &> /etc/neutron/neutron.conf
# 修改如下
openstack-config --set /etc/neutron/neutron.conf DEFAULT transport_url rabbit://openstack:123.com@controller
openstack-config --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_uri http://controller:5000
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:35357
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_type password
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_name service
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken username neutron
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken password 123.com
openstack-config --set /etc/neutron/neutron.conf oslo_concurrency lock_path /var/lib/neutron/tmp
配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
# 备份默认配置文件
$ mv /etc/neutron/plugins/ml2/linuxbridge_agent.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak > /etc/neutron/plugins/ml2/linuxbridge_agent.ini
# 修改如下(注:请修改ens33为你的实际网卡名称)
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini linux_bridge physical_interface_mappings provider:ens33
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini vxlan enable_vxlan false
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup enable_security_group true
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
# 执行如下确保你的操作系统支持网桥过滤
# 主要是将下面两个内核参数值设置为1:
$ modprobe br_netfilter
cat >> /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl -p
为计算节点配置网络服务
# 修改配置文件如下
openstack-config --set /etc/nova/nova.conf neutron url http://controller:9696
openstack-config --set /etc/nova/nova.conf neutron auth_url http://controller:35357
openstack-config --set /etc/nova/nova.conf neutron auth_type password
openstack-config --set /etc/nova/nova.conf neutron project_domain_name Default
openstack-config --set /etc/nova/nova.conf neutron user_domain_name Default
openstack-config --set /etc/nova/nova.conf neutron region_name RegionOne
openstack-config --set /etc/nova/nova.conf neutron project_name service
openstack-config --set /etc/nova/nova.conf neutron username neutron
openstack-config --set /etc/nova/nova.conf neutron password 123.com
完成安装
# 重启compute服务
$ systemctl restart openstack-nova-compute
# 启动linuxbridge并加入开机自启
$ systemctl enable neutron-linuxbridge-agent && systemctl start neutron-linuxbridge-agent
# 输出控制器节点上的三个代理,每个计算节点上的一个代理。
$ openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 35c43658-37aa-48b9-bb55-d4d0ef0ea85b | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent |
| c3eb65c0-cdbc-4261-96ff-d67070d79cbf | Linux bridge agent | controller | None | :-) | UP | neutron-linuxbridge-agent |
| e1edb1f6-4e57-486a-8084-64486024bded | Linux bridge agent | compute01 | None | :-) | UP | neutron-linuxbridge-agent |
| ef568631-ea2a-4d53-a206-8111a1997396 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
安装Dashboard
以下操作在控制节点上执行。
# 安装
$ yum -y install openstack-dashboard
# 修改配置文件
$ vim /etc/openstack-dashboard/local_settings
# 配置仪表板以在controller节点上使用OpenStack服务
OPENSTACK_HOST = "controller"
# 允许所有主机访问仪表板:
ALLOWED_HOSTS = ['*', ]
# 注释165-169行
#CACHES = {
# 'default': {
# 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
# },
#}
# 增加如下(配置 memcached 会话存储服务):
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'controller:11211',
}
}
# 启用对域的支持
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
# 配置API版本
OPENSTACK_API_VERSIONS = {
"identity": 3,
"image": 2,
"volume": 2,
}
# 通过仪表盘创建用户时的默认域配置为 Default
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
# 通过仪表盘创建的用户默认角色配置为 user
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
# 如果您选择网络参数1,禁用支持3层网络服务
OPENSTACK_NEUTRON_NETWORK = {
...
'enable_router': False,
'enable_quotas': False,
'enable_distributed_router': False,
'enable_ha_router': False,
'enable_lb': False,
'enable_firewall': False,
'enable_v\p\n': False, # 担心违规,需要用 \ 隔开
'enable_fip_topology_check': False,
}
$ sed -i '1 i WSGIApplicationGroup %{GLOBAL}' /etc/httpd/conf.d/openstack-dashboard.conf
重启服务
$ systemctl restart httpd memcached
访问dashboard
访问 http://controller/dashboard (controller要配置解析为dashboard所在节点的IP),看到如下页面进行登录即可(admin密码就是admin-openrc
文件中的OS_PASSWORD
值):
登录后即可看到如下:
启动一个云主机
创建网络
# lvjianzhao 是我自定义的网络名称
$ openstack network create --share --provider-physical-network provider \
--provider-network-type flat lvjianzhao
- —share:表示公有网络,所有项目都可以使用此网络。
- —provider-physical-network: provider为物理网络的名称,和配置文件
/etc/neutron/plugins/ml2/ml2_conf.ini
中的flat_networks
值对应- —provider-network-type flat:同样和配置文件对应,因为配置文件中指定的网络类型就是flat。
创建子网
$ openstack subnet create --network lvjianzhao \
--allocation-pool start=192.168.20.30,end=192.168.20.254 \
--dns-nameserver 223.5.5.5 --gateway 192.168.20.1 \
--subnet-range 192.168.20.0/24 provider
- start/end:表示dhcp可分配的IP范围(需和宿主机在同一网段。这个范围不能包括任何已经使用的IP地址。)
- dns-nameserver:指定一个可用的dns服务器地址
- gateway:指定网关地址(必须是和上面IP范围真实的网关地址)
- lvjianzhao:上面创建的网络名称。
- 192.168.20.0/24:IP所在的网段。
- 最后的
provider
是子网的名称。
创建云主机的硬件配置方案
# 创建一个实例:1个cpu、512m内存和1G的硬盘
$ openstack flavor create --vcpus 1 --ram 512 --disk 1 m1.tiny
# 查看现有的硬件规格方案
$ openstack flavor list
+--------------------------------------+---------+-----+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+---------+-----+------+-----------+-------+-----------+
| 83fc1101-6c30-4359-84c2-9b37c3c517ed | m1.tiny | 512 | 1 | 0 | 1 | True |
+--------------------------------------+---------+-----+------+-----------+-------+-----------+
生成和添加秘钥对
# 生成和添加秘钥对
$ ssh-keygen -q -N "" -f ~/.ssh/id_rsa
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
# 确认公钥已添加
$ openstack keypair list
+-------+-------------------------------------------------+
| Name | Fingerprint |
+-------+-------------------------------------------------+
| mykey | aa:4e:2a:9d:28:b0:fa:a0:9c:d2:61:4b:44:0c:96:72 |
+-------+-------------------------------------------------+
增加安全组规则
# 列出可用安全组(如果你是管理员权限,此命令将列出所有租户的安全组)
$ openstack security group list
+--------------------------------------+---------+-------------+----------------------------------+
| ID | Name | Description | Project |
+--------------------------------------+---------+-------------+----------------------------------+
| 1d81a241-b68f-421c-9327-3f42a323791b | default | 缺省安全组 | 87534890ad8f4cd698bd4eb6aaabf9b0 |
+--------------------------------------+---------+-------------+----------------------------------+
# 放行icmp协议
$ openstack security group rule create --proto icmp default
# 放行22端口
$ openstack security group rule create --proto tcp --dst-port 22 default
# 确认安全组规则
$ openstack security group rule list default
+--------------------------------------+-------------+-----------+------------+--------------------------------------+
| ID | IP Protocol | IP Range | Port Range | Remote Security Group |
+--------------------------------------+-------------+-----------+------------+--------------------------------------+
| 05d7ff65-0822-4f42-a0b6-e0fd6523ad90 | None | None | | None |
| 060be274-f335-4b78-9f57-ee4eaef6f959 | None | None | | 1d81a241-b68f-421c-9327-3f42a323791b |
| 18a34ca2-db18-4b41-8617-564806d4944d | icmp | 0.0.0.0/0 | | None |
| 58d1a9ce-282e-45d9-8ae6-a9ee8a8b942d | tcp | 0.0.0.0/0 | 22:22 | None |
| 90a554f6-0ae2-45dc-a0bd-88ec0990869d | None | None | | None |
| f13c159f-54b2-4de8-8d6d-df6813faed50 | None | None | | 1d81a241-b68f-421c-9327-3f42a323791b |
+--------------------------------------+-------------+-----------+------------+--------------------------------------+
启动一个实例
1、列出可用类型
$ openstack flavor list
+--------------------------------------+---------+-----+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+---------+-----+------+-----------+-------+-----------+
| 83fc1101-6c30-4359-84c2-9b37c3c517ed | m1.tiny | 512 | 1 | 0 | 1 | True |
+--------------------------------------+---------+-----+------+-----------+-------+-----------+
2、列出可用镜像
$ openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 252d2b9b-0211-4d70-86d6-9cb17a72b297 | cirros | active |
+--------------------------------------+--------+--------+
3、列出可用网络
$ openstack network list
+--------------------------------------+------------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+------------+--------------------------------------+
| 61f51fcc-d4cc-4d79-a540-e94e77d7b3e8 | lvjianzhao | e242e157-365e-4004-a10b-cbb93d273eb2 |
+--------------------------------------+------------+--------------------------------------+
4、列出可用安全组
$ openstack security group list
+--------------------------------------+---------+-------------+----------------------------------+
| ID | Name | Description | Project |
+--------------------------------------+---------+-------------+----------------------------------+
| 1d81a241-b68f-421c-9327-3f42a323791b | default | 缺省安全组 | 87534890ad8f4cd698bd4eb6aaabf9b0 |
+--------------------------------------+---------+-------------+----------------------------------+
5、创建实例
# 请将下面指定的 net-id 换成你在上面查看的可用网络id号
$ openstack server create --flavor m1.tiny --image cirros \
--nic net-id=61f51fcc-d4cc-4d79-a540-e94e77d7b3e8 --security-group default \
--key-name mykey lvjianzhao_machine
6、查看创建的虚机
$ openstack server list
+--------------------------------------+--------------------+--------+--------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+--------------------+--------+--------------------------+
| cb5bde0c-9ce5-4c50-87a4-c75fedd494ae | lvjianzhao_machine | ACTIVE | lvjianzhao=192.168.20.31 |
+--------------------------------------+--------------------+--------+--------------------------+
解决云主机无法启动
如果你创建后,通过web控制台,看到实例启动卡在如下画面,请进行接下来的配置
# 计算节点配置如下(我的文档在启动计算节点的服务时,已经改过了,不会出现这种问题)
$ openstack-config --set /etc/nova/nova.conf libvirt cpu_mode none
openstack-config --set /etc/nova/nova.conf libvirt virt_type qemu
$ systemctl restart openstack-nova-compute
# 重启计算节点的openstack-nova-compute服务后,再重启云主机即可
登录到虚机
打开控制台后,根据提示的用户名/密码登录到系统后,可以执行sudo su -
切换至root用户:
历时两天,踩了很多坑,总算把这个文档码完了。
openstack新增计算节点
补充下,后期openstack集群扩容计算节点过程。假设新增节点IP为192.168.20.4
,接下来基于上面的环境,新增第二个计算节点。
注:如果你是使用vmware来做测试,那么需要开启cpu虚拟化功能,如下:
接下来的操作,如果没有特别说明,只需在要新增的计算节点进行即可。
关闭防火墙及selinux
# 关防火墙
$ systemctl stop firewalld && systemctl disable firewalld
# 关selinux
setenforce 0
sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/selinux/config
sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux
修改主机名
$ hostnamectl set-hostname compute02
# 执行刷新生效
bash
source /etc/profile
配置hosts解析记录
# 只要可以解析controller的名称即可
$ cat >> /etc/hosts << EOF
192.168.20.2 controller
EOF
调整内核参数
$ cat > /etc/sysctl.conf << EOF
kernel.sysrq = 0
kernel.core_uses_pid = 1
fs.file-max=655360
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.pid_max = 655360
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_orphans = 655360
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.gc_timeout = 100
# 禁止icmp重定向报文
net.ipv4.conf.all.accept_redirects = 0
# 禁止icmp源路由
net.ipv4.conf.all.accept_source_route = 0
net.core.somaxconn = 65535
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
vm.swappiness = 3
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF
$ sysctl -p > /dev/null
调整最大可打开文件数
$ mv /etc/security/limits.conf{,.bak}
cat > /etc/security/limits.conf << EOF
* - nofile 650000
* - memlock unlimited
* - stack 655360
* - nproc unlimited
EOF
执行此操作后,需要重新打开终端,才可生效。
同步控制节点时间
# 安装软件包
$ yum -y install chrony
# 编辑配置文件
$ mv /etc/chrony.conf{,.bak}
cat > /etc/chrony.conf << EOF
server controller iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
EOF
$ systemctl enable chronyd && systemctl restart chronyd
# 最好先手动测试下,可以同步时间
$ yum -y install ntp
$ ntpdate -u 192.168.20.2
配置openstack yum源
# 更换为阿里云源
$ mkdir /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache fast
# 安装openstack源
$ yum -y install centos-release-openstack-queens
# 如果未来queens安装提示找不到安装包,就到阿里云看看现有的版本包吧,链接如下:
$ https://mirrors.aliyun.com/centos/7/cloud/x86_64/
安装openstack客户端
$ yum -y install python-openstackclient openstack-selinux
安装计算服务软件包
$ yum -y install openstack-nova-compute openstack-utils
修改配置文件
# 备份默认配置文件
$ mv /etc/nova/nova.conf{,.bak}
egrep -v '^$|^#' /etc/nova/nova.conf.bak > /etc/nova/nova.conf
# 定义本机IP
My_ip=192.168.20.4
# 修改配置文件如下
openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata
openstack-config --set /etc/nova/nova.conf DEFAULT transport_url rabbit://openstack:123.com@controller
openstack-config --set /etc/nova/nova.conf DEFAULT my_ip ${My_ip}
openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True
openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver
openstack-config --set /etc/nova/nova.conf api auth_strategy keystone
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:5000/v3
openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service
openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova
openstack-config --set /etc/nova/nova.conf keystone_authtoken password 123.com
openstack-config --set /etc/nova/nova.conf vnc enabled True
openstack-config --set /etc/nova/nova.conf vnc server_listen 0.0.0.0
openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address '$my_ip'
openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://controller:6080/vnc_auto.html
openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292
openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
openstack-config --set /etc/nova/nova.conf placement region_name RegionOne
openstack-config --set /etc/nova/nova.conf placement project_domain_name Default
openstack-config --set /etc/nova/nova.conf placement project_name service
openstack-config --set /etc/nova/nova.conf placement auth_type password
openstack-config --set /etc/nova/nova.conf placement auth_url http://controller:5000/v3
openstack-config --set /etc/nova/nova.conf placement user_domain_name Default
openstack-config --set /etc/nova/nova.conf placement username placement
openstack-config --set /etc/nova/nova.conf placement password 123.com
# 修改网络服务相关参数
openstack-config --set /etc/nova/nova.conf neutron url http://controller:9696
openstack-config --set /etc/nova/nova.conf neutron auth_url http://controller:35357
openstack-config --set /etc/nova/nova.conf neutron auth_type password
openstack-config --set /etc/nova/nova.conf neutron project_domain_name Default
openstack-config --set /etc/nova/nova.conf neutron user_domain_name Default
openstack-config --set /etc/nova/nova.conf neutron region_name RegionOne
openstack-config --set /etc/nova/nova.conf neutron project_name service
openstack-config --set /etc/nova/nova.conf neutron username neutron
openstack-config --set /etc/nova/nova.conf neutron password 123.com
确认安装
# 确定你的计算节点是否支持虚拟机的硬件加速:
$ egrep -c '(vmx|svm)' /proc/cpuinfo
2
# 如果此命令返回一个非0数字,则您的计算节点支持硬件加速,通常不需要其他配置。
# 如果此命令返回值为0,则你的计算节点不支持硬件加速,并且你必须配置libvirt为使用QEMU而不是KVM。
# 需要执行如下命令修改配置文件
$ openstack-config --set /etc/nova/nova.conf libvirt virt_type qemu
启动并加入开机自启
$ systemctl enable libvirtd openstack-nova-compute
systemctl start libvirtd openstack-nova-compute
如果你的openstack-nova-compute
服务启动失败,请检查 /var/log/nova/nova-compute.log
日志。
将计算节点添加到数据库中
在控制节点执行下面的命令:
# 获取管理员凭据以启用仅管理员的CLI命令,然后确认数据库中有计算主机:
$ source admin-openrc
$ openstack compute service list --service nova-compute
+----+--------------+-----------+------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+--------------+-----------+------+---------+-------+----------------------------+
| 8 | nova-compute | compute01 | nova | enabled | up | 2021-02-13T03:46:38.000000 |
| 9 | nova-compute | compute02 | nova | enabled | up | 2021-02-13T03:46:42.000000 |
+----+--------------+-----------+------+---------+-------+----------------------------+
# 发现计算节点
$ su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Found 2 cell mappings.
Skipping cell0 since it does not contain hosts.
Getting computes from cell 'cell1': e64b6f62-ebb4-49b9-be97-d143209a8d0f
Checking host mapping for compute host 'compute02': 05f333bb-7dd6-4495-89cb-419afb07b2df
Creating host mapping for compute host 'compute02': 05f333bb-7dd6-4495-89cb-419afb07b2df
Found 1 unmapped computes in cell: e64b6f62-ebb4-49b9-be97-d143209a8d0f
注意:添加新的计算节点时,必须在控制器节点上运行以注册这些新的计算节点。另外,你可以在中设置适当的间隔 ,如下:
[scheduler]
discover_hosts_in_cells_interval = 300
验证操作
$ source admin-openrc
# 列出服务组件以验证每个进程的成功启动和注册:
$ openstack compute service list
# 此输出应在控制器节点上启用的三个服务组件和在每个计算节点上启用的一个服务组件。
+----+------------------+------------+----------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+----+------------------+------------+----------+---------+-------+----------------------------+
| 1 | nova-scheduler | controller | internal | enabled | up | 2021-02-13T03:49:07.000000 |
| 2 | nova-consoleauth | controller | internal | enabled | up | 2021-02-13T03:49:07.000000 |
| 3 | nova-conductor | controller | internal | enabled | up | 2021-02-13T03:49:06.000000 |
| 8 | nova-compute | compute01 | nova | enabled | up | 2021-02-13T03:49:08.000000 |
| 9 | nova-compute | compute02 | nova | enabled | up | 2021-02-13T03:49:12.000000 |
+----+------------------+------------+----------+---------+-------+----------------------------+
安装网络组件
接下来的所有配置,还是在新增的计算节点执行。
$ yum -y install openstack-neutron-linuxbridge ebtables ipset
修改配置文件
# 备份默认配置文件
$ mv /etc/neutron/neutron.conf{,.bak}
egrep -v '^$|^#' /etc/neutron/neutron.conf.bak &> /etc/neutron/neutron.conf
# 修改如下
openstack-config --set /etc/neutron/neutron.conf DEFAULT transport_url rabbit://openstack:123.com@controller
openstack-config --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_uri http://controller:5000
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:35357
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_type password
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name Default
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name Default
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_name service
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken username neutron
openstack-config --set /etc/neutron/neutron.conf keystone_authtoken password 123.com
openstack-config --set /etc/neutron/neutron.conf oslo_concurrency lock_path /var/lib/neutron/tmp
配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
# 备份默认配置文件
$ mv /etc/neutron/plugins/ml2/linuxbridge_agent.ini{,.bak}
egrep -v '^$|^#' /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak > /etc/neutron/plugins/ml2/linuxbridge_agent.ini
# 修改如下(注:请修改ens33为你的实际网卡名称)
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini linux_bridge physical_interface_mappings provider:ens33
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini vxlan enable_vxlan false
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup enable_security_group true
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
# 执行如下确保你的操作系统支持网桥过滤
# 主要是将下面两个内核参数值设置为1:
$ modprobe br_netfilter
cat >> /etc/sysctl.conf << EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sysctl -p
完成安装
# 启动linuxbridge并加入开机自启
$ systemctl enable neutron-linuxbridge-agent && systemctl start neutron-linuxbridge-agent
# 输出控制器节点上的三个代理,每个计算节点上的一个代理(在控制节点执行)。
$ openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID | Agent Type | Host | Availability Zone | Alive | State | Binary |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 209deeda-ae2c-4605-98a5-32ec7d7fea73 | Linux bridge agent | compute02 | None | :-) | UP | neutron-linuxbridge-agent |
| 282b5209-1d59-4757-83a1-4dc182fce394 | Metadata agent | controller | None | :-) | UP | neutron-metadata-agent |
| 7097b871-f617-46bb-85dc-11a6c2cf61eb | DHCP agent | controller | nova | :-) | UP | neutron-dhcp-agent |
| 9e871155-a5b7-4f66-8e02-35e8f8e8b2bd | Linux bridge agent | controller | None | :-) | UP | neutron-linuxbridge-agent |
| eecb7840-a9d5-4d50-b9eb-3fa27fec5010 | Linux bridge agent | compute01 | None | :-) | UP | neutron-linuxbridge-agent |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
创建云实例进行测试
首先创建主机聚合(目的是为了让创建的云实例运行在指定计算节点上)。
可以看到三个实例被正确创建到新增节点上,则表示新增节点成功:
计算节点会启动三个虚机实例,如下:
注:如果后续要删除测试的主机聚合,需要先将聚合中的主机移除,否则无法正确删除主机聚合。
验证实例冷迁移
经过上述操作,我们拥有了两个计算节点,并且需要保证都进行了配置计算节点支持实例冷迁移
步骤,满足了实例冷迁移的条件,那么现在我们就可以进行冷迁移测试了。
1、nova域有两个计算节点
2、创建实例
自行进行其他配置,然后创建一个实例。
3、迁移测试
注意下迁移前实例所在的节点哦。
点击“确认迁移”:
稍等几分钟后,即可看到迁移成功: