9-Openstack 控制面板服务 Horizon

熊 2 阅读 虚拟化


1. Horizon 简介

horizon 是 openstack 的管理其他组件的图形显示和操作界面,通过~ 和其他服务进行通 讯,如镜像服务、计算服务和网络服务等结合使用,horizon 基于 python django 开发,通过 Apache 的 wsgi 模块进行 web 访问通信,Horizon 只需要更改配置文件连接到 keyston 即可

Horizon作为OpenStack的Web界面 , 它提供了对OpenStack各个模块的可视化操作。Horizon允许用户通过浏览器来访问OpenStack , 而无需使用命令行工具以及其他客户端。

openstack-horizon-1

Horizon是一个基于Django框架的Web应用程序 , 它是OpenStack的一个关键部分。使用Horizon , 用户可以自由地管理云平台、云硬件设施以及虚拟化资源。

2. Horizon 功能框架

  • 功能框架

    openstack-horizon-2

    Horizon主要由三个dashboard组成: 用户dashboard、系统dashboard和设置dashboard。

  • 用户dashboard

    openstack-horizon-3

  • 系统dashboard

    openstack-horizon-4
  • 设置dashboard

    openstack-horizon-5

3. 概念理解

  • 区域( Region)

    1. 地理上的概念 , 可以理解为一个独立的数据中心 , 每个所定义的区域有自己独立的Endpoint ;

    2. 区域之间是完全隔离的 , 但多个区域之间共享同一个Keystone和Dashboard(目前Openstack中的Dashboard还不支持多个区域) ;

    3. 除了提供隔离的功能 , 区域的设计更多侧重地理位置的概念 , 用户可以选择离自己更新的区域来部署自己的服务,选择不同的区域主要是考虑那个区域更靠近自己 , 如用户在美国 , 可以选择离美国更近的区域 ;

    4. 区域的概念是由Amazon在AWS中提出,主要是解决容错能力和可靠性 ;

  • 可用性区域(Availability Zone)

    1. AZ是在Region范围内的再次切分 , 例如可以把一个机架上的服务器划分为一个AZ , 划分AZ是为了提高容灾能力和提供廉价的隔离服务 ;

    2. AZ主要是通过冗余来解决可用性的问题 , 在Amazon的声明中 , Instance不可用是指用户所有AZ中的同一个Instance都不可达才表明不可用 ;

    3. AZ是用户可见的一个概念 , 并可选择 , 是物理隔离的 , 一个AZ不可用不会影响其他的AZ , 用户在创建Instance的时候可以选择创建到那些AZ中 ;

  • Host Aggreates

    一组具有共同属性的节点集合 , 如以CPU作为区分类型的一个属性 , 以磁盘( SSD\SAS\SATA) 作为区分类型的一个属性 , 以OS( Windows\Linux) 为作区分类型的一个属性 ;

    openstack-horizon-6
  • Cell

    • nova为了增加横向扩展以及分布式、大规模( 地理位置级别) 部署的能力 , 同时又不增加数据库和消息中间件的复杂度 , 引入了cell的概念 , 并引入了nova-cell服务。

    • 主要是用来解决OpenStack的扩展性和规模瓶颈 ;

    • 每个Cell都有自己独立的DB和AMQP , 不与其他模块共用DB和AMQP,解决了大规模环境中DB和AMQP的瓶颈问题 ;

    • Cell实现了树形结构( 通过消息路由) 和分级调度( 过滤算法和权重算法) , Cell之间通过RPC通讯 , 解决了扩展性问题 ;

      openstack-horizon-7

4. Horizon 界面功能

Horizon作为OpenStack的Web界面 , 提供了丰富的可视化功能 , 让用户可以更加轻松地操作OpenStack平台。其中 , 主要包含如下功能:

  1. 用户认证: Horizon支持基于用户名和密码的认证方式 , 还提供了基于令牌的用户认证方式。

  2. 虚拟机管理: Horizon允许用户创建、启动、停止、重启虚拟机等操作 , 还提供了虚拟机列表、虚拟机快照等功能。

  3. 云存储管理: Horizon支持对云存储的创建、管理和删除操作 , 未来还会提供更多功能。

  4. 网络管理: Horizon可以对网络进行配置、控制和监控 , 从而提供完整的网络管理功能。

  5. 负载平衡器管理: Horizon提供了负载平衡器的创建、配置和监控等功能。

Horizon为两种用户提供了两种不同的功能界面:

  • 云管理员: 提供了一个整体的视图可以总览整个云的资源大小及运行状况 , 可以创建终端用户和项目 , 向终端用户分配项目并进行项目的资源配额管理 ;

  • 终端用户: 提供了一个自主服务的门户 , 可以在管理员分配的项目中 , 在不超过额定配额的限制内 , 自由操作、使用和 存储网络资源 ;

总之 , Horizon提供了全面的OpenStack管理功能 , 并且具有良好的可维护性和扩展性。

5. 安装和配置Horizon

dashboard这个服务可以运行在控制节点 , 也可以运行在其他一个单独的节点上 , 但是运行在单独的一个节点上 , 请提前配置好yum仓库 , 时间同步 , 以及主机名解析等等 ; 这里用一台独立的服务安装dashboard服务。节点环境的准备可以按照之前的文档来操作

  1. 安装软件

    [root@node04 ~]# dnf --enablerepo crb install openstack-dashboard
  2. 编辑 /etc/openstack-dashboard/local_settings 文件并完成以下操作:

    • 在dashboard节点上配置controller节点 , 以方便dashboard服务可以使用openstack服务。使用示例: OPENSTACK_HOST = "controller"

      OPENSTACK_HOST = "192.168.71.11"

    • 配置任何主机都允许访问dashboard服务。使用示例: ALLOWED_HOSTS = ['horizon.example.com', 'localhost']

      ALLOWED_HOSTS = ['*']

      *表示通配所有主机;

    • 配置存储session的服务为memcached , 并配置memcached的地址

      SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
       
      CACHES = {
          'default': {
               'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
               'LOCATION': 'openstack-vip.net:11211',
          }
      }

    • 启用Identity API版本3

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

      如果你的 Keystone 运行在5000端口上 , 那么在这里你也应该指定 Keystone 的端口 ,

      OPENSTACK_KEYSTONE_URL = "http://%s:5000/identity/v3" % OPENSTACK_HOST
    • 启用对域的支持

      OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
    • 配置API版本:

      OPENSTACK_API_VERSIONS = {
          "identity": 3,
          "image": 2,
          "volume": 3,
      }
    • 配置default域为用户的默认域

      OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
    • 配置创建用户的角色默认为user角色

      OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
    • 配置网络相关参数 , 如果openstack中的neutron服务配置的的是provider network , 需要禁用对三层网络的支持 , 如果是self-service network保持默认即可

      如果选用的是provider network这种网络模型 , 配置是

      OPENSTACK_NEUTRON_NETWORK = {
          ...
          'enable_router': False,
          'enable_quotas': False,
          'enable_distributed_router': False,
          'enable_ha_router': False,
          'enable_fip_topology_check': False,
      }
    • 配置时区

      TIME_ZONE = "Asia/Shanghai"
    • 设置浏览器访问时的根目录

      WEBROOT = "/dashboard/"
  3. 在/etc/httpd/conf.d/openstack-dashboard.conf配置文件导入以下配置

    WSGIApplicationGroup %{GLOBAL}
    image-20240928024135789

    这里原本的/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>

    由于新版本里面没有文件/usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi, 新版本里面用/usr/share/openstack-dashboard/openstack_dashboard/wsgi.py替换了这个文件 , 修改之后的文件内容如下

    WSGIDaemonProcess dashboard
    WSGIProcessGroup dashboard
    WSGISocketPrefix run/wsgi
    WSGIApplicationGroup %{GLOBAL}
    
    #修改下面内容, 保证可以识别到脚本文件
    WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi.py
    Alias /dashboard/static /usr/share/openstack-dashboard/static
    
    #由于原本的文件不见了, 这里修改脚本目录位置, 
    <Directory /usr/share/openstack-dashboard/openstack_dashboard/>
      Options All
      AllowOverride All
      Require all granted
    </Directory>
    
    <Directory /usr/share/openstack-dashboard/static>
      Options All
      AllowOverride All
      Require all granted
    </Directory>

  4. 启动httpd服务 , 并将其设置为开机启动

    systemctl restart httpd.service 
  5. 安装连接memcached驱动

    yum install python3-memcached

以此dashboard已经安装完成

如果访问过程中需要直接使用IP而不是IP/dashboard加/dashboard后缀的方式访问。则需要去掉之前在文件/etc/openstack-dashboard/local_settings添加的WEBROOT = "/dashboard/"。

另外修改文件/etc/httpd/conf.d/openstack-dashboard.conf,修改内容如下

[root@node04 ~]# cat /etc/httpd/conf.d/openstack-dashboard.conf
WSGIDaemonProcess dashboard
WSGIProcessGroup dashboard
WSGISocketPrefix run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias / /usr/share/openstack-dashboard/openstack_dashboard/wsgi.py
Alias /static /usr/share/openstack-dashboard/static

<Directory /usr/share/openstack-dashboard/openstack_dashboard/>
  Options All
  AllowOverride All
  Require all granted
</Directory>

<Directory /usr/share/openstack-dashboard/static>
  Options All
  AllowOverride All
  Require all granted
</Directory>

或者直接运行命令手动生成对应的文件内容。生成的配置文件默认根目录为/

[root@node04 ~]#cd /usr/share/openstack-dashboard
[root@node04 openstack-dashboard]# python manage.py make_web_conf --apache > /etc/httpd/conf.d/openstack-dashboard.conf
[root@node04 ~]# cat /etc/httpd/conf.d/openstack-dashboard.conf

<VirtualHost *:80>

    ServerAdmin webmaster@openstack.org
    ServerName  openstack_dashboard

    DocumentRoot /usr/share/openstack-dashboard/

    LogLevel warn
    ErrorLog /var/log/httpd/openstack_dashboard-error.log
    CustomLog /var/log/httpd/openstack_dashboard-access.log combined

    WSGIScriptReloading On
    WSGIDaemonProcess openstack_dashboard_website processes=5
    WSGIProcessGroup openstack_dashboard_website
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On

    WSGIScriptAlias / /usr/share/openstack-dashboard/openstack_dashboard/wsgi.py

    <Location "/">
        Require all granted
    </Location>

    Alias /static /usr/share/openstack-dashboard/static
    <Location "/static">
        SetHandler None
    </Location>
</Virtualhost>

这里如果需要手动生成的.conf的httpd配置文件的访问后缀为/dashboard, 则需要手动修改对应配置文件, 修改之后的文件内容如下

[root@node04 ~]# cat  /etc/httpd/conf.d/openstack-dashboard.conf

<VirtualHost *:80>

    ServerAdmin webmaster@openstack.org
    ServerName  openstack_dashboard

    DocumentRoot /usr/share/openstack-dashboard/

    LogLevel warn
    ErrorLog /var/log/httpd/openstack_dashboard-error.log
    CustomLog /var/log/httpd/openstack_dashboard-access.log combined

    WSGIScriptReloading On
    WSGIDaemonProcess openstack_dashboard_website processes=5
    WSGIProcessGroup openstack_dashboard_website
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On

    WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi.py

    <Location "/dashboard">
        Require all granted
    </Location>

    Alias /dashboard/static /usr/share/openstack-dashboard/static
    <Location "/dashboard/static">
        SetHandler None
    </Location>
</Virtualhost>

用浏览器访问httpd所在服务器ip地址+/dashboard , 看看是否能够访问到dashboard?

image-20240928173925141

用default域demo用户帐号和密码 , 登录dashbroad

image-20240928174342133

查看demo用户启动的虚拟机实例 , 看看是否能够看到之前我们启动的实例?

image-20240928174439481

管理实例 , 连接实例控制台

image-20240928174704831
image-20240928182459716

6. 基本操作

6.1 修改密码

点击设置->更改密码

image-20240928184202832
image-20240928184231095

6.2 创建实例

创建实例前需要准备好三个工作:镜像、网络、实例类型。

6.2.1 实例类型(flavor)

在管理员-->计算-->实例类型中创建需要的实例类型

image-20240928184551540

看到这个图应该很容易理解了 , 就是定义一种资源类型 , 后面创建实例的时候 , 根据这个配置去创建。

image-20240928184744222

6.2.2 镜像(image)

镜像的来源可以有很多种 :

  • 一是各大系统厂商会发布自己云镜像。注意:不是ISO镜像 , 用ISO镜像是无法直接创建实例的 , 通常是以img 、qcow2结尾的文件 ; ( 最为方便的方式 , 但是不支持密码登录和ssh连接等 , 在创建实例时要准备好脚本做对应的修改) ;

  • 二是自定义镜像。使用KVM先通过ISO镜像生成一个虚拟机 , 然后进行一些自定义的操作 , 完成之后将QCOW2作为镜像上传到openstack使用 ;

下面演示使用云镜像创建实例 :

  • 上传镜像

    image-20240928194829853
    image-20240928195104195

    上传已经下载好的云镜像 , 无论是img还是qcow2的文件 , 在镜像格式时都选择 QCOW2 - QEMU模拟器 , 其他可以不需要选择 , 然后点击创建镜像即可 , 等待上传。

  • 创建新的实例类型

    image-20240928200520912

  • 创建实例

    image-20240928200015471
    image-20240928200048726
    image-20240928200144955

    实例类型就是配置,黄色的感叹号是表示此项目下分配的内核数量不够了,不能创建这个配置了。

    image-20240928200703352

    这里网络是默认已经之前实验中已经创建好的

    image-20240928200731352

    可以选择相关的安全组规则,事先可以先定义安全组及其规则。

    image-20240928200802792
    image-20240928200824064

    密钥登录,会生成一对密钥对,让你下载公钥,云镜像创建的实例部进行配置的话,就只能进行公钥免密登录。

    image-20240928200841991
    image-20240928200919088

    之后直接创建实例

    image-20240928203820226

参考链接

玩转企业云计算平台系列( 七) : Openstack 控制面板服务 Horizon (qq.com)