Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

标签: A-lab-部署验证

OpenStack-OpenvSwitch源码安装部署方案

1 OpenStack简介

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。

2 OpenStack架构图

整个OpenStack是由控制节点,计算节点,网络节点,存储节点四大部分组成。控制节点负责对其余节点的控制,包含虚拟机建立,迁移,网络分配,存储分配等等。计算节点负责虚拟机运行网络节点负责对外网络与内网络之间的通信存储节点负责对虚拟机的额外存储管理。其中各组件架构图如下:

OpenStack架构图

3 OpenStack必要组件

  • 认证管理服务,提供了Openstack其余所有组件的认证信息/令牌的管理、创建、修改等等,使用MySQL等数据库存储认证信息
  • 计算管理服务,是Openstack计算的弹性控制,提供虚拟机的创建、运行、迁移、快照等围绕虚拟机的服务,并提供API与控制节点对接,由控制节点下发任务,使用nova-api进行通信
  • 网络管理服务,提供了对网络节点的网络拓扑管理,负责管理私有网络与公有网络的通信,以及管理虚拟机网络之间通信/拓扑、管理虚拟机之上的防火墙等,同时提供Neutron在Horizon的管理界面
  • 镜像管理服务,用于管理虚拟机部署时所能提供的镜像,包含镜像的导入、格式以及制作相应的模板,是一套虚拟机镜像发现、注册、检索系统,所有计算实例都是从Glance镜像启动的
  • 控制台服务,是一个用以管理、控制Openstack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等,用户还可以在控制面板中使用终端(console)或VNC直接访问实例

4 OpenStack基础服务

  • OpenStack使用SQL数据库来存储信息。该数据库通常在控制器节点上运行
  • OpenStack使用消息队列来协调服务之间的操作和状态信息。消息队列服务通常在控制器节点上运行
  • 服务的身份服务、身份验证机制使用Memcached来缓存令牌。Memcached服务通常在控制器节点上运行
  • OpenStack服务使用Etcd(分布式可靠的键值存储)进行分布式键锁定,存储配置,跟踪服务活动性和其他情况

5 硬件配置

主机系统网卡1:eno1网卡2:eno2
openstackCentos7.6192.168.4.145192.168.5.145
computeCentos7.6192.168.4.144192.168.5.144

服务器具体配置要求如下:

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • 计算节点的BISO中开启CPU嵌套虚拟化(INTEL叫VT-x,AMD的叫AMD-V)

6 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

6.1 关闭SELinux(控制节点、计算节点)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@localhost  ~]# setenforce 0 
[root@localhost  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

6.2 关闭防火墙(控制节点、计算节点)

防止安装时出现各个组件的端口不能访问的问题。

[root@localhost  ~]#systemctl stop firewalld && systemctl disable firewalld                          

6.3 时间同步(控制节点、计算节点)

同步时间可以有效解决因时间不同而造成的不同步。

[root@localshot  ~]# yum -y install ntp
[root@localhost  ~]# ntpdate ntp1.aliyun.com
[root@localhost  ~]# timedatectl set-timezone Asia/Shanghai

6.4 内核隔离(控制节点、计算节点)

OpenStack部分机器用于做控制节点,大部分机器都是需要运行虚拟化软件,虚拟化平台有大量VM,而宿主机本身的系统也会跑一些服务,那么这就势必会造成VM与宿主机系统之间资源的抢占。我们可以通过修改内核参数指定操作系统使用指定的几个核,解决抢占问题。

[root@localhost  ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47"
[root@localhost  ~]# update-grub

6.5 关闭KVM内存共享(计算节点)

内存配置方面,关闭KVM内存共享,打开透明大页,提升主机CPU性能。

[root@localhost  ~]# echo 0>/sys/kernel/mm/ksm/pages_shared
echo 0>/sys/kernel/mm/ksm/pages_sharing
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always>/sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
[root@localhost  ~]# echo 0>/sys/kernel/mm/ksm/pages_shared
echo 0>/sys/kernel/mm/ksm/pages_sharing
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always>/sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

6.6 修改系统打开文件最大数量(计算节点、控制节点)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@localhost  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

6.7 降低Swap分区使用率(控制节点、计算节点) 

现在服务器的内存一般是上百GB,所以我们可以把这个参数值设置的低一些(如10-30之间),让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高宿主机系统和虚拟机的性能。

[root@localhost  ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf

7 基础服务部署

7.1 安装OpenStack国内yum源(控制节点、计算节点)

安装阿里的OpenStack yum源可以加快各组件的下载速度。

[root@localhost  ~]# cat << EOF >> /etc/yum.repos.d/openstack.repo
[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0
[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF

7.2 部署OpenStackClient(控制节点)

[root@localhost  ~]# yum upgrade -y
[root@localhost  ~]# yum install -y python-openstackclient openstack-selinux

7.3 部署MySQL(控制节点)

部署MySQL并且通过修改配置文件更改存储路径。

[root@localhost  ~]# yum install -y mariadb mariadb-server python2-PyMySQL
[root@localhost  ~]# vi /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address=192.168.4.145
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
[root@localhost  ~]# vi /etc/my.cnf
[client-mariadb]
socket=/var/lib/mysql/mysql.sock
[mysqld]
query_cache_size = 0
query_cache_type = OFF
max_connections = 4096
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

7.4 启动MySQL(控制节点)、

修改MySQL用户密码,并且system管理MySQL。

[root@localhost  ~]# systemctl enable mariadb
[root@localhost  ~]# systemctl start mariadb
[root@localhost  ~]# mysql -uroot 
MariaDB [(none)]> update mysql.user set password=password('tera123') where user = 'root';
MariaDB [(none)]> flush privileges;

7.5 部署RabbitMq(控制节点)

部署RabbitMq来协调服务之间的操作和状态信息,并且修改RabbitMq存储路径。

[root@localhost  ~]# yum -y install rabbitmq-server
[root@localhost  ~]# vi /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/var/lib/rabbitmq/log
[root@localhost  ~]# mkdir -p /var/lib/rabbitmq/mnesia
[root@localhost  ~]# mkdir -p /var/lib/rabbitmq/log
[root@localhost  ~]# chmod -R 755 /var/lib/rabbitmq
[root@localhost  ~]# systemctl enable rabbitmq-server.service
[root@localhost  ~]# systemctl start rabbitmq-server.service

7.6 配置RabbitMq用户 (控制节点)

添加OpenStack用户并且配置用户权限

[root@localhost  ~]# rabbitmqctl add_user openstack tera123
Creating user “openstack” …
[root@localhost  ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user “openstack” in vhost “/”…

7.7 部署Memcached(控制节点)

部署Memcached,并修改配置文件。

[root@localhost  ~]# yum -y install memcached
[root@localhost  ~]# vi /etc/sysconfig/memcached
OPTIONS="-l 127.0.0.1,::1,192.168.4.145"
[root@localhost  ~]# systemctl enable memcached
[root@localhost  ~]# systemctl start memcached

7.8 部署Etcd(控制节点)

部署Etcd,修改配置文件,并且使用system管理。

[root@localhost  ~]# yum -y install etcd
[root@localhost  ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS=http://192.168.4.145:2380
ETCD_LISTEN_CLIENT_URLS="http://192.168.4.145:2379,http://127.0.0.1:2379"
ETCD_NAME="controller"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.4.145:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.4.145:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.4.145:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@localhost  ~]# systemctl enable etcd
[root@localhost  ~]# systemctl start etcd

8 Keystone(控制节点)

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

Keystone通常是用户与之交互的第一项服务。身份验证后,最终用户可以使用其身份访问其他OpenStack服务。同样,其他OpenStack服务利用Keystone来确保用户是他们所说的人,并发现其他服务在部署中的位置用户和服务可以使用由Keystone管理的服务目录来查找其他服务。

服务目录是OpenStack部署中可用服务的集合。每个服务可以具有一个或多个端点,并且每个端点可以是以下三种类型之一:admin,internal或public。在生产环境中,出于安全原因,不同的终结点类型可能驻留在暴露给不同类型用户的单独网络上。

8.1 MySQL中创建库和权限

在数据库中创建Keystone用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'openstack' identified by 'tera123';

8.2 安装Keystone组件服务

部署openstack-keystone、http、http模块,配置Keystone。

[root@localhost  ~]# yum install openstack-keystone httpd mod_wsgi
[root@localhost  ~]# vi /etc/keystone/keystone.conf
[database]
connection=mysql+pymysql://keystone:tera123@192.168.4.145/keystone
[token]
provider=fernet

8.3 配置keystone库

导入keytone库SQL,初始化Fernet秘钥库存储,引导身份服务。

[root@localhost  ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[root@localhost ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@localhost~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
[root@localhost  ~]# keystone-manage bootstrap --bootstrap-password tera123\ 
--bootstrap-admin-url http://192.168.4.145:5000/v3/ \
--bootstrap-internal-url http://192.168.4.145:5000/v3/ \
--bootstrap-public-url http://192.168.4.145:5000/v3/ \
--bootstrap-region-id RegionOne

8.4 配置Apache HTTP服务器

[root@localhost  ~]# vi /etc/httpd/conf/httpd.conf
ServerName 192.168.4.145
[root@localhost  ~]# ln -s /usr/share/keystone/wsgi-keystone.conf  /etc/httpd/conf.d/

8.5 完成部署

System管理Keystone并且配置管理账户。

[root@localhost  ~]# systemctl enable httpd.service
[root@localhost  ~]# systemctl start httpd.service
[root@localhost  ~]# vi admin-openrc
export OS_USERNAME=admin
export OS_PASSWORD=tera123
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://192.168.4.145:5000/v3
export OS_IDENTITY_API_VERSION=3

8.6 创建Service项目

[root@localhost  ~]# openstack project create --domain default \
                    --description "Service Project" service
[root@localhost  ~]# openstack role create user

8.7 验证Keystone

[root@localhost  ~]# openstack user list
+----------------------------------------------------------------+--------------+
| ID                                  | Name  |
| 57341d3e37eb4dc997624f9502495e44 | admin  |
+-----------------------------------------------------------------+--------------+

9 Glance(控制节点)

Glance使用户可以发现、注册和检索虚拟机镜像。它提供了 REST API,使您可以查询虚拟机镜像元数据并检索实际镜像。您可以将通过Image服务提供的虚拟机存储在从简单文件系统到对象存储系统(如OpenStack Object Storage)的各种位置。Glance由以下部分组成:

  • glance-api:用于接收Glance发现、检索和存储的Image API调用
  • glance-registry:存储、处理和检索有关Glance的元数据。元数据包括大小和类型等项目

9.1 MySQL中创建库和权限

在数据库中创建Glance用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database glance;
MariaDB [(none)]>GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' identified by 'tera123';
MariaDB [(none)]>GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'openstack' identified by 'tera123';

9.2 创建用户、服务

创建Glance用户,并且给Glance授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt glance
[root@localhost  ~]# openstack role add --project service --user glance admin
[root@localhost  ~]# openstack service create --name glance \
 --description "OpenStack Image" image
[root@localhost  ~]# openstack endpoint create --region RegionOne image public \
                    http://192.168.4.145:9292
[root@localhost  ~]# openstack endpoint create --region RegionOne image internal \
                    http://192.168.4.145:9292
[root@localhost  ~]# openstack endpoint create --region RegionOne image admin \
                    http://192.168.4.145:9292


9.3 安装Glance组件服务

安装软件包,编辑Glance配置文件。

[root@localhost  ~]# yum install -y openstack-glance
[root@localhost  ~]# vi /etc/glance/glance-api.conf
[database]
connection = mysql+pymysql://glance:tera123@192.168.4.145/glance
[glance_store]
stores = file,http
default_store = file
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = 123456
[paste_deploy]
flavor = keystone
[root@loaclhost  ~]# vi /etc/glance/glance-registry.conf
[database]
connection = mysql+pymysql://glance:tera123@192.168.4.145/glance
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = 123456
[paste_deploy]
flavor = keystone

9.4 同步数据库

导入Glance库的SQL文件,启动Glance服务。

[root@localhost  ~]# su -s /bin/sh -c "glance-manage db_sync" glance
[root@localhost  ~]# systemctl start openstack-glance-api openstack-glance-registry
[root@localhost  ~]# systemctl enable openstack-glance-api openstack-glance-registry

9.5 验证Glance服务

上传镜像验证Glance服务可用性。

[root@localhost  ~]# wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
[root@localhost  ~]# openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public
[root@localhost  ~]# openstack image list
+------------------------------------------------------------------+----------------------------+------------+
| ID                                   | Name          | Status  |
+------------------------------------------------------------------+----------------------------+------------+
| 6a1ba286-5ef2-409f-af11-5135e21adb4d | cirros          | active  |
+------------------------------------------------------------------+----------------------------+-------------+

10 Nova(控制节点)

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

  • nova-api:接收并响应最终用户的compute调用。该服务支持OpenStack Compute API。它执行一些策略并启动大多数编排活动,例如运行实例
  • nova-api-metadata:接收来自实例的元数据请求
  • nova-compute:通过守护程序API创建和终止虚拟机实例的辅助程序守护程序
  • nova-placement-api:跟踪每个提供商的库存和使用情况
  • nova-scheduler:从队列中获取虚拟机实例请求,并通过计算确定它在哪台服务器主机上运行
  • nova-conductor:中介nova-compute服务与数据库之间的交互。消除了对数据库的直接访问
  • nova-consoleauth:为控制台代理提供的用户授权令牌
  • nova-novncproxy:提供用于通过VNC连接访问正在运行的实例的代理

10.1 MySQL中创建库和权限

在数据库中创建Nova用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database nova_api;
MariaDB [(none)]> create database nova;
MariaDB [(none)]> create database nova_cell0;
MariaDB [(none)]> create database placement;
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' identified by 'tera123'; 
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'openstack' identified by 'tera123';

10.2 创建Nova用户、服务

创建Nova用户,并且给Glance授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt nova
[root@localhost  ~]# openstack role add --project service --user nova admin
[root@localhost  ~]# openstack service create --name nova \
--description "OpenStack compute" compute
[root@localhost  ~]# openstack endpoint create --region RegionOne compute public \
                    http://192.168.4.145:8774/v2.1
[root@localhost  ~]# openstack endpoint create --region RegionOne compute internal \
                    http://192.168.4.145:8774/v2.1
[root@localhost  ~]# openstack endpoint create --region RegionOne compute admin \
                    http://192.168.4.145:8774/v2.1

10.3 创建Placement用户、服务

创建Placement用户,并给Placement授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt placement
[root@localhost  ~]# openstack role add --project service --user placement admin
[root@localhost  ~]# openstack service create --name placement \
 –description "Placement API" placement
[root@localhost  ~]# openstack endpoint create --region RegionOne placement public \
                    http://192.168.4.145:8778
[root@localhost  ~]# openstack endpoint create --region RegionOne placement internal \
                    http://192.168.4.145:8778
[root@localhost  ~]# openstack endpoint create --region RegionOne placement admin \
                    http://192.168.4.145:8778

10.4 安装Nova组件服务

安装Nova组件并且编辑配置文件。

[root@localhost  ~]# yum install openstack-nova-api openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy \
openstack-nova-scheduler openstack-nova-placement-api -y
[root@localhost  ~]# vi /etc/nova/nova.conf
[DEFAULT]
my_ip=192.168.4.145
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.4.145
[api]
auth_strategy=keystone
[api_database]
connection=mysql+pymysql://nova:tera123@192.168.4.145/nova_api
[database]
connection= mysql+pymysql://nova:tera123@192.168.4.145/nova
[glance]
api_servers= http://192.168.4.145:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url=http://192.168.4.145:5000/v3
memcached_servers= 192.168.4.145:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456
[placement]
region_name = RegionOne
user_domain_name = Default
auth_type=password
auth_url=http://192.168.4.145:5000/v3
project_name=service
project_domain_name=Default
username=placement
password=123456
[placement_database]
connection= mysql+pymysql://placement:tera123@192.168.4.145/placement
[scheduler]
discover_hosts_in_cells_interval= 300
[vnc]
enabled=true
server_listen=$my_ip
server_proxyclient_address=$my_ip

10.5 配置Placement API

通过将以下配置添加到来启用对Placement API的访问。 

[root@localhost  ~]# vi /etc/httpd/conf.d/00-nova-placement-api.conf
Listen 8778
<VirtualHost *:8778>
  <Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
 </Directory>
  WSGIProcessGroup nova-placement-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
  WSGIDaemonProcess nova-placement-api processes=3 threads=1 user=nova group=nova
  WSGIScriptAlias / /usr/bin/nova-placement-api
  <IfVersion >= 2.4>
    ErrorLogFormat "%M"
  </IfVersion>
  ErrorLog /var/log/nova/nova-placement-api.log
  #SSLEngine On
  #SSLCertificateFile ...
  #SSLCertificateKeyFile ...
</VirtualHost>
Alias /nova-placement-api /usr/bin/nova-placement-api
<Location /nova-placement-api>
  SetHandler wsgi-script
  Options +ExecCGI
  WSGIProcessGroup nova-placement-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
</Location>

10.6 同步数据库

导入nova-api、nova、cell0、placement库SQL。

[root@localhost  ~]# su -s /bin/sh -c "nova-manage api_db sync" nova
[root@localhost  ~]# su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
[root@localhost  ~]# su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova  
[root@localhost  ~]# su -s /bin/sh -c "nova-manage db sync" nova 

10.7 验证Nova服务 

验证nova cell0和cell1是否正确注册,并启动Nova服务。

[root@openstack ~]# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
|  Name |                 UUID                 |             Transport URL             |                Database Connection                 | Disabled |
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |                 none:/                | mysql+pymysql://nova:****@192.168.4.145/nova_cell0 |  False   |
| cell1 | 510ecc1a-4112-4832-b5a5-4f6d4581c545 | rabbit://openstack:****@192.168.4.145 |    mysql+pymysql://nova:****@192.168.4.145/nova    |  False   |
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
[root@localhost  ~]# systemctl enable openstack-nova-api.service   \
openstack-nova-consoleauth openstack-nova-scheduler.service \
                    openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@localhost  ~]# systemctl start openstack-nova-api.service \
  openstack-nova-consoleauth   openstack-nova-scheduler.service\
  openstack-nova-conductor.service openstack-nova-novncproxy.service

11 Nova(计算节点)

11.1 安装Nova组件服务

安装Nova组件并且编辑配置文件。

[root@localhost  ~]# yum install openstack-nova-compute -y
[root@localhost  ~]# vi /etc/nova/nova.conf
[DEFAULT]
my_ip=192.168.4.144
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.4.145
[api]
auth_strategy=keystone
[glance]
api_servers=http://192.168.4.145:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url=http://192.168.4.145:5000/v3
memcached_servers=192.168.4.145:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://192.168.4.145:5000/v3
username = placement
password = 123456
[vnc]
enabled=true
server_listen=0.0.0.0
server_proxyclient_address=$my_ip
novncproxy_base_url=http://192.168.4.145:6080/vnc_auto.html

11.2 检测是否支持虚拟化

如果不支持虚拟化,则要配置新的参数。

[root@localhost  ~]# egrep -c ‘(vmx|svm)’ /proc/cpuinfo
[root@localshot  ~]# vi /etc/nova/nova.conf
[libvirt]
virt_type = qemu

11.3 启动Nova服务

System管理Nova。

[root@localhost  ~]# systemctl enable libvirtd openstack-nova-compute
[root@localshot  ~]# systemctl start libvirtd openstack-nova-compute

11.4 发现计算节点(控制节点)

在控制节点确认计算节点。

[root@localhost  ~]# openstack compute service list --service nova-compute
[root@localshot  ~]# 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': 54e6c270-7390-4390-8702-02b72874c5a7
Checking host mapping for compute host 'compute': 39d80423-6001-4036-a546-5287c1e93ec5
Creating host mapping for compute host 'compute': 39d80423-6001-4036-a546-5287c1e93ec5
Found 1 unmapped computes in cell: 54e6c270-7390-4390-8702-02b72874c5a7

12 Neutron(控制节点)

OpenStack Networking(neutron)允许创建由其他OpenStack服务管理的接口设备并将其连接到网络。可以实施插件来容纳不同的网络设备和软件,从而为OpenStack体系结构和部署提供灵活性。它包括以下组件:

  • neutron-server:接收API服务器请求并将其路由到适合的OpenStack网络设备以采取措施
  • OpenStack Networking plug-ins and agents:OpenStack通用代理是L3,DHCP和插件代理

12.1 MySQL中创建库和权限

在数据库中创建Neutron用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database neutron;
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'openstack' identified by 'tera123'; 

12.2 创建Neutron用户、服务

创建Neutron用户,并且给Neutron授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt neutron
[root@localhost  ~]# openstack role add --project service --user neutron admin
[root@localhost  ~]# openstack service create --name neutron \
 –description "OpenStack Networking" network
[root@localhost  ~]# openstack endpoint create --region RegionOne network public \
                    http://192.168.4.145:9696
[root@localhost  ~]# openstack endpoint create --region RegionOne network internal \
                    http://192.168.4.145:9696
[root@localhost  ~]# openstack endpoint create --region RegionOne network admin \
                    http://192.168.4.145:9696

12.3 安装Neutron组件服务

安装软件包,编辑Neutron配置文件。

[root@localhost  ~]# yum install openstack-neutron openstack-neutron-ml2 \
                    openstack-neutron-openvswitch ebtables
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = true
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
transport_url = rabbit://openstack:tera123@192.168.4.145
[database]
connection = mysql+pymysql://neutron:tera123@192.168.4.145/neutron
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456
[nova]
auth_url = http://192.168.4.145:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = 123456

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
[ml2_type_flat]
flat_networks = provider
[ml2_type_vxlan]
vni_ranges = 1:1000
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_ipset = true
enable_security_group = true

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[agent]
tunnel_types = vxlan
l2_population = true
arp_responder = true
[ovs]
bridge_mappings = provider:br-provider
datapath_type = system
local_ip = 192.168.4.145
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

[root@localhost  ~]# vi /etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = openvswitch
external_network_bridge  =

[root@localshot  ~]# vi /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = openvswitch
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

[root@localshot  ~]# vi /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = 192.168.4.145
metadata_proxy_shared_secret = tera123

[root@localhost  ~]# vi /etc/nova/nova.conf
[neutron]
url=http://192.168.4.145:9696
auth_type=password
auth_url=http://192.168.4.145:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name=default
password=123456
region_name=RegionOne
service_metadata_proxy = true
metadata_proxy_shared_secret = tera123

12.4 网桥绑定物理网卡

添加br-provider网桥并且绑定物理网卡eno2。

[root@localhost  ~]# ovs-vsctl add-br br-provider
[root@localhost  ~]# ovs-vsctl add-port br-provider eno2

12.5 修改系统内核参数

修改内核参数确保Linux操作系统内核支持网桥过滤器。

[root@localhost  ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@localhost  ~]# modprobe br_netfilter
[root@localhost  ~]# sysctl -p

12.6 创建符号链接

网络符文初始化脚本需要plugin.ini指向ML2插件配置文件的符号链接。

[root@localhost  ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

12.7 同步数据库

导入Neutron库SQL。

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

12.8 启动Neutron服务、

System管理Neutron服务。

[root@localhost  ~]# systemctl restart openstack-nova-api
[root@localshot  ~]# systemctl start neutron-server neutron-openvswitch-agent \
neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent
[root@localshot  ~]# systemctl enable neutron-server neutron-openvswitch-agent \
neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent

13 Neutron(计算节点)

13.1 安装Neutron组件服务

安装Neutron服务,并编辑配置文件。

[root@localhost  ~]# yum -y install openstack-neutron-openvswitch ebtables ipset -y
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
state_path = /var/lib/neutron
auth_strategy = keystone
transport_url = rabbit://openstack:tera123@192.168.4.145
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456
[oslo_concurrency]
lock_path = $state_path/lock

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
local_ip  =  192.168.4.144
[agent]
tunnel_types  =  vxlan
l2_population  =  True
prevent_arp_spoofing = True
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver

[root@localhost  ~]# vi /etc/noca/nova.conf
[neutron]
url=http://192.168.4.145:9696
auth_type=password
auth_url=http://192.168.4.145:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name = default
password=123456
region_name=RegionOne

13.2 修改系统内核参数

修改内核参数确保Linux操作系统内核支持网桥过滤器。

[root@localhost  ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@localhost  ~]# modprobe br_netfilter
[root@localhost  ~]# sysctl -p

13.3 启动Neutron服务

启动Neutron服务。

[root@localhost  ~]# systemctl restart openstack-nova-compute
[root@localshot  ~]# systemctl start neutron-openvswitch-agent
[root@localshot  ~]# systemctl enable neutron-openvswitch-agent

13.4 验证Neutron服务(控制节点)

验证Neutron agent启动状态。

[root@localhost  ~]# openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host       | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 2df818b0-e911-4e5a-8c53-1ae85e387caa | Open vSwitch agent | controller | None              | :-)   | UP    | neutron-openvswitch-agent |
| 8a1711ee-9772-4931-af61-eed89024ff04 | L3 agent           | controller | nova              | :-)   | UP    | neutron-l3-agent          |
| cff39707-e34b-4cc7-9be0-95bbe281a5b9 | Metadata agent     | scontroller | None              | :-)   | UP    | neutron-metadata-agent    |
| e4949796-9f35-40b4-aba0-781ee7ce9a31 | DHCP agent         | controller | nova              | :-)   | UP    | neutron-dhcp-agent        |
| efd5fa9a-9b0e-447f-8ddc-13755efdd999 | Open vSwitch agent | compute    | None              | :-)   | UP    | neutron-openvswitch-agent |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

14 Horizon(控制节点)

14.1 安装Horizon软件包

安装软件包并编辑配置文件。

[root@localhost  ~]# yum install -y openstack-dashboard
[root@localhost  ~]# vi /etc/openstack-dashboard/local_settings
OPENSTACK_HOST = "192.168.4.145"
ALLOWED_HOSTS = ['*', 'localhost']  
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '192.168.4.145:11211',
    },
}
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': True,
    'enable_quotas': True,
    'enable_ipv6': True,
    'enable_distributed_router': False,
    'enable_ha_router': False,
'enable_fip_topology_check': True,
}

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

14.2 启动Horizon

启动Horizon服务。

[root@localhost  ~]# systemctl restart httpd  memcached

14.3 验证Horizon

登录Web端URL:http://192.168.4.145/dashboard,验证Horizon组件。

登录Web端验证Horizon组件

15 参考文献

OpenStack官网:www.openstack.org

更多相关内容,请访问:A-Lab

OpenStack源码安装报错整理

1 MySQL

1.1 MySQL连接数

大多数OpenStack服务都使用MySQL数据库来存储信息,各组件直接的调用都需要修改MySQL的存储信息或者验证存储信息。MySQL连接数不够会杀死正在执行的SQL,导致各组件之间的调用失败。

解决这个问题需要调整MySQL配置文件中最max_connections参数和MySQL system参数。

[root@localhost  ~]# vi /etc/my.cnf
[mysqld]
max_connections=1024
[root@localhost  ~]# vi /usr/lib/systemd/system/mariadb.service
[serivce]
LimitNOFILE=65535
LimitNPROC=65535

1.2 MySQL Client连接失败

 ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/home/mysql/mysql.sock’

MySQL Client在登录的时候会默认去找/var/lib这个目录找mysqld.sock文件,如果Mysql启动失败或者修改了MySQL存储路径自然就找不到了。添加如下配置:

[root@localhost  ~]# vi /etc/my.cnf.d/client.cnf
[client-mariadb]
socket=/home/mysql/mysql.sock
[root@localhost  ~]# systemctl start mariadb

2 RabbitMQ

2.1 RabbitMQ用户名不匹配

OpenStack使用RabbitMQ来协调服务之间的操作和状态信息。消息队列服务通常在控制器节点运行。RabbitMQ需要关注的是用户名和密码问题。如果用户名和密码错误,各组件直接的调用都会失败,所有虚拟机无法访问。这时候需要修改RabbitMQ用来提供服务的用户名和密码:

[root@localhost  ~]# rabbitmqctl list_users
[root@localhost  ~]# rabbitmqctl change_password username ‘newpasswd’

2.2 RabbitMQ端口不通

ERROR oslo.messaging._drivers.impl_rabbit [-] [94fc1201-373b-451f-a9e2-46fc81b5de20] AMQP server on controller:5672 is unreachable: [Errno 111] ECONNREFUSED. Trying again in 24 seconds.: error: [Errno 111] ECONNREFUSED

RabbitMQ 5672端口不可用。可能出于两种情况:一是RabbitMQ启动失败,状态错误。查看RbbitMQ状态。二是5672端口被墙,关闭firewalld防火墙并且查看iptables规则。

[root@localhost  ~]# systemctl  status  rabbitmq-server
[root@localhost  ~]# systemctl  stop firewadll
[root@localhost  ~]# iptables -S
[root@localhost  ~]# iptables -F

3 Memcached

Memcached的作用是缓存身份服务身份验证机制的令牌。在正常运行中Memached一般不会出现问题。需要注意的一点是要确保端口不被墙。

4 Etcd

4.1 Etcd集群状态

cluster may be unhealthy: failed to list members

Error: client: etcd cluster is unavailable or misconfigured; error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused ;

error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused

error #0: dial tcp 127.0.0.1:2379: getsockopt: connection refused

error #1: dial tcp 127.0.0.1:4001: getsockopt: connection refused

OpenStack官网配置错,因为在Etcd的配置文件中的ETCD_LISTEN_CLIENT_URLS参数中,只写入了http://ip:2379,没有写入http://127.0.0.1:2379,添加后集群正常。

[root@localhost  ~]# vi /etc/etcd/etcd.conf
ETCD_DATA_DIR="/home/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.4.145:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.4.145:2379,http://127.0.0.1:2379"
ETCD_NAME="controller"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.4.145:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.4.145:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.4.145:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

5 Libvirtd

5.1 Libvirtd用户与用户组

KVM cannot access storage file (as uid:107,gid:107)permission denied

这一系列没有权限而导致的创建虚机失败需要调整libvirt的默认权限。

[root@localhost  ~]# vi /etc/libvirt/qemu.conf
user=root
group=root

5.2 Libvirtd用户与用户组

Libvirtd Could not reopen file:Permission denied

dynamic_ownership = 1这个参数意思是Libvirtd是否有权限动态修改文件所有权,默认为1。在一般情况下user和group设置为root是拥有所有文件的所有权。但是,因为这个参数的存在导致创建虚拟机报错。当注释后,创建虚拟机正常,可能是因为版本问题而导致的bug。

[root@localhost  ~]# vi /etc/libvirt/qemu.conf
user=root
group=root
#dynamic_ownership = 1

6 Keystone

6.1 同步数据库问题

OperationalError) no such table: project u’INSERT INTO project (id, name, domain_id, des

cription, enabled, extra) VALUES (?, ?, ?, ?, ?, ?)’ (’70c0487ba99743719d6721a34560fca2′, u’admin’, ‘default’, u’Admin Tenant’, 1, ‘{}’)

这个问题是因为Kyestone中表不存在,也就是说同步Keystone数据库失败导致,需要再次同步数据库。如果再次失败需要检查配置文件数据库连接配置是否有错误。

[root@localhost  ~]# mysql -uroo -p
MariaDB [ (none) ] use keystone;
MariaDB [ (none) ] show tables;
Empty set (0.00 sec)
[root@localhost  ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

6.2 OpenStackcliet错误码

下面是在创建用户或者service等服务时可能出现的错误码和解决方式。

401 #验证失败,keystone相关用户账户密码设置错误,时间不同步,或者输入的项目名称不对。

403 #可能未初始化OS_token变量,需要使用source命令使其生效,也可能是配置的配置文件未生效,需要重启相关服务。

409 #keystone创建用户,用户已存在。

500 #服务器内部错误,服务配置有问题,看日志,检查配置。

503 #keystone相关账户密码设置有问题,请将相关的账户删除,重新创建即可。

7 Nova

7.1 MySQL连接丢失

ERROR oslo_db.sqlalchemy.engines [-] Database connection was found disconnected; reconnecting: DBConnectionError: (pymysql.err.OperationalError) (2013, ‘Lost connection to MySQL server during query’) [SQL: u’SELECT 1′] (Background on this error at: http://sqlalche.me/e/e3q8)

字面意思是在查询的过程中丢失MySQL连接,即某个MySQL长连接很久没有新的请求发起,达到了server端的timeout,被server强行关闭。解决这个问题需要在MySQL配置文件中修改wait_timeout参数。

[root@localhost  ~]# vi /etc/my.cnf
[mysqld]
wait_timeout=28800

7.2 新增节点报错

ERROR nova.scheduler.client.report [req-fb678c94-091f-4dd3-bd44-49068015a07e – – – – -] [req-a7dd9b65-4ef2-4822-8110-f4a311839683] Failed to create resource provider record in placement API for UUID 73542ad1-f32b-4ba8-a62c-98ec704234c3. Got 409: {“errors”: [{“status”: 409, “request_id”: “req-a7dd9b65-4ef2-4822-8110-f4a311839683”, “detail”: “There was a conflict when trying to complete your request.\n\n Conflicting resource provider name: compute already exists.  “, “title”: “Conflict”}]}.

一台计算机点故障导致不能继续工作,将其移出集群,节点恢复后再重新加入发现报错。这主要原因是因为数据库中数据冲突导致。更新nova库、nova_api库中对应resource_providers表中的UUID即可。

[root@localhost  ~]# mysql -uroot -p
MariaDB [nova_api]> update resource_providers set uuid='4d9ed4b4-f3a2-4e5d-9d8e-2f657a844a04' where name='compute' and uuid='e131e7c4-f7db-4889-8c34-e750e7b129da';

7.3 Nova-vnc报错

INFO nova.console.websocketproxy [req-a9ef9047-7b5b-4251-b2c3-3de8fa2db7d1 – – – – -] handler exception: [Errno 113] EHOSTUNREACH

在OpenStack上创建虚机成功,登录控制台时显示vnc报错1006,查看Nova日志,确定是因为计算节点防火墙没有关闭或者iptables没有过滤vnc端口。

[root@localhost  ~]# systemct stop firewalld
[root@localhost  ~]# iptables -I INPUT -p tcp --ports 5900:6100  -j ACCEPT

8 Glance

8.1 权限问题

Glance报错基本都是因为权限问题而导致的。如果修改了Glance存储路径,需要给修改后的路径glance:glance权限。

9       Neutron

9.1       虚拟机不通外网

虚拟机不通外网主要原因有很多,首先网络类型是否误设置为Local:Local型网络只适合虚拟机与虚拟机之间互通,网络所在的网桥不会连接服务器的物理网卡,所以Local型网络的虚拟机是与外网不通的。

  • 虚拟机是否启动,如果它没有运行,可以通过查看Nova日志查看问题。
[root@localhost  ~]# openstack servier list
[root@localhost  ~]# tail -f /var/log/nova/nova-compute
  • 安全组问题,在默认安全组下可能不允许一些协议通过,所以需要配置安全组。
[root@localhost  ~]# openstack security group show default
  • 查看Neutron各agent状态是否正确,如果down,查看日志解决。
[root@localhost  ~]# openstack network agent list

更多相关内容,请访问:A-Lab

OpenStack源码安装部署方案

1 OpenStack简介

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。

2 OpenStack架构图

整个OpenStack是由控制节点,计算节点,网络节点,存储节点四大部分组成。控制节点负责对其余节点的控制,包含虚拟机建立,迁移,网络分配,存储分配等等。计算节点负责虚拟机运行网络节点负责对外网络与内网络之间的通信存储节点负责对虚拟机的额外存储管理。其中各组件架构图如下:

OpenStack架构图

3 OpenStack必要组件

  • 认证管理服务,提供了Openstack其余所有组件的认证信息/令牌的管理、创建、修改等等,使用MySQL等数据库存储认证信息
  • 计算管理服务,是Openstack计算的弹性控制,提供虚拟机的创建、运行、迁移、快照等围绕虚拟机的服务,并提供API与控制节点对接,由控制节点下发任务,使用nova-api进行通信
  • 网络管理服务,提供了对网络节点的网络拓扑管理,负责管理私有网络与公有网络的通信,以及管理虚拟机网络之间通信/拓扑、管理虚拟机之上的防火墙等,同时提供Neutron在Horizon的管理界面
  • 镜像管理服务,用于管理虚拟机部署时所能提供的镜像,包含镜像的导入、格式以及制作相应的模板,是一套虚拟机镜像发现、注册、检索系统,所有计算实例都是从Glance镜像启动的
  • 控制台服务,是一个用以管理、控制Openstack服务的Web控制面板,它可以管理实例、镜像、创建密匙对,对实例添加卷、操作Swift容器等,用户还可以在控制面板中使用终端(console)或VNC直接访问实例

4 OpenStack基础服务

  • OpenStack使用SQL数据库来存储信息。该数据库通常在控制器节点上运行
  • OpenStack使用消息队列来协调服务之间的操作和状态信息。消息队列服务通常在控制器节点上运行
  • 服务的身份服务、身份验证机制使用Memcached来缓存令牌。Memcached服务通常在控制器节点上运行
  • OpenStack服务使用Etcd(分布式可靠的键值存储)进行分布式键锁定,存储配置,跟踪服务活动性和其他情况

5 硬件配置

主机系统网卡1:eno1网卡2:eno2
openstackCentos7.6192.168.4.145192.168.5.145
computeCentos7.6192.168.4.144192.168.5.144

服务器具体配置要求如下:

  • 2个千兆网口
  • 至少8G内存
  • 磁盘至少40G
  • 计算节点的BISO中开启CPU嵌套虚拟化(INTEL叫VT-x,AMD的叫AMD-V)

6 系统优化

主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。

6.1 关闭SELinux(控制节点、计算节点)

SELinux不关闭的情况下无法实现,会限制ssh免密码登录。

[root@localhost  ~]#setenforce 0
[root@localhost  ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

6.2 关闭防火墙(控制节点、计算节点)

防止安装时出现各个组件的端口不能访问的问题。

[root@localhost  ~]#systemctl stop firewalld && systemctl disable firewalld        

6.3 时间同步(控制节点、计算节点)

同步时间可以有效解决因时间不同而造成的不同步。

[root@localshot  ~]# yum -y install ntp
[root@localhost  ~]# ntpdate ntp1.aliyun.com
[root@localhost  ~]# timedatectl set-timezone Asia/Shanghai

6.4 内核隔离(控制节点、计算节点)

OpenStack部分机器用于做控制节点,大部分机器都是需要运行虚拟化软件,虚拟化平台有大量VM,而宿主机本身的系统也会跑一些服务,那么这就势必会造成VM与宿主机系统之间资源的抢占。我们可以通过修改内核参数指定操作系统使用指定的几个核,解决抢占问题。

[root@localhost  ~]# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=”isolcpus=8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47”
[root@localhost  ~]# update-grub

6.5 关闭KVM内存共享(计算节点)

内存配置方面,关闭KVM内存共享,打开透明大页,提升主机CPU性能。

[root@localhost  ~]# echo 0>/sys/kernel/mm/ksm/pages_shared
echo 0>/sys/kernel/mm/ksm/pages_sharing
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always>/sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

6.6 修改系统打开文件最大数量(计算节点、控制节点)

放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。

[root@localhost  ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

6.7 降低Swap分区使用率(控制节点、计算节点)

现在服务器的内存一般是上百GB,所以我们可以把这个参数值设置的低一些(如10-30之间),让操作系统尽可能的使用物理内存,降低系统对swap的使用,从而提高宿主机系统和虚拟机的性能。

[root@localhost  ~]# echo 'vm.swappiness=10' >>/etc/sysctl.conf

7 基础服务部署

7.1 安装OpenStack国内yum源(控制节点、计算节点)

安装阿里的OpenStack yum源可以加快各组件的下载速度。

[root@localhost  ~]# cat << EOF >> /etc/yum.repos.d/openstack.repo
[openstack-rocky]
name=openstack-rocky
baseurl=https://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-rocky/
enabled=1
gpgcheck=0
[qume-kvm]
name=qemu-kvm
baseurl= https://mirrors.aliyun.com/centos/7/virt/x86_64/kvm-common/
enabled=1
gpgcheck=0
EOF

7.2 部署OpenStackClient(控制节点)

[root@localhost  ~]# yum upgrade -y
[root@localhost  ~]# yum install -y python-openstackclient openstack-selinux

7.3 部署MySQL(控制节点)

部署MySQL并且通过修改配置文件更改存储路径。

[root@localhost  ~]# yum install -y mariadb mariadb-server python2-PyMySQL
[root@localhost  ~]# vi /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address=192.168.4.145
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
[root@localhost  ~]# vi /etc/my.cnf
[mysqld]
query_cache_size = 0
query_cache_type = OFF
max_connections = 4096

7.4 启动MySQL(控制节点)

修改MySQL用户密码,并且system管理MySQL。

[root@localhost  ~]# systemctl enable mariadb
[root@localhost  ~]# systemctl start mariadb
[root@localhost  ~]# mysql -uroot 
MariaDB [(none)]> update mysql.user set password=password('tera123') where user = 'root';
MariaDB [(none)]> flush privileges;

7.5 部署RabbitMq(控制节点)

部署RabbitMq来协调服务之间的操作和状态信息,并且修改RabbitMq存储路径。

[root@localhost  ~]# yum -y install rabbitmq-server
[root@localhost  ~]# vi /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/var/lib/rabbitmq/mnesia
RABBITMQ_LOG_BASE=/var/lib/rabbitmq/log
[root@localhost  ~]# mkdir -p /var/lib/rabbitmq/mnesia
[root@localhost  ~]# mkdir -p /var/lib/rabbitmq/log
[root@localhost  ~]# chmod -R 755 /var/lib/rabbitmq
[root@localhost  ~]# systemctl enable rabbitmq-server.service
[root@localhost  ~]# systemctl start rabbitmq-server.service

7.6 配置RabbitMq用户 (控制节点)

添加OpenStack用户并且配置用户权限

[root@localhost  ~]# rabbitmqctl add_user openstack tera123
Creating user “openstack” …
[root@localhost  ~]# rabbitmqctl set_permissions openstack “.*” “.*” “.*”
Setting permissions for user “openstack” in vhost “/”…

7.7 部署Memcached(控制节点)

部署Memcached,并修改配置文件。

[root@localhost  ~]# yum -y install memcached
[root@localhost  ~]# vi /etc/sysconfig/memcached
OPTIONS=”-l 127.0.0.1,::1,192.168.4.145”
[root@localhost  ~]# systemctl enable memcached
[root@localhost  ~]# systemctl start memcached

7.8 部署Etcd(控制节点)

部署Etcd,修改配置文件,并且使用system管理。

[root@localhost  ~]# yum -y install etcd
[root@localhost  ~]# vi /etc/etcd/etcd.conf
ETCD_LISTEN_PEER_URLS=http://192.168.4.145:2380
ETCD_LISTEN_CLIENT_URLS="http://192.168.4.145:2379,http://127.0.0.1:2379 "
ETCD_NAME="controller"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.4.145:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.4.145:2379"
ETCD_INITIAL_CLUSTER="controller=http://192.168.4.145:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new”
[root@localhost  ~]# systemctl enable etcd
[root@localhost  ~]# systemctl start etcd

8 Keystone(控制节点)

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

Keystone通常是用户与之交互的第一项服务。身份验证后,最终用户可以使用其身份访问其他OpenStack服务。同样,其他OpenStack服务利用Keystone来确保用户是他们所说的人,并发现其他服务在部署中的位置用户和服务可以使用由Keystone管理的服务目录来查找其他服务。

服务目录是OpenStack部署中可用服务的集合。每个服务可以具有一个或多个端点,并且每个端点可以是以下三种类型之一:admin,internal或public。在生产环境中,出于安全原因,不同的终结点类型可能驻留在暴露给不同类型用户的单独网络上。

8.1 MySQL中创建库和权限

在数据库中创建Keystone用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'openstack' identified by 'tera123';

8.2 安装Keystone组件服务

部署openstack-keystone、http、http模块,配置Keystone。

[root@localhost  ~]# yum install openstack-keystone httpd mod_wsgi
[root@localhost  ~]# vi /etc/keystone/keystone.conf
[database]
Connection=mysql+pymysql://keystone:tera123@192.168.4.145/keystone
[token]
Provider=fernet

8.3 配置keystone库

导入keytone库SQL,初始化Fernet秘钥库存储,引导身份服务。

[root@localhost  ~]# su -s /bin/sh -c “keystone-manage db_sync” keystone
[root@localhost ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@localhost  ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
[root@localhost  ~]# keystone-manage bootstrap --bootstrap-password tera123\ 
--bootstrap-admin-url http://192.168.4.145:5000/v3/ \
--bootstrap-internal-url http://192.168.4.145:5000/v3/ \
--bootstrap-public-url http://192.168.4.145:5000/v3/ \
--bootstrap-region-id RegionOne

8.4 配置Apache HTTP服务器

[root@localhost  ~]# vi /etc/httpd/conf/httpd.conf
ServerName 192.168.4.145
[root@localhost  ~]# ln -s /usr/share/keystone/wsgi-keystone.conf  /etc/httpd/conf.d/

8.5 完成部署

System管理Keystone并且配置管理账户。

[root@localhost  ~]# systemctl enable httpd.service
[root@localhost  ~]# systemctl start httpd.service
[root@localhost  ~]# vi admin-openrc
export OS_USERNAME=admin
export OS_PASSWORD=tera123
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://192.168.4.145:5000/v3
export OS_IDENTITY_API_VERSION=3

8.6 创建Service项目

[root@localhost  ~]# openstack project create --domain default \
                    --description “Service Project” service

8.7 验证Keystone

[root@localhost  ~]# openstack user list
+----------------------------------------------------------------+--------------+
| ID                                  | Name  |
| 57341d3e37eb4dc997624f9502495e44 | admin  |
+-----------------------------------------------------------------+--------------+

9 Glance(控制节点)

Glance使用户可以发现、注册和检索虚拟机镜像。它提供了 REST API,使您可以查询虚拟机镜像元数据并检索实际镜像。您可以将通过Image服务提供的虚拟机存储在从简单文件系统到对象存储系统(如OpenStack Object Storage)的各种位置。Glance由以下部分组成:

  • glance-api:用于接收Glance发现、检索和存储的Image API调用
  • glance-registry:存储、处理和检索有关Glance的元数据。元数据包括大小和类型等项目

9.1 MySQL中创建库和权限

在数据库中创建Glance用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database glance;
MariaDB [(none)]>GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' identified by 'tera123';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' identified by 'tera123';
MariaDB [(none)]>GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'openstack' identified by 'tera123';

9.2 创建用户、服务

创建Glance用户,并且给Glance授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt glance
[root@localhost  ~]# openstack role add --project service --user glance admin
[root@localhost  ~]# openstack service create --name glance \
 --description “OpenStack Image” image
[root@localhost  ~]# openstack endpoint create --region RegionOne image public \
                    http://192.168.4.145:9292
[root@localhost  ~]# openstack endpoint create --region RegionOne image internal \
                    http://192.168.4.145:9292
[root@localhost  ~]# openstack endpoint create --region RegionOne image admin \
                    http://192.168.4.145:9292

9.3 安装Glance组件服务

安装软件包,编辑Glance配置文件。

[root@localhost  ~]# yum install -y openstack-glance
[root@localhost  ~]# vi /etc/glance/glance-api.conf
[database]
connection = mysql+pymysql://glance:tera123@192.168.4.145/glance
[glance_store]
stores = file,http
default_store = file
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = 123456                              #创建Glance用户时填入的密码
[paste_deploy]
flavor = keystone
[root@loaclhost  ~]# vi /etc/glance/glance-registry.conf
[database]
connection = mysql+pymysql://glance:tera123@192.168.4.145/glance
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = 123456
[paste_deploy]
flavor = keystone

9.4 同步数据库

导入Glance库的SQL文件,启动Glance服务。

[root@localhost  ~]# su -s /bin/sh -c “glance-manage db_sync” glance
[root@localhost  ~]# systemctl start openstack-glance-api openstack-glance-registry
[root@localhost  ~]# systemctl enable openstack-glance-api openstack-glance-registry

9.5 验证Glance服务

上传镜像验证Glance服务可用性。

[root@localhost  ~]# wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
[root@localhost  ~]# openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public
[root@localhost  ~]# openstack image list
+------------------------------------------------------------------+----------------------------+------------+
| ID                                   | Name          | Status  |
+------------------------------------------------------------------+----------------------------+------------+
| 6a1ba286-5ef2-409f-af11-5135e21adb4d | cirros          | active  |
+------------------------------------------------------------------+----------------------------+-------------+

10 Nova(控制节点)

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

  • nova-api:接收并响应最终用户的compute调用。该服务支持OpenStack Compute API。它执行一些策略并启动大多数编排活动,例如运行实例
  • nova-api-metadata:接收来自实例的元数据请求
  • nova-compute:通过守护程序API创建和终止虚拟机实例的辅助程序守护程序
  • nova-placement-api:跟踪每个提供商的库存和使用情况
  • nova-scheduler:从队列中获取虚拟机实例请求,并通过计算确定它在哪台服务器主机上运行
  • nova-conductor:中介nova-compute服务与数据库之间的交互。消除了对数据库的直接访问
  • nova-consoleauth:为控制台代理提供的用户授权令牌
  • nova-novncproxy:提供用于通过VNC连接访问正在运行的实例的代理

10.1 MySQL中创建库和权限

在数据库中创建Glance用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database nova_api;
MariaDB [(none)]> create database nova;
MariaDB [(none)]> create database nova_cell0;
MariaDB [(none)]> create database placement;
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'openstack' identified by 'tera123';

MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'openstack' identified by 'tera123';

10.2 创建Nova用户、服务

创建Nova用户,并且给Glance授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt nova
[root@localhost  ~]# openstack role add --project service --user nova admin
[root@localhost  ~]# openstack service create --name nova \
 --description “OpenStack compute” compute
[root@localhost  ~]# openstack endpoint create --region RegionOne compute public \
                    http://192.168.4.145:8774/v2.1
[root@localhost  ~]# openstack endpoint create --region RegionOne compute internal \
                    http://192.168.4.145:8774/v2.1
[root@localhost  ~]# openstack endpoint create --region RegionOne compute admin \
                    http://192.168.4.145:8774/v2.1

10.3 创建Placement用户、服务

创建Placement用户,并给Placement授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt placement
[root@localhost  ~]# openstack role add --project service --user placement admin
[root@localhost  ~]# openstack service create --name placement \
 --description “Placement API” placement
[root@localhost  ~]# openstack endpoint create --region RegionOne placement public \
                    http://192.168.4.145:8778
[root@localhost  ~]# openstack endpoint create --region RegionOne placement internal \
                    http://192.168.4.145:8778
[root@localhost  ~]# openstack endpoint create --region RegionOne placement admin \
                    http://192.168.4.145:8778

10.4 安装Nova组件服务

安装Nova组件并且编辑配置文件。

[root@localhost  ~]# yum install openstack-nova-api openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy \
openstack-nova-scheduler openstack-nova-placement-api -y
[root@localhost  ~]# vi /etc/nova/nova.conf
[DEFAULT]
my_ip=192.168.4.145
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.4.145
[api]
auth_strategy=keystone
[api_database]
connection=mysql+pymysql://nova:tera123@192.168.4.145/nova_api
[database]
connection= mysql+pymysql://nova:tera123@192.168.4.145/nova
[glance]
api_servers= http://192.168.4.145:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url=http://192.168.4.145:5000/v3
memcached_servers= 192.168.4.145:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456
[placement]
region_name = RegionOne
user_domain_name = Default
auth_type=password
auth_url=http://192.168.4.145:5000/v3
project_name=service
project_domain_name=Default
username=placement
password=123456
[placement_database]
connection= mysql+pymysql://placement:tera123@192.168.4.145/placement
[scheduler]
discover_hosts_in_cells_interval= 300                     #控制节点自动发现compute,可注释
[vnc]
enabled=true
server_listen=$my_ip
server_proxyclient_address=$my_ip

10.5 配置Placement API

通过将以下配置添加到来启用对Placement API的访问。

[root@localhost  ~]# vi /etc/httpd/conf.d/00-nova-placement-api.conf
Listen 8778
<VirtualHost *:8778>
  <Directory /usr/bin>
   <IfVersion >= 2.4>
      Require all granted
   </IfVersion>
   <IfVersion < 2.4>
      Order allow,deny
      Allow from all
   </IfVersion>
 </Directory>
  WSGIProcessGroup nova-placement-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
  WSGIDaemonProcess nova-placement-api processes=3 threads=1 user=nova group=nova
  WSGIScriptAlias / /usr/bin/nova-placement-api
  <IfVersion >= 2.4>
    ErrorLogFormat "%M"
  </IfVersion>
  ErrorLog /var/log/nova/nova-placement-api.log
  #SSLEngine On
  #SSLCertificateFile ...
  #SSLCertificateKeyFile ...
</VirtualHost>
Alias /nova-placement-api /usr/bin/nova-placement-api
<Location /nova-placement-api>
  SetHandler wsgi-script
  Options +ExecCGI
  WSGIProcessGroup nova-placement-api
  WSGIApplicationGroup %{GLOBAL}
  WSGIPassAuthorization On
</Location>

10.6 同步数据库

导入nova-api、nova、cell0、placement库SQL。

[root@localhost  ~]# su -s /bin/sh -c “nova-manage api_db sync” nova
[root@localhost  ~]# su -s /bin/sh -c “nova-manage cell_v2 map_cell0” nova
[root@localhost  ~]# su -s /bin/sh -c “nova-manage cell_v2 create_cell –name-cell1 --verbose” nova  
[root@localhost  ~]# su -s /bin/sh -c “nova-manage db sync” nova 

10.7 验证Nova服务

验证nova cell0和cell1是否正确注册,并启动Nova服务。

[root@openstack ~]# su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
|  Name |                 UUID                 |             Transport URL             |                Database Connection                 | Disabled |
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
| cell0 | 00000000-0000-0000-0000-000000000000 |                 none:/                | mysql+pymysql://nova:****@192.168.4.145/nova_cell0 |  False   |
| cell1 | 510ecc1a-4112-4832-b5a5-4f6d4581c545 | rabbit://openstack:****@192.168.4.145 |    mysql+pymysql://nova:****@192.168.4.145/nova    |  False   |
+-------+--------------------------------------+---------------------------------------+----------------------------------------------------+----------+
[root@localhost  ~]# systemctl enable openstack-nova-api.service   \
openstack-nova-consoleauth openstack-nova-scheduler.service \
                    openstack-nova-conductor.service openstack-nova-novncproxy.service
[root@localhost  ~]# systemctl start openstack-nova-api.service \
  openstack-nova-consoleauth   openstack-nova-scheduler.service\
  openstack-nova-conductor.service openstack-nova-novncproxy.service

11 Nova(计算节点)

11.1 安装Nova组件服务

安装Nova组件并且编辑配置文件。

[root@localhost  ~]# yum install openstack-nova-compute -y
[root@localhost  ~]# vi /etc/nova/nova.conf
[DEFAULT]
my_ip=192.168.4.144
use_neutron=true
firewall_driver=nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
transport_url=rabbit://openstack:tera123@192.168.4.145
[api]
auth_strategy=keystone
[glance]
api_servers=http://192.168.4.145:9292
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url=http://192.168.4.145:5000/v3
memcached_servers=192.168.4.145:11211
auth_type=password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = 123456
[placement]
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://192.168.4.145:5000/v3
username = placement
password = 123456
[vnc]
enabled=true
server_listen=0.0.0.0
server_proxyclient_address=$my_ip
novncproxy_base_url=http://192.168.4.145:6080/vnc_auto.html

11.2 检测是否支持虚拟化

如果不支持虚拟化,则要配置新的参数。

[root@localhost  ~]# egrep -c ‘(vmx|svm)’ /proc/cpuinfo
[root@localshot  ~]# vi /etc/nova/nova.conf
[libvirt]
virt_type = qemu-

11.3 启动Nova服务

System管理Nova。

[root@localhost  ~]# systemctl enable libvirtd openstack-nova-compute
[root@localshot  ~]# systemctl start libvirtd openstack-nova-compute

11.4 发现计算节点(控制节点)

在控制节点确认计算节点。

[root@localhost  ~]# openstack compute service list --service nova-compute
[root@localshot  ~]# 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': 54e6c270-7390-4390-8702-02b72874c5a7
Checking host mapping for compute host 'compute': 39d80423-6001-4036-a546-5287c1e93ec5
Creating host mapping for compute host 'compute': 39d80423-6001-4036-a546-5287c1e93ec5
Found 1 unmapped computes in cell: 54e6c270-7390-4390-8702-02b72874c5a7

12 Neutron(控制节点)

OpenStack Networking(neutron)允许创建由其他OpenStack服务管理的接口设备并将其连接到网络。可以实施插件来容纳不同的网络设备和软件,从而为OpenStack体系结构和部署提供灵活性。它包括以下组件:

  • neutron-server:接收API服务器请求并将其路由到适合的OpenStack网络设备以采取措施
  • OpenStack Networking plug-ins and agents:OpenStack通用代理是L3,DHCP和插件代理

12.1 MySQL中创建库和权限

在数据库中创建Neutron用户,并且授予用户访问库的权限。

[root@localhost  ~]# mysql -uroot -p
MariaDB [(none)]> create database neutron;
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' identified by 'tera123';
MariaDB[(none)]>GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'openstack' identified by 'tera123'; 

12.2 创建Neutron用户、服务

创建Neutron用户,并且给Neutron授权Admin role,创建服务向Keystone暴露Endpoint。

[root@localhost  ~]# openstack user create --domain default --password-prompt neutron
[root@localhost  ~]# openstack role add --project service --user neutron admin
[root@localhost  ~]# openstack service create --name neutron \
 –description “OpenStack compute” network
[root@localhost  ~]# openstack endpoint create --region RegionOne network public \
                    http://192.168.4.145:9696
[root@localhost  ~]# openstack endpoint create --region RegionOne network internal \
                    http://192.168.4.145:9696
[root@localhost  ~]# openstack endpoint create --region RegionOne network admin \
                    http://192.168.4.145:9696

12.3 安装Neutron组件服务

安装软件包,编辑Neutron配置文件。

[root@localhost  ~]# yum install openstack-neutron openstack-neutron-ml2 \
                    openstack-neutron-linuxbridge ebtables
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
auth_strategy = keystone
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
transport_url = rabbit://openstack:tera123@192.168.4.145
[database]
connection = mysql+pymysql://neutron:tera123@192.168.4.145/neutron
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456
[nova]
auth_url = http://192.168.4.145:5000
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = 123456

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = linuxbridge,l2population
extension_drivers = port_security
[ml2_type_flat]
flat_networks = provider
[ml2_type_geneve]
vni_ranges = 1:1000
[securitygroup]
enable_ipset = true

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = provider:eno2
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = true
[vxlan]
local_ip = 192.168.5.145
l2_population = true

[root@localhost  ~]# vi /etc/neutron/l3_agent.ini
[DEFAULT]
interface_driver = linuxbridge

[root@localshot  ~]# vi /etc/neutron/dhcp_agent.ini
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true

[root@localshot  ~]# vi /etc/neutron/metadata_agent.ini
[DEFAULT]
nova_metadata_host = 192.168.4.145
metadata_proxy_shared_secret = tera123

[root@localhost  ~]# vi /etc/nova/nova.conf
[neutron]
url=http://192.168.4.145:9696
auth_type=password
auth_url=http://192.168.4.145:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name=default
password=123456
region_name=RegionOne
service_metadata_proxy = true
metadata_proxy_shared_secret = tera123

12.4 修改系统内核参数

修改内核参数确保Linux操作系统内核支持网桥过滤器。

[root@localhost  ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@localhost  ~]# modprobe br_netfilter
[root@localhost  ~]# sysctl -p

12.5 创建符号链接

网络符文初始化脚本需要plugin.ini指向ML2插件配置文件的符号链接。

[root@localhost  ~]# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

12.6 同步数据库

导入Neutron库SQL。

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

12.7 启动Neutron服务

System管理Neutron服务。

[root@localhost  ~]# systemctl restart openstack-nova-api
[root@localshot  ~]# systemctl start neutron-server neutron-linuxbridge-agent \
neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent
[root@localshot  ~]# systemctl enable neutron-server neutron-linuxbridge-agent \
neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent

13 Neutron(计算节点)

13.1 安装Neutron组件服务

安装Neutron服务,并编辑配置文件。

[root@localhost  ~]# yum -y install openstack-neutron-linuxbridge ebtables ipset -y
[root@localhost  ~]# vi /etc/neutron/neutron.conf
[DEFAULT]
auth_strategy = keystone
transport_url = rabbit://openstack:tera123@192.168.4.145
[keystone_authtoken]
www_authenticate_uri = http://192.168.4.145:5000
auth_url = http://192.168.4.145:5000
memcached_servers = 192.168.4.145:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = 123456
[oslo_concurrency]
lock_path = $state_path/lock

[root@localhost  ~]# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings =provider:eno2
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = true
[vxlan]
enable_vxlan = true
local_ip = 192.168.5.144
l2_population = true

[root@localhost  ~]# vi /etc/noca/nova.conf
[neutron]
url=http://192.168.4.145:9696
auth_type=password
auth_url=http://192.168.4.145:5000
project_name=service
project_domain_name=default
username=neutron
user_domain_name = default
password=123456
region_name=RegionOne

13.2 修改系统内核参数

修改内核参数确保Linux操作系统内核支持网桥过滤器。

[root@localhost  ~]# vi /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@localhost  ~]# modprobe br_netfilter
[root@localhost  ~]# sysctl -p

13.3 启动Neutron服务

启动Neutron服务。

[root@localhost  ~]# systemctl restart openstack-nova-compute
[root@localshot  ~]# systemctl start neutron-linuxbridge-agent
[root@localshot  ~]# systemctl enable neutron-linuxbridge-agent

13.4 验证Neutron服务(控制节点)

验证Neutron agent启动状态。

[root@localhost  ~]# openstack network agent list
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host       | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| 06323fbc-0b13-4c14-a05d-d414678177bf | Linux bridge agent | controller | None              | :-)   | UP    | neutron-linuxbridge-agent |
| 4bd1d3eb-d178-4ff5-8d3f-7307a4415209 | Linux bridge agent | compute    | None              | :-)   | UP    | neutron-linuxbridge-agent |
| 74ba6229-1449-40c7-a0de-53688fbb560a | Metadata agent     | controller | None              | :-)   | UP    | neutron-metadata-agent    |
| d43e223f-c23d-4e60-88b6-ffe12243853f | DHCP agent         | controller | nova              | :-)   | UP    | neutron-dhcp-agent        |
| da0e8763-8082-4a5e-8188-7161d7ad8a05 | L3 agent           | controller | nova              | :-)   | UP    | neutron-l3-agent          |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
————————————————

14 Horizon(控制节点)

14.1 安装Horizon软件包

安装软件包并编辑配置文件。

[root@localhost  ~]# vi /etc/openstack-dashboard/local_settings
OPENSTACK_HOST = “192.168.4.145”
ALLOWED_HOSTS = ['*', 'localhost']  
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '192.168.4.145:11211',
    },
}
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': True,
    'enable_quotas': True,
    'enable_ipv6': True,
    'enable_distributed_router': False,
    'enable_ha_router': False,
'enable_fip_topology_check': True,
}

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

14.2 启动Horizon

启动Horizon服务。

[root@localhost  ~]# systemctl restart httpd  memcached

14.3 验证Horizon

登录Web端URL:http://192.168.4.145/dashboard,验证Horizon组件。

登录Web端

15 参考文献

OpenStack官网:www.openstack.org

更多相关内容,请访问:A-Lab

基于CX-N产品的MC-LAG应用场景配置

1 目的

本文主要讲解企业级sonic交换机的 MC-LAG解决方案和配置。

2 型号和版本

以下产品可以实现本方案:
CX-N系列交换机
AsterNOS系统软件版本:
AsterNOSv3.1

3 MC-LAG介绍

MC-LAG(Multi Chassis Link Aggregation Group,跨设备链路聚合组)是一种实现跨设备链路聚合的机制,通过将一台设备与另外两台设备进行跨设备链路聚合,保留了普通链路聚合的优点,同时提供了设备级别的冗余。

MC-LAG提供了一种横向虚拟化技术,将两台物理设备虚拟成单台逻辑设备,这台虚拟出来的“单个设备”与其相连的上行或下行设备实现“一对一”链路聚合。如下图所示:

链路聚合

本文所介绍的设备MC-LAG工作模式为:控制面主备模式、数据面双活模式,即:

在控制面需要区分主设备和备设备,主链路和备用链路;

在数据面采用双活方式,两台设备各自决定转发数据流。

4 MC-LAG基础配置说明

Asterfusion交换机运行企业级SONiC(AsterNOS)系统,能够灵活支持MC-LAG组网。

4.1 配置MC-LAG

mclag domain domain-id #创建MC-LAG域并进入视图,当前只支持创建一个域,范围1-4095。

session-timeout timeout #超时时间,单位秒,取值范围为3~3600,默认值为15秒;心跳检测报文的时间间隔应小于MC-LAG会话超时时间的1/3;会话超时时间应为心跳检测报文时间间隔的倍数。

Example:
sonic(config)# mclag domain 10
sonic(mclag-domain)# session-timeout 15

4.2 配置peer-link

vlan vlan-id #在全局视图下配置专用vlan,1-4095。

interface link-aggregation lag-id #创建聚合组,1-9999。

mode static #配置聚合模式为静态

commit #提交配置

switchport trunk vlan vlan-id #指定专用vlan并加入业务vlan

interface ethernet interface-name #进入接口视图

link-aggregation-group lag-id [port-priority port-priority] #加入相应lag,并可指定优先级0-65535,默认255。

startup-delay delay #配置接口延迟,默认为150秒,建议peer-link所在的物理接口上配置延迟值为145秒。

mclag domain domain-id #进入mclag域,id为之前配置的值。

peer-link link-aggregation name #指定peer-link。

commit #提交配置

Example:
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# mode static
sonic(config-lagif-10)# commit
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# interface ethernet 0/10
sonic(config-if-0/10)# link-aggregation-group 10
sonic(config-if-0/10)# startup-delay 100
sonic(config-if-0/10)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-link link-aggregation 10
sonic(mclag-domain)# commit

4.3 配置心跳检测链路

说明:心跳检测链路用来转发MC-LAG的控制报文,可以与peer-link共用,也可以使用单独的物理链路;

当开启双主检测功能时,要求心跳检测链路与peer-link共用,否则将导致功能失效。

使用单独的物理链路配置心跳检测

interface ethernet interface-name #进入接口视图

ip address A.B.C.D/M #配置接口ip地址

mclag domain domain-id #进入mclag域视图

peer-address A.B.C.D #配置心跳检测链路对端ip地址

local-address A.B.C.D #配置线条检测链路本端ip地址

vrf vrf-name #指定心跳检测链路VRF,默认default

heartbeat-interval interval #配置MC-LAG 心跳检测报文发送间隔时间,单位为秒,取值1~60,默认为1秒;

commit #提交配置

Example:
sonic(config)# interface ethernet 0/11
sonic(config-if-0/11)# ip address 10.0.0.11/24
sonic(config-if-0/11)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-address 10.0.0.12
sonic(mclag-domain)# local-address 10.0.0.11
sonic(mclag-domain)# heartbeat-interval 1
sonic(mclag-domain)# commit

使用peer-link配置心跳检测链路

interface vlan vlan-id #进入peer-link专用vlanif配置视图

ip address A.B.C.D/M #配置vlanif的ip地址

mclag domain domain-id #进入mclag域视图

peer-address A.B.C.D #配置心跳检测链路对端ip地址

local-address A.B.C.D #配置线条检测链路本端ip地址

vrf vrf-name #指定心跳检测链路VRF,默认default

commit #提交配置

Example:
sonic(config)# vlan 10
sonic(config-vlan-10)# ip address 10.0.0.11/24
sonic(config- vlan-10)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-address 10.0.0.12
sonic(mclag-domain)# local-address 10.0.0.11
sonic(mclag-domain)# commit

4.4 配置MC-LAG成员接口

说明:建议使用低速接口作为MC-LAG成员接口,为提高系统可靠性,建议跨设备聚合组使用动态聚合,并开启LACP短超时。要求部署MC-LAG的两台设备成员物理接口的port ID相同,否则无法正常聚合。

vlan vlan-id #创建业务VLAN,1-4094。

interface link-aggregation lag-id #进入LAG接口配置视图并创建下行聚合组,1-9999。

lacp fast-rate#开启lacp短超时

commit #提交配置

switchport trunk vlan vlan-id #加入业务vlan

mclag domain domain-id #进入mclag域视图

member lag lag-id #添加mclag成员接口

Example:
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# lacp fast-rate
sonic(config-lagif-10)# commit
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# member lag 10

4.5 配置Monitor Link组

说明:建议在部署MC-LAG的主备设备上配置Monitor Link组,上行口配置为uplink,下行口配置为downlink,开启该功能后,上行口状态down后,下行口会联动down,保证拓扑中出现故障时能够快速收敛。

monitor-link-group group-name [delay-time]#创建monitor-link组,delay-time为可选参数,表示上行口up后下行口up的延迟时间,单位秒,不配置时默认值为0。

interface ethernet interface-name #进入接口视图

monitor-link group-name uplink #配置上行口为uplink

interface link-aggregation lag-id #进入下行聚合组接口配置视图

monitor-link group-name downlink #配置MC-LAG成员接口为downlink

Example:
sonic(config)# monitor-link-group monitor1
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# monitor-link monitor1 uplink
sonic(config-if-0/48)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# monitor-link monitor1 downlink

5 MC-LAG典型配置案例

5.1 要求

用户的一台服务器server1运行着重要应用,希望接入的网络稳定可靠,现在用4台Asterfusion sonic交换机搭建网络,将两台leaf设备组成mc-lag与server1连接,测试其中一条链路断开的情况下server1是否会断网,测试过程中用server1与server2进行数据传输测试。

5.2 拓扑图

拓扑图

5.3 测试环境

硬件

名称型号硬件指标数量
spine交换机CX532P-N参见彩页1
Leaf交换机CX308P-48Y-N-V2参见彩页3
服务器X86普通服务器2
光模块多模100G QSFP286
光纤多模100G适用3
光模块多模10G SFP+6
光纤多模10G适用3

软件

软件版本
交换机操作系统AsterNOSv3.1
服务器系统CentOS Linux 7.8.2003
服务器内核 3.10.0-1127.18.2.el7
iperf33.9

管理IP

设备名称接口IP地址
Spine管理口10.230.1.31
Leaf1管理口10.230.1.21
Leaf2管理口10.230.1.22
Leaf3管理口10.230.1.23
Server-1管理口10.230.1.11
Server-2管理口10.230.1.12

设备通信IP

设备名称接口IP地址
SpineEthernet 0/0 10.0.10.201
SpineEthernet 0/410.0.11.201
SpineEthernet 0/810.0.12.201
SpineLoopback 0 172.16.0.1
Leaf1Ethernet 0/0 (Mc-Lag)100.0.10.201
Leaf1Ethernet 0/4(peer-link)11.0.0.11
Leaf1Ethernet 0/4810.0.10.1
Leaf1Loopback 0 172.16.0.2
Leaf2Ethernet 0/0 (Mc-Lag)100.0.10.201
Leaf2Ethernet 0/4(peer-link)11.0.0.12
Leaf2Ethernet 0/4810.0.11.1
Leaf2Loopback 0 172.16.0.3
Leaf3Ethernet 0/0 100.0.20.201
Leaf3Ethernet 0/4810.0.12.1
Leaf3Loopback 0 172.16.0.4
Server-1Bond0100.0.10.200
Server-2Eth0100.0.20.200

5.4 测试前的准备工作

确保各设备按照拓扑图正确连接,确保iperf3测试软件正确安装。

5.5 配置步骤

第 1 步

配置 server1 的 bond0 接口的 IP 地址和网关。

[admin@Server1~]# sudo vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
BROADCAST=100.0.10.255
IPADDR=100.0.10.200
NETMASK=255.255.255.0
NETWORK=100.0.10.0
ONBOOT=yes
USERCTL=no
GATEWAY=100.0.10.201
BONDING_OPTS=”miimon=100 mode=4 lacp_rate=fast xmit_hash_policy=layer2+3 fail_over_mac=1″
MASTER=yes
[admin@Server1~]# sudo vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=”eth0″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes
HWADDR=”b8:59:9f:42:36:68″
[admin@Server1~]# sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=”eth1″
BOOTPROTO=none
ONBOOT=”yes”
MASTER=bond0
SLAVE=yes
HWADDR=”b8:59:9f:42:36:69″
[admin@Server1~]# sudo systemctl restart network

第 2 步

配置 server2 的 eth0 接口的 IP 地址和网关。

[admin@Server1~]# sudo ifconfig eth0 100.0.20.200/24 up
[admin@Server1~]# sudo route add default gw 100.0.20.201

第 3 步

配置spine switch IP地址。

sonic# configure terminal
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# ip address 10.0.10.201/24
sonic(config-if-0/0)# interface ethernet 0/4
sonic(config-if-0/4)# ip address 10.0.11.201/24
sonic(config-if-0/4)# interface ethernet 0/8
sonic(config-if-0/8)# ip address 10.0.12.201/24
sonic(config-if-0/8)# exit
sonic(config)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.1/32

第 4 步

配置三台leaf设备的IP 地址和 MC-LAG。

Leaf1 配置

sonic# configure terminal
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# ip address 10.0.10.1/24
sonic(config-if-0/48)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.2/32
sonic(config-loif-0)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# speed 10000
sonic(config-if-0/0)# link-aggregation-group 10
sonic(config-if-0/0)# exit
sonic(config)# interface ethernet 0/4
sonic(config-if-0/4)# speed 10000
sonic(config-if-0/4)# switchport trunk vlan 10
sonic(config-if-0/4)# switchport trunk vlan 30
sonic(config-if-0/4)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# ip address 100.0.10.201/24
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# ip address 11.0.0.11/24
sonic(config-vlan-10)# exit
sonic(config)# monitor-link-group monitor1
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# monitor-link monitor1 uplink
sonic(config-if-0/48)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# monitor-link monitor1 downlink
sonic(config-if-0/0)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-link ethernet 0/4
sonic(mclag-domain)# local-address 11.0.0.11
sonic(mclag-domain)# peer-address 11.0.0.12
sonic(mclag-domain)# member lag 10
sonic(mclag-domain)# commit
sonic(mclag-domain)# interface vlan 10
sonic(config-vlan-10)# mac-address 00:11:22:33:44:55
sonic(config-vlan-10)# exit
sonic(config)# write

Leaf2 配置

sonic# configure terminal
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# ip address 10.0.11.1/24
sonic(config-if-0/48)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.3/32
sonic(config-loif-0)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# speed 10000
sonic(config-if-0/0)# link-aggregation-group 10
sonic(config-if-0/0)# exit
sonic(config)# interface ethernet 0/4
sonic(config-if-0/4)# speed 10000
sonic(config-if-0/4)# switchport trunk vlan 10
sonic(config-if-0/4)# switchport trunk vlan 30
sonic(config-if-0/4)# exit
sonic(config)# interface link-aggregation 10
sonic(config-lagif-10)# switchport trunk vlan 10
sonic(config-lagif-10)# exit
sonic(config)# vlan 10
sonic(config-vlan-10)# ip address 100.0.10.201/24
sonic(config-vlan-10)# exit
sonic(config)# vlan 30
sonic(config-vlan-30)# ip address 11.0.0.12/24
sonic(config-vlan-10)# exit
sonic(config)# monitor-link-group monitor1
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# monitor-link monitor1 uplink
sonic(config-if-0/48)# exit
sonic(config)# interface ethernet 0/0
sonic(config-if-0/0)# monitor-link monitor1 downlink
sonic(config-if-0/0)# exit
sonic(config)# mclag domain 10
sonic(mclag-domain)# peer-link ethernet 0/4
sonic(mclag-domain)# local-address 11.0.0.12
sonic(mclag-domain)# peer-address 11.0.0.11
sonic(mclag-domain)# member lag 10
sonic(mclag-domain)# commit
sonic(mclag-domain)# interface vlan 10
sonic(config-vlan-10)# mac-address 00:11:22:33:44:55
sonic(config-vlan-10)# exit
sonic(config)# write

Leaf3 配置

sonic# configure terminal
sonic(config)# interface ethernet 0/48
sonic(config-if-0/48)# ip address 10.0.12.1/24
sonic(config-if-0/48)# interface ethernet 0/0
sonic(config-if-0/0)# speed 10000
sonic(config-if-0/0)# ip address 100.0.20.201/24
sonic(config-if-0/0)# interface loopback 0
sonic(config-loif-0)# ip address 172.16.0.4/32
sonic(config-loif-0)# exit
sonic(config)# write

第 5 步

配置spine设备bgp。

sonic# configure terminal
sonic(config)# router bgp 65001
sonic(config-router)# bgp router-id 171.16.0.1
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.2 remote-as 65002
sonic(config-router)# neighbor 172.16.0.3 remote-as 65002
sonic(config-router)# neighbor 172.16.0.4 remote-as 65004
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.2 activate
sonic(config-router)# neighbor 172.16.0.3 activate
sonic(config-router)# neighbor 172.16.0.4 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

第 6 步

 配置三台leaf设备bgp。

Leaf1 配置

sonic(config)# router bgp 65002
sonic(config-router)# bgp router-id 171.16.0.2
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.1 remote-as 65001
sonic(config-router)# neighbor 172.16.0.3 remote-as 65002
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 172.16.0.2/32
sonic(config-router-af)# exit
sonic(config)# router bgp 65002
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.1 activate
sonic(config-router)# neighbor 172.16.0.3 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

Leaf2 配置

sonic(config)# router bgp 65002
sonic(config-router)# bgp router-id 171.16.0.3
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.1 remote-as 65001
sonic(config-router)# neighbor 172.16.0.2 remote-as 65002
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 172.16.0.3/32
sonic(config-router-af)# exit
sonic(config)# router bgp 65002
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.1 activate
sonic(config-router)# neighbor 172.16.0.2 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

Leaf3 配置

sonic(config)# router bgp 65004
sonic(config-router)# bgp router-id 171.16.0.4
sonic(config-router)# no bgp ebgp-requires-policy
sonic(config-router)# neighbor 172.16.0.1 remote-as 65001
sonic(config-router)# address-family ipv4 unicast
sonic(config-router-af)# network 172.16.0.4/32
sonic(config-router-af)# exit
sonic(config)# router bgp 65004
sonic(config-router)# address-family l2vpn evpn
sonic(config-router)# neighbor 172.16.0.1 activate
sonic(config-router)# advertise-all-vni
sonic(config)# write
sonic(config)# reload

第 7 步

用server1发送流量到server2,并查看spine上流量走向

[admin@Server2~]# iperf3 -s
[admin@Server1~]# iperf3 -c 100.0.20.200 -l 20k -b 100G -M 9000 -t 1000

查看Spine设备流量

查看Spine设备流量

第 8 步

将leaf1上行接口0/48 down,查看spine流量走向

查看spine流量走向

6 结论

本次测试中,mc-lag链路故障后服务器之间可以正常通信,mc-lag链路恢复后服务器之间仍然可以正常通信,说明通过两台asterfusion sonic switch组成的mc-lag网络可以满足用户对网络高稳定性及高可靠性的需求。

点击了解Asterfusion CX-N数据中心交换机

如有其它问题,请填写右侧需求表单联系我们

Asterfusion SONiC交换机的RoCE方案配置

1 目的

本文主要讲解企业级sonic交换机的RoCE方案及配置。

2 型号和版本

以下产品可以实现本方案:
CX-N系列交换机
AsterNOS系统软件版本:
AsterNOSv3.1

3 RoCE 原理和配置注意事项

3.1 RoCE介绍

在各种HPC高性能计算场景中,对网络的诉求基本上是高吞吐和低时延这两个重要特性,为了实现高吞吐和低时延,业界一般采用 RDMA(Remote Direct Memory Access,远程直接内存访问)替代 TCP 协议。但是RDMA 对于丢包非常敏感,一旦发生丢包重传,性能会急剧下降。因此要使得 RDMA 吞吐不受影响,丢包率必须保证在 1e-05(十万分之一)以下,最好为零丢包。

RoCE (RDMA over Converged Ethernet)网络通过PFC+ECN特性来保障网络传输过程不丢包。

3.2 RoCE 原理和配置注意事项

RoCE网络通过PFC+ECN方式保证网络无损。具体原理如下:

PFC+ECN原理

当serverA与serverB通信时,正常数据流向如绿色实线所示,从A经过交换机S到达B,然后再由B返回到A。

当报文发生拥塞时,需要先使ECN发挥作用,设置交换机的ECN缓存阈值区间为N~M,当缓存超过N时,S开始随机在报文中标记ECN位,当缓存超过M时,S开始在所有报文中标记ECN位。B收到带有ECN标记的报文后,开始向A发送CNP报文,通知A降低发送速率,直到找到最佳速率后,以该速率持续发送数据,从而达到不丢包的目的。

当报文发生拥塞时,PFC也会发挥作用,设置交换机的PFC缓存阈值为Q,当缓存超过Q时,交换机会立即向A持续发送PAUSE数据帧,A收到PAUSE帧后,会立即停止向S的该队列发送报文,这时数据流会中断。当A不再收到pause报文之后,将重新开始向S发送报文。

因此,为了降低数据中断对业务的影响,应尽量避免PFC的触发,使用ECN来保障数据传输,此时就需要交换机的缓存阈值设置Q应该大于M。确保ECN先于PFC触发。

4 Asterfusion Enterprise SONiC 交换机 RoCE 配置

Asterfusion交换机运行企业级SONiC(AsterNOS)系统,采用PFC+ECN的方式保障RoCE网络无损。

有两种配置方式:

4.1 一键自动配置RoCE参数

Example:
sonic# configure terminal
sonic(config)# qos roce lossless
sonic(config)# qos service-policy roce_lossless

它还提供所有与 RoCE 相关配置信息的一键查看功能。命令如下:

sonic# show qos roce

4.2 手动配置RoCE参数

当一键RoCE的配置参数与当前场景并不是很匹配时,也可以手动进行参数配置,以达到最佳效果,相关配置如下:

修改 DSCP 映射

configure termin

diffserv-map type ip-dscp roce_lossless_diffserv_map   #进入DSCP映射配置视图

ip-dscp value cos cos_value  #配置DSCP到COS的映射,value指定DSCP值,范围0-63;cos_value指定COS值,范围0-7

default {cos_value|copy}  #default cos_value表示所有数据包被映射到相应的COS值;default copy表示系统默认的映射

Example:
sonic# configure terminal
sonic(config)# diffserv-map type ip-dscp roce_lossless_diffserv_map
sonic(config-diffservmap-roce_lossless_diffserv_map)# ip-dscp 1 cos 1
sonic(config-diffservmap-roce_lossless_diffserv_map)# default copy

修改队列调度策略

configure terminal

policy-map roce_lossless    #进入相关视图

queue-scheduler priority queue queue-id  #配置SP模式调度,queue-id表示队列,范围0-7

queue-scheduler queue-limit percent queue-weight queue queue-id #配置DWRR模式调度queue-weight表示调度权重百分比,范围0-100;queue-id表示队列,范围0-7

Example:
sonic# configure terminal
sonic(config)# policy-map roce_lossless
sonic(config-pmap-roce-lossless)# queue-scheduler priority queue 3
sonic(config-pmap-roce_lossless)# queue-scheduler queue-limit percent 60 queue 3

调整PFC水线

configure terminal

buffer-profile roce_lossless_profile #进入PFC配置视图

mode lossless dynamic dynamic_th size size xoff xoff xon-offset xon-offset [xon xon]

#修改PFC无损Buffer。

dynamic_th表示动态阈值系数,取值范围为[-4,3];动态阈值= 2dynamic_th×剩余可用buffer。例如,dynamic_th设为1,那么动态阈值为2倍的剩余可用buffer,即实际threshold为2/3的总可用buffer;

size表示保留大小,单位为字节,建议配置值为1518;

xoff表示PFC反压帧触发缓存门限值,建议配置为cell size(224 Bytes)的整数倍,单位为字节。xoff与线缆长度,接口速率等参数有关。xoff值必须大于xon值;

xon-offset表示PFC反压帧停止缓存门限值,建议配置为cell size(224 Bytes)的整数倍,单位为字节。建议配置值为13440;

xon为可选参数一般配置为0。

Example:
sonic# configure terminal
sonic(config)# buffer-profile roce_lossless_profile
sonic(config-buffer-profile-roce_lossless_profile)# mode lossless dynamic 1 size 1518 xoff 896 xon-offset 13440 xon 0

调整ECN水线

configure terminal

wred roce_lossless_ecn  #进入ECN配置视图

mode ecn gmin min_th gmax max_th gprobability probability [ymin min_th ymax max_th yprobability probability|rmin min_th rmax max_th rprobability probability]

#修改ECN参数。

min_th设置显式拥塞通告的下限绝对值,单位为字节。即当队列中的报文长度达到此数值时,接口开始按照概率将报文的ECN字段置为CE。可配置的min threshold最小值为15KB,建议配置值为15360;

max_th设置显式拥塞通告的上限绝对值,单位为字节。即当队列中的报文长度达到此数值时,接口开始将全部报文的ECN字段置为CE;不同速率接口的建议值分别为:100/200G为76800,400G为1536000。

probability设置将报文的ECN字段的设置为CE的最大概率,整数形式,取值范围[1,100]。对于时延敏感型业务,建议最大丢弃概率设置为90%;对于吞吐敏感型业务,建议设置为10%。

Example:
sonic# configure terminal
sonic(config)# wred roce_lossless_ecn
sonic(config-wred-roce_lossless_ecn)# mode ecn gmin 15360 gmax 76800 gprobability 90

5 用户测试案例

5.1 要求

现用三台已安装Mellanox 100G网卡的服务器,测试CX532P-N交换机无损转发数据的特性,如下图所示,用server1发送RDMA流量经过交换机的无损队列转发给server3,同时用server2发送普通TCP流量经交换机转发给server3,查看数据接收情况。

5.2 拓扑图

拓扑图

5.3 测试环境

硬件

名称型号硬件指标数量备注
交换机CX532P-N参见彩页2
服务器X86普通服务器3安装100G IB网卡
光模块100GQSFP286
光纤多模100G适用3
网卡MCX653195A-ECAT100G3

软件

软件版本备注
交换机操作系统AsterNOSv3.1
宿主机操作系统openEuler 22.03
宿主机内核 5.10.0-136.33.0.109
Mellanox网卡驱动5.10.0-60.18.0网卡驱动版本要适配宿主机内核版本
iperf33.9

管理网口IP地址规划

设备名称接口IP地址备注
CX532P-N管理口10.230.1.18
Server-1管理口10.230.1.11
Server-2管理口10.230.1.12
Server-3管理口10.230.1.13

业务网口IP地址规划

设备名称接口IP地址备注
CX532P-NVlan接口100.0.10.200
Server-1业务接口100.0.10.10Mellanox 网卡接口
Server-2业务接口100.0.10.11Mellanox 网卡接口
Server-3业务接口100.0.10.12Mellanox 网卡接口

5.4 测试前的准备工作

根据拓扑图将每台服务器连接到交换机,确保服务器上已正确安装 Mellanox 网卡和驱动程序,并安装 iperf3 测试工按照组网图将各服务器与交换机正确连接,确保服务器上安装好mellanox网卡及驱动,并安装好iperf3测试工具。

5.5 配置步骤

第 1 步

对交换机进行基础配置,确保三个接口在同一二层网络中,数据能正常转发。

sonic# configure terminal
sonic(config)# vlan 101
sonic(config-vlan-101)# interface ethernet 0/0
sonic(config-if-0/0)# switchport access vlan 101
sonic(config-if-0/0)# interface ethernet 0/4
sonic(config-if-0/4)# switchport access vlan 101
sonic(config-if-0/4)# interface ethernet 0/8
sonic(config-if-0/8)# switchport access vlan 101
sonic(config-if-0/8)# exit
sonic(config)# interface vlan 101
sonic(config-vlanif-101)# ip address 100.0.10.200/24

第 2 步

一键配置交换机RoCE参数。

onic# configure terminal
sonic(config)# qos roce lossless
sonic(config)# qos service-policy roce_lossless

查看交换机RoCE配置

sonic# show qos roce
查看RoCE配置

第 3 步

配置三台服务器ip地址,并配置网卡的RoCE参数,本次无损队列使用队列3。

[admin@Server1~]# sudo ifconfig ens1f2 100.0.10.10/24 up
[admin@Server2~]# sudo ifconfig ens1f2 100.0.10.11/24 up
[admin@Server3~]# sudo ifconfig ens1f2 100.0.10.12/24 up
[admin@Server1~]# sudo mlnx_qos -i ens1f2 –trust dscp
[admin@Server1~]# sudo mlnx_qos -i ens1f2 –pfc 0,0,0,1,0,0,0,0
[admin@Server1~]# sudo cma_roce_mode -d mlx5_0 -p 1 -m 2
[admin@Server1~]# sudo echo 96 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
[admin@Server1~]# sudo cma_roce_tos -d mlx5_0 -t 96
[admin@Server1~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_np/enable/3
[admin@Server1~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_rp/enable/3
[admin@Server1~]# sudo echo 16 > /sys/class/net/ens1f2/ecn/roce_np/cnp_dscp
[admin@Server1~]# sudo sysctl -w net.ipv4.tcp_ecn=1
[admin@Server3~]# sudo mlnx_qos -i ens1f2 –trust dscp
[admin@Server3~]# sudo mlnx_qos -i ens1f2 –pfc 0,0,0,1,0,0,0,0
[admin@Server3~]# sudo cma_roce_mode -d mlx5_0 -p 1 -m 2
[admin@Server3~]# sudo echo 96 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
[admin@Server3~]# sudo cma_roce_tos -d mlx5_0 -t 96
[admin@Server3~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_np/enable/3
[admin@Server3~]# sudo echo 1 > /sys/class/net/ens1f2/ecn/roce_rp/enable/3
[admin@Server3~]# sudo echo 16 > /sys/class/net/ens1f2/ecn/roce_np/cnp_dscp
[admin@Server3~]# sudo sysctl -w net.ipv4.tcp_ecn=1

第 4 步

使用server1和server2向server3发数据包,其中server1发送RoCE流量,server2发送tcp流量。

[admin@Server3~]# ib_send_lat -R -d mlx5_0 -F –report_gbits -a
[admin@Server1~]# ib_send_lat -a -R -x 3 -d mlx5_0 -F -f 2 100.0.10.12
[admin@Server3~]# iperf3 -s
[admin@Server2~]# iperf3 -c 100.0.10.12 -l 20k -b 100G -M 9000 -t 1000

查看三个接口的各队列数据转发情况。

sonic# show counters queue 0/0
查看0/0接口的队列转发
sonic# show counters queue 0/4
查看0/4接口的队列转发
sonic# show counters queue 0/8
查看0/8接口的队列转发

6 结论

由转发结果可以看出,经过队列3转发的RoCE流量未丢包,经过队列0转发的TCP流量由于带宽不足产生丢包。CX532P-N交换机可以通过RoCE功能实现网络无损传输。

点击了解Asterfusion CX-N数据中心交换机

如有其它问题,请填写右侧需求表单联系我们

如何使用Nginx部署YUM源服务器

什么是YUM?

YUM是Yellow dog Updater, Modified的简写,它是由杜克大学团队修改Yellow Dog Linux的Yellow Dog Updater开发而成。

YUM源本质上是一个包含软件包的仓库, 其中包括了软件包的元数据信息,如软件包的版本、依赖关系等等。 管理员可以通过配置服务器上的YUM源来轻松管理服务器上的软件包,并且从中选择需要安装的软件包。本篇文章将提供一个使用Nginx配置自定义YUM源的操作实例。

虽然 YUM 最初是为 Linux 创建的,但它已被移植到许多其他操作系统上。

使用Nginx部署YUM源服务器流程

1 YUM源服务器使用场景

  • 服务器处于无网环境
  • 缓解公司网络带宽压力
  • 加快服务器软件安装部署

2 YUM源服务器必备条件

  • YUM源服务器能够自动定期的更新YUM源
  • 使用CentOS官方标准源保持更新
  • Linux客户端可以直接使用YUM源

3 YUM源服务器配置

主机系统IP地址软件
yum repoCentos7.4192.168.4.188Nginx+createrepo

服务器具体配置要求如下:

  • 至少2G内存
  • 至少2核CPU
  • 至少100G硬盘

4 环境准备

4.1 关闭SELinux

SELinux不关闭的情况下无法实现,会限制客户机和YUM源服务器的通信。

[root@yum~]# setenforce 0
[root@yum ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

4.2 关闭防火墙

防止安装时出现各个组件的端口不能访问的问题。

[root@yum ~]# systemctl stop firewalld && systemctl disable firewalld                          

5 部署YUM源服务器

部署YUM源的必要服务,并且修改相关服务的配置文件。

5.1 部署Nginx服务

我们使用Nginx配置YUM源服务器。

[root@yum ~]# yum -y install nginx
[root@yum ~]# vi /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
        }
	    autoindex on;
	autoindex_exact_size on;
 	    autoindex_localtime on;
        error_page 404 /404.html;
        location = /404.html {
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
} 
[root@yum ~]# systemctl start nginx
[root@yum ~]# systemctl enable nginx

5.2 在Nginx建立目录

创建yum源目录。

[root@yum ~]# cd /usr/share/nginx/html
[root@yum html]# mkdir -p centos/asterfusion/7/7.4/x86_64
[root@yum html]# tree
├── html
│   ├── 404.html
│   ├── 50x.html
│   ├── centos
│   │   └── asterfusion
│   │       └── 7
│   │           ├── 7.4
│   │               ├── x86
│   │               └── x86_64

5.3 修改Nginx HTML

自定义yum源页面。本篇使用的是星融元Asterfusion自定义YUM源。

[root@yum ~]# cat /usr/share/nginx/html/index.html
        <h1>Welcome to <strong>Asterfusion</strong> on Internet!</h1>
    <div class="content">
    <a href="http://192.168.4.188/centos/asterfusion">Asterfusion Yum Repo</a><br/>
    <br/>
   </div
[root@yum ~]# systemctl restart nginx

5.4 验证yum源

使用服务器IP访问浏览器。

5.5 同步官方yum源

同步官方CentOS7源到本地,如果出现同步后没有对应的文件和目录的情况,检查本地的repo文件是否有错误。

[root@yum x86_64]# pwd
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64
[root@yum x86_64]# yum -y install yum-utils createrepo
[root@yum x86_64]# reposync --repoid base  -p ./
[root@yum x86_64]# reposync --repoid epel  -p ./
[root@yum x86_64]# reposync --repoid extras  -p ./
[root@yum x86_64]# reposync --repoid updates  -p ./
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/base
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/epel
[root@yum x86_64]# createrepo -p /usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/extras
[root@yum x86_64]# createrepo -p \
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/updates

5.6 创建yum repo

部署优先级控制工具,可以控制客户端优先使用优先级较高的yum源,创建yum源repo文件。\

[root@yum x86_64]# yum install yum-plugin-priorities -y 
[root@yum x86_64]# cd /etc/yum.repos.d/
[root@yum yum.repos.d]# mkdir bak
[root@yum yum.repos.d]# mv ./* bak
[root@yum yum.repos.d]# vi Asterfusion.repo
[Asterfusion-base]
name=asterfusion-base
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/base
gpgcheck=0
enable=1
priority=1
[Asterfusion-epel]
name=asterfusion-epel
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/epel
gpgcheck=0
enable=1
priority=1
[Asterfusion-extras]
name=asterfusion-extras
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/extras
gpgcheck=0
enable=1
priority=1
[Asterfusion-updates]
name=asterfusion-updates
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/updates
gpgcheck=0
enable=1
priority=1

部署优先级控制工具,可以控制客户端优先使用优先级较高的yum源,创建yum源repo文件。

[root@yum x86_64]# yum install yum-plugin-priorities -y 
[root@yum x86_64]# cd /etc/yum.repos.d/
[root@yum yum.repos.d]# mkdir bak
[root@yum yum.repos.d]# mv ./* bak
[root@yum yum.repos.d]# vi Asterfusion.repo
[Asterfusion-base]
name=asterfusion-base
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/base
gpgcheck=0
enable=1
priority=1
[Asterfusion-epel]
name=asterfusion-epel
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/epel
gpgcheck=0
enable=1
priority=1
[Asterfusion-extras]
name=asterfusion-extras
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/extras
gpgcheck=0
enable=1
priority=1
[Asterfusion-updates]
name=asterfusion-updates
baseurl=http://192.168.4.188/centos/asterfusion/7/7.4/x86_64/updates
gpgcheck=0
enable=1
priority=1

5.7 重新建立缓存

清除本地缓存和重新建立缓存,检查yum源中的软件包。

[root@yum ~]# yum clean all
[root@yum ~]# yum makecache
[root@yum ~]# yum repolist

使用Nginx部署YUM源服务器-截图1

5.8 测试安装速度

使用本地源安装mariadb数据库,安装速度大大加快。

[root@yum ~]# yum install -y mariadb-server
使用Nginx部署YUM源服务器-截图2

5.9 配置yum源自动更新

在计划任务中加入yum源更新脚本,每周六18:30自动更新CentOS7.4 yum源。

[root@yum home]# vi updateyumrepo.sh
#!/bin/bash
reposync -n --repoid=extras --repoid=updates --repoid=base --repoid=epel -p \
/usr/share/nginx/html/centos/asterfusion/7/7.4/x86_64/
[root@yum home]# crontab -e
30 18 * * 6 /bin/bash /home/updateyurepo.sh
[root@yum home]# crontab -l
30 18 * * 6 /bin/bash /home/updateyurepo.sh

更多相关内容,请访问:A-Lab


星融元(Asterfusion)是领先的开放网络解决方案提供商,产品包括网络操作系统、数据中心交换机、智算交换机、园区交换机、NPB、DPU网卡和P4可编程硬件平台等。为行业企业、数据中心和云运营商提供基于通用解耦硬件和SONiC软件框架的全场景交钥匙网络解决方案,帮助用户构建AI时代中立、透明,易于运维、高性价比的基础网络自由选择。 www.asterfusion.com

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2