Octavia 简介


Octavia is an open source, operator-scale load balancing solution designed to work with OpenStack.

自 Pike 以来 OpenStack 推荐使用 Octavia 代替 neutron-lbaas extension 作为 Load Balancing as a Service 的首选方案,并在 Queens 中将 neutron-lbaas 标记为废弃 —— Neutron-lbaas is now deprecated

社区推崇 Octavia 的原因有很多,它解决了 neutron-lbaas 遗留的历史包袱,能够对外提供独立而稳定的 API。简单的说,社区认为 neutron-lbaas 使 Neutron 的项目管理变得拖沓,LBaaS 应该作为一个独立项目得到长足的发展,事实也是如此。

《Octavia 分析与实现》系列基于 Rocky,主要记录、分析了 Octavia 作为 OpenStack LBaaS 的抽象设计,开发性设计及架构代码实现,从中感受社区开发者们对 Octavia 的寄予。

本文作为系列的开篇,希望能够从宏观的角度鸟瞰 Octavia 的全貌,由面及点,更利于后续理解 Octavia 的底层实现细节。

基本对象概念


LBaaS:对于 OpenStack  云平台而言,LB(负载均衡)被作为一种服务提供给用户,用户得以按需地获取可配置的业务负载均衡方案,这就是所谓 Load Balancing as a Service。

LoadBalancer:负载均衡服务的根对象,用户对负载均衡的定义、配置和操作都基于此。

VIP:与 LoadBalancer 关联的虚拟 IP 地址,每个 LoadBalancer 最起码有一个 VIP 作为外部对后端业务集群访问的标准入口。

Listener:下属于 LoadBalancer 的监听器,可配置监听外部对 VIP 的访问类型(e.g. 协议、端口)。

Pool:后端的真实业务云主机集群域,一般的,用户会根据云主机的业务类型进行划分。

Member:业务云主机,下属于 Pool,对应传统负载均衡体系中的 Real Server。

Health Monitor:挂靠于 Pool,周期性对 Pool 中的 Member(s) 进行健康检查。

L7 Policy:七层转发策略,描述了数据包转发的动作(e.g. 转发至 Pool,转发至 URL 或拒绝转发)。

L7 Rule:七层转发规则,下属于 L7 Policy,描述了数据包转发的匹配域(e.g. 转发至 Pool 中所有以 webserver 开头的 Members)。

图1. 动静分离负载均衡应用模型图

上图是一个简易的利用负载均衡实现的 Web 动静页面分离模型,辅助理解上述概念及其个体与整体间的关系。

基本使用流程


下面从使用的角度来感性了解 Octavia,首先介绍 Octavia 的网络结构。

图2. Octavia 网络架构图(注:图源来自孔令贤的博客)

标准的 Octavia 网络架构,包含了:

Amphora(e):实体为云主机,作为负载均衡器的载体,也是 Octavia 默认的 Loadbalancer Provider。

lb-mgmt-net:是一个与 OpenStack Management/API Network 打通的网络,admin project 可见,东侧连接 Amphora Instance、西侧连接 Octavia Services。

tenant-net:业务云主机所在的网络。

vip-net:提供 VIP 地址池的网络。

NOTE:其中 vip-net 和 tenant-net 可以是同一个网络,但在生产环境中,我们建议分开。这样更有利于针对性的施加安全策略,划分不同级别的网络安全隔离域。

图3. 初始的 OpenStack 网络拓扑图

在 Dashboard 创建一个 Loadbalancer 的步骤

  • Step 1. 设定 loadbalancer 的 VIP。支持直接指定 VIP,或由 DHCP 分配。

  • Step 2. 设定 listener 监听的协议及端口。监听 http://<VIP>:8080/ 的外部访问。

  • Step 3. 设定 pool 的负载均衡算法。这里选择 RR 轮询分发算法。

  • Step 4. 设定 pool 下属的 members。设定 members 需要指定端口和权重,前者组成了接受数据转发的 socket,后者表示分发的优先级。

  • Step 5. 设定 health monitor 的健康检查规则。如果 members 出现 PING 不同的情况,则会被标记为故障,不再接受分发。

创建完 lb-1 之后的网络拓扑变更如下图。可以看出,Amphorae 在之中起到了关键作用,使用端口挂载的方式将属于 3 个不同网络中的 VIP、Members 及 Octava Services 串连起来,Amphorae(双耳壶)也因此得名。

图4. 创建 LoadBalancer 之后的 OpenStack 网络架构图

现在,我们不妨粗浅的梳理一下 Octavia Amphora Provider 的设计思路:

  • Amphorae 作为负载均衡器软件(HAProxy)和高可用支撑(Keepalived)的运行载体,通过 Agent 与 Octavia Services 通信。
  • Octavia Services 接收到用户 Create LoadBalancer 和 VIP 的选项参数后,通知 Agent 动态变更 haproxy、keepalived 的配置文件。
  • 将 Members 所处的 Subnet 接入 Amphorae,内含的 haproxy 通过 Member Socket(IP, Port) 分发请求数据包。

图5. 简易的 Octavia 通讯模型

这里再补充一下与 Octavia 相关的 image 和 security group 的内容。Launch Amphora Instance 需要使用特定的镜像,Octavia 提供了专门的镜像制作工具。暂支持 CentOS 和 Ubuntu 两种操作系统,也支持设定 password,不过在生产环境中还是建议使用 keypair 进行登录。至于安全组,从图 5 可以看出 Amphora 的安全组最起码要满足 ingress:UDP/5555 和 egress:TCP/9443 两条规则。

 

使用 amphora image 的步骤

  • Step 1. 上传 amphora image

$ /opt/rocky/octavia/diskimage-create/diskimage-create.sh -i ubuntu

$ openstack image create amphora-x64-haproxy \

 --public \

 --container-format=bare \

 --disk-format qcow2 \

 --file /opt/rocky/octavia/diskimage-create/amphora-x64-haproxy.qcow2 \

 --tag amphora

 

  • Step 2. 配置使用 amphora image

[controller_worker]

amp_image_owner_id = <amphora-image id>

amp_image_tag = amphora

...

 

使用 amphora security group 的步骤

  • Step 1. 创建 amphora 使用的安全组

$ openstack security group create amphora-sec-grp --project <admin project id>

$ openstack security group rule create --remote-ip "0.0.0.0/0" --dst-port 9443 --protocol tcp --ingress --ethertype IPv4 --project <admin project id> amphora-sec-grp

$ openstack security group rule create --remote-ip "0.0.0.0/0" --dst-port 5555 --protocol udp --egress --ethertype IPv4 --project <admin project id> amphora-sec-grp

  • Step 2. 配置使用 amphora security group

[controller_worker]

amp_secgroup_list = <amphora-sec-grp id>

...

 

软件架构


图6. Octavia 架构图(注:图源自 Octavia 官方文档)

Octavia 的架构设计依旧是常规的「生产者-消费者」异步通讯模型,API 与 Worker 分离再通过 MessageQueens 进行通信。

  • Octavia API:标准 RESTful API,Octavia v2 API(default enabled)是 LBaaS v2 API 的超集,完全向后兼容。所以版本滞后的 OpenStack 平台也可通过 Neutron Octavia Driver 进行集成。
  • Octavia Controller Worker:Octavia 的核心,底层采用 Driver & Plugin 的设计来满足 OpenStack 平台所代表的开放性,支撑上层的 3 大功能模块。
    • Octavia Worker:负责完成 API 请求,是 Octavia 主干功能的执行者。
    • Health Manager:负责保证 LoadBalancer Provider 的高可用
    • Housekeeping Manager:名副其实的 Housekeeping(家政),保障 Octavia Services 清洁的运行环境。实现了 SpaceAmphora、DatabaseCleanup 和 CertRotation。

NOTE:需要特别说明的是,架构图中虽然只给出了 Amphora 一种 LB Provider,但 Drivers & Plugin 设计实际上是支持多种 LB Provider 的(e.g. F5)。社区一直有计划将这些已实现的 Drivers 从 openstack/neutron-lbaas repo 迁移到 openstack/octavia repo,只是一直很缺人手。

服务进程清单


Octavia Service Menu 是软件架构的具象表现:

  • octavia-api
  • octaiva-worker
  • octavia-health-manager
  • octavia-housekeeping

代码结构


下面列举一些关键的目录:

  • amphora:Amphora REST API 和 amphora-agent 的实现
  • api:Octavia API 的实现
  • certificates:CA 认证的实现,支持 Amphora 与 Octavia Controller Worker 间的安全通信以及 TLS 功能
  • compute:实现了 Compute Driver 的抽象和 novaclient 的封装
  • network:实现了 Network Driver 的抽象和 neutronclient 的封装
  • db:ORM 层的封装实现
  • policies:定义了 API 请求的鉴权策略

继续展开 controller 目录:

  • healthmanager:Health Manager 的实现
  • housekeeping Manager:HouseKeeping Manager 的实现
  • queue:内部 RPC 通信实现,应用了 cotyledon 框架和 oslo_messaging 库
    • api/handlers/queue/producer.py
    • controller/queue/consumer.py
  • worker:Octavia Worker 的实现,应用了 TaskFlow 框架
    • flows:任务流的封装,每个功能单元都会被定义为一个 Flow
    • tasks:任务的封装,使得任务的逻辑实现得以高度重用

PS:cotyledon 是由社区开发用于替代 oslo.service 的第三方开源库。

 

      Cotyledon provides a framework for defining long-running services. It provides handling of Unix signals, spawning of workers, supervision of children

     processes, daemon reloading, sd-notify, rate limiting for worker spawning, and more.

                                                                                                                                                                                                       —— 摘自 cotyledon 官方文档

最后简单终结一下 Octavia 的架构设计,作为独立项目,其继承了 OpenStack 一贯优秀的开放性,在 LB Provider、Certificates Driver、Compute Driver 和 Network Driver 这些外部支撑节点都高度抽象出了 Driver 类,使 Vendors 和 Users 得以简便接入现有的基础设施。这无疑是 Octavia 甚至 OpenStack 受到欢迎的原因之一。

下一篇《Octavia Rocky 的实现与分析系列二:创建 LoadBalancer 的流程》即将更新,敬请期待!

Rocky版新功能集锦之三:Trove

摘要

8月31日,备受业界关注的OpenStack第18个版本Rocky正式发布。在人工智能,机器学习,NFV和边缘计算等用户的驱动下,Rocky版本的OpenStack变得比以往更强大,它带来了数十种增强功能,并支持各种硬件架构,包括裸机管理服务等,这些更新和升级能够很好的满足基础设施的新需求。OpenStack正力争为业界提供一个开放,完善,稳定,功能齐全的最优解决方案。今天将围绕Rocky版本的Trove项目,对项目的新特性进行展示,业界需要掌握的关键点都在这里。

Rocky版新功能集锦之三:Trove

Trove简介

 

Trove是OpenStack官方的database-as-service项目,提供关系型或非关系型数据库的部署、配置、备份、恢复和监控,大大简化了操作流程。它在OpenStack Havana版本中被孵化,并被正式集成在OpenStackIcehouse版本中。项目的原始赞助商为HP和Rackspace,主要贡献者有Tesora,Rackspace,HP,IBM,Redhat,eBay,Mirantis。

 

Rocky版本Trove功能变更一览


在最新发布的OpenStack Rocky版本中,Trove未引入新的特性,更注重修复部分bug,例如:

 

1、MariaDB在主备切换的时候,如果在将副本附加到新主服务器之前重新激活旧主服务器,则可能会在旧主服务器上意外创建新的GTID,并同步到这些副本,从服务器无法变更为主服务器。该问题通过先将副本附加到新主服务来解决。

 

2、取消从Nova创建Volume,直接通过cinderclient创建volume。

 

3、Peviously root disable API返回没有任何内容的HTTP 200响应,现在将返回更合适的HTTP 204响应。

 

Trove项目架构


Rocky版新功能集锦之三:Trove

图1 Trove系统架构图

 

图1展示了Torve项目的架构,它由trove-api,trove-taskmanager,trove-conductor和trove-guestagent子系统构成,各子系统之间通过RPC进行通信。在这4个子系统中:

 

1、trove-api 提供REST风格的API,完成一些数据层面的逻辑操作(直接操作DB),比如获取实例列表、集群列表等,将复杂的异步任务它都交给taskmanager去完成,例如创建虚拟机、卷等操作。

 

2、trove-taskmanager与OpenStack的核心组件Nova、Cinder、Neutron等进行操作,完成数据库实例的创建、删除等资源操作。

 

3、trove-guestagent集成在vm镜像里面,创建、管理、备份数据库等,并通过周期性任务,实时更新数据库状态。

 

4、trove-conductor作为trove数据库访问的中间件,避免了trove-guestagent直接访问trove数据库。

 

Trove抽象出系统的公共基础架构,通过对基础架构的继承开发,可支持各种不同类型数据库。这也使得用户可以通过统一的方式操作不同类型的数据库,降低了使用难度。OpenStack Trove目前支持Cassandra,CouchBase,CouchDB,DataStaxEnterprise,DB2,MariaDB,MongoDB,MySQL,Oracle,Percona Server,PostgreSQL,Redis和Vertica。

 

Trove常用操作


Rocky版新功能集锦之三:Trove

图2 Trove概念架构图

 

图2显示了Trove的概念架构图,trove的主要操作也是围绕这几个概念实现的,分别为instance操作、datastore操作、backup操作、cluster操作、configuration操作、replica操作、user操作和database操作。下面展示了它们的部分操作,详细的操作参数可通过trove –help获得。

 

1. Instance操作

 

Instance代表一个运行有mysql或MongoDB等的虚拟机,对Instance的操作即可落在虚拟机上,也可落在mysql、MongoDB上。

 

  • trove create:创建一个trove instance

  • trove delete:删除一个trove instance

  • trove resize-instance:调整虚拟机的flavor

  • trove resize-volume:调整mysql或MongoDB等载盘的大小

  • trove restart:重启一个trove instance

  • trove show:显示一个trove instance的detail信息

  • trove update:更新一个trove instance的信息

  • trove list: 展示当前项目下的所有trove instances

  • trove root-disable: 禁止mysql等获得root权限

  • trove root-enable: 运行mysql等获得root权限

 

2. datastore操作

 

Datastore维护着当前Trove能够支持的数据库系统版本和对应镜像等信息。


  • trove datastore-list:显示有哪些datastore trove

  • datastore-show:显示一个datastore的detail信息

  • trove datastore-version-list:显示一个datastore的version list

  • trove datastore-version-show:显示一个datastore的一个version的detail信息

 

3. backup操作

 

trove提供备份mysql或MongoDB中的数据库到swift的操作,支持全量备份和增量备份。

 

  • trove backup-create:创建一个数据库的backup

  • trove backup-delete:删除指定ID的backup

  • trove backup-list:列出可用的所有backups

  • trove backup-list-instance:列出指定instance对应数据库的所有可用backups

  • trove backup-show:显示指定ID的backup的detail信息

  • trove backup-copy:从一个backup copy生成一个新的backup

 

4. cluster操作

 

针对有些数据库系统有cluster的概念,比如MongoDB。

 

  • trove cluster-create:创建一个新的cluster

  • trove cluster-delete:删除一个cluster

  • trove cluster-instances:列出一个cluster的所有instances

  • trove cluster-list:列出所有的clusters

  • trove cluster-show:显示指定ID的cluster的detail信息

  • trove cluster-grow: 向cluster中添加更多的instance

  • trove cluster-shrink: 从cluster中移除instance

  • trove cluster-seset_status: 设置cluster的任务状态为None

  • trove cluster-upgrade:将cluster升级到一个新的datastore

 

5. configuration group操作

 

trove提出了配置组的概念,这是为了是用户可以定制不同Instance中数据库系统的配置参数,针对不同的数据库系统类型,支持的配置参数也不相同,比如mysql支持的配置参数定义在:trove/templates/mysql/validation-rules.json。此外,trove限制每个instance只能配置一个configuration group。


  • trove configuration-create:创建一个新的configuration group

  • trove configuration-delete:删除一个configuration group

  • trove configuration-attach:attach一个configurationgroup到一个trove instance上

  • trove configuration-detach:detach一个troveinstance上的configuration group

  • trove configuration-default:显示一个trove instance的默认configuration group

  • trove configuration-instances:显示绑定到一个configurationgroup上的所有trove instances

  • trove configuration-list:显示所有的configuration group

  • trove configuration-show:显示一个configuration group的detail信息

  • trove configuration-parameter-list:列出指定version的datastore支持的configuration group配置参数

  • trove configuration-parameter-show:显示指定version的datastore支持的configuration group的某一项配置的详细信息

  • trove configuration-patch:把新的<values> patch到一个configuration group

  • trove configuration-update:更新一个configuration group的信息

 

6. replica操作

 

为了支持数据库的高可用,trove可动态添加或删除一个instance副本。

 

  • trove create [–replica_of <source_instance>][–replica_count <count>] :为一个instance添加一个新的副本

  • trove detach-replica: 去除一个instance的副本

 

7. user操作

 

trove支持创建数据库系统的user,并支持赋予/收回 user访问数据库系统的权限。

 

  • trove user-create:创建一个数据库系统的user

  • trove user-delete:删除一个数据库系统的user

  • trove user-grant-access:赋予user访问database(可以同时指定多个)的权限

  • trove user-revoke-access:收回user访问database的权限

  • trove user-list:list一个数据库系统的所有users

  • trove user-show:显示一个数据库系统中指定user的detail信息

  • trove user-show-access:显示一个数据库系统中指定user访问database的权限信息

 

8. database操作

 

trove支持在一个数据库系统上创建多个database;

 

  • trove database-create:在一个数据库系统上创建database

  • trove database-delete:删除一个数据库系统上的database

  • trove database-list:列举一个数据库系统上的所有databases

 

除了这些操作,Trove还有针对securitygroup、metadata、log等,这些操作使得Trove功能十分强大,满足了用户的需求。

 

 

Rocky版本遇到的问题与解决方案

 

目前,Trove向虚拟机中注入guestagent的配置文件等是通过Nova api中的personality参数,但是此参数已经从OpenStack Queens版本中弃用,将来会从Nova代码中移除。未来,Trove将使用Nova api中的–user-data参数进行文件的注入,具体操作如下:

 

1、重建trove.instance.models.BaseIntance中的get_injected_file函数,用来获取注入文件内容、路径、所有者和权限,生成InjectedFile对象,请将所有需要注入的文件构成InjectedFile list返回。

 

2、调整trove.taskmanger.models.FreshIntanceTask中的_prepare_userdata函数,基于InjectFile对象建立cloud-config脚本。如果Trove中还存在datastore_manager的cloudinit脚本,将会对该cloudinit脚本进行检测,然后将它和cloud-config脚本转化为mime multi part file类型脚本,以防止传递给cloud-init的数据类型大于一种。

 

3、利用-user-data传递参数给Nova api,虚拟机启动的时候,cloud-init通过执行脚本完成文件的注入。

 

未来Trove server与Troveguest agent间的通信将采用octaviad的网络架构模式。

 

参考链接:

https://github.com/openstack/trove

https://wiki.openstack.org/wiki/Trove

https://docs.openstack.org/developer/trove/

https://docs.openstack.org/releasenotes/trove/rocky.html

搞个大事件

Rocky版新功能集锦之三:Trove

值此Rocky版本发布之际,九州云将于10月10日上午10:00,正式线上同步发布全球首款基于 Rocky版本第七代全新开源云管理平台 ——Animbus® 7.0系列产品。


10月10日10点,诚邀业界同仁一同品鉴。

始发于:Rocky版新功能集锦之三:Trove

Rocky版新功能集锦之二:Cinder

摘要

8月31日,备受业界关注的OpenStack第18个版本Rocky正式发布。在人工智能,机器学习,NFV和边缘计算等用户的驱动下,Rocky版本的OpenStack变得比以往更强大,它带来了数十种增强功能,并支持各种硬件架构,包括裸机管理服务等,这些更新和升级能够很好的满足基础设施的新需求。OpenStack正力争为业界提供一个开放,完善,稳定,功能齐全的最优解决方案。今天将围绕Rocky版本的Cinder项目,对项目的新特性进行展示,业界需要掌握的关键点都在这里。

Rocky版新功能集锦之二:Cinder

Cinder简介

 

Cinder即块存储服务,为实例提供了块存储设备。块存储服务提供了管理卷的基础架构以及通过与计算服务nova的合作,能够将卷挂载到实例上。块存储服务同时能管理卷的快照、卷的备份以及卷的类型。

 

Cinder架构及流程图

 

Rocky版新功能集锦之二:Cinder

 

Cinder组件解读

 

cinder-api:接收API请求,同时将请求送到cinder-volume中来执行操作。

 

cinder-volume:与底层存储、cinder-scheduler以及消息队列等诸多进行直接交互。运行cinder-volume的节点被称作为存储节点。现在有很多的底层driver来适配不同的存储后端,例如rbd(ceph集群),lvm,nfs等。

 

cinder-scheduler:调度器用来选择合适的cinder-volume节点来进行volume的最终创建。其功能类似于计算服务中的nova-scheduler。

 

cinder-backup:备份服务提供了将任何类型的volume备份至存储后端。和cinder-volume类似,拥有driver的设计架构,适配了很多的存储后端,例如ceph,swift等。

 

Cinder Rocky新特性

 

scheduler插件能获知operation类型

 

现在对于scheduler插件来说,operation的类型是可知的,例如操作到底是create_volume还是migrate_volume是可以从RequestSpec中获取。这样带来的好处就是,厂商各自写的scheduler就可以针对某些特定的操作进行过滤,而不必所有的操作。现在支持的operation值有如下:

 

– create_volume

– extend_volume

– create_snapshot

– retype_volume

– migrate_volume

– manage_existing

– manage_existing_snapshot

– create_group

 

Code Reivew链接:点击这里

 

随容量变化的QoS规格

 

R版本之前,已经支持设置固定QoS的功能。现在能依据比例决定性能,设置per_gb容量的QoS规格即容量的大小决定了性能的高低。一个卷类型可以绑定多个QoS规格,最后传给消费者生效。支持的QoS规格有如下:

 

– read_iops_sec_per_gb // 每秒每GiB的读IOPs

– write_iops_sec_per_gb // 每秒每GiB的写IOPs

– total_iops_sec_per_gb // 每秒每GiB的总IOPs

– read_bytes_sec_per_gb // 每秒每GiB的读吞吐量(字节)

– write_bytes_sec_per_gb // 每秒每GiB的写吞吐量(字节)

– total_bytes_sec_per_gb // 每秒每GiB的总吞吐量(字节)

 

例如:设置total_iops_sec_per_gb为30,total_bytes_sec_per_gb为1048576(1MiB),然后根据这个QoS创建100GiB的volume,则最后volume的限制为3000总IOPs和100MiB/s吞吐量。

 

Code Review链接:点击这里

 

随容量变化的最小值QoS规格

 

由于过小的volume而导致分配到计算结果非常小的IOPs或者吞吐量。由此,可以设置per_gb的最小值来保证可以分配到比较客观的QoS。支持的QoS规格有如下:

 

– read_iops_sec_per_gb_min // 每秒每GiB的最小读IOPs

– write_iops_sec_per_gb_min // 每秒每GiB的最小写IOPs

– total_iops_sec_per_gb_min // 每秒每GiB的最小总IOPs

– read_bytes_sec_per_gb_min // 每秒每GiB的最小读吞吐量(字节)

– write_bytes_sec_per_gb_min // 每秒每GiB的最小写吞吐量(字节)

– total_bytes_sec_per_gb_min // 每秒每GiB的最小总吞吐量(字节)

 

Code Review链接:点击这里

 

备份支持设置可用域AZ

 

从微版本3.51及以上开始,cinder backup的创建支持接收可用域AZ即指定备份存放的AZ。可以通过CLI来创建指定AZ,如下命令:

 

`cinder –os-volume-api-version 3.51 backup-create <volume> –availability-zone AVAILABILITY_ZONE ……`

 

Code Review链接:点击这里

 

卷类型支持设置可用域AZ

 

对于卷类型,AZ已经被支持了,如下:

 

– availability_zones现在已经是AZ volume type的一个预留值。管理员可以通过为volume type设置key/value例如availability_zones: az1,az2来做AZ的限制。

– availability_zones只能在creating或者retyping卷的时候用来过滤backends。

– 从微版本3.52及以上开始,卷类型能通过extra spec进行过滤查询。

 

Code Review链接:点击这里

 

备份服务支持多线程

 

Cinder backup服务现在支持运行多进程来尽可能的利用多核的优势。在通过并发执行多个压缩备份或者恢复的时候,性能方面有显著的提升。进程数量可以通过`backup_worker`进行配置。

 

Code Review链接:点击这里

 

从image创建volume时添加image签名认证

 

在glance创建image时,如果extra_properties中存在CERT_UUID、HASH_METHOD、SIGNATURE以及KEY_TYPE时,会生成image的签名。此时,如果从image创建volume,则会对image进行签名认证,如果签名认证失败,则不会创建相应的volume,状态置为error。

 

默认现在为开启签名认证,当然管理员也可以通过更新verify_glance_signatures来更改行为。

 

同时,会往cinder库中的volume_glance_metadata表中添加一个附加的image元数据signature_verified来标识在创建的过程中签名认证是否被执行了。

 

Code Review链接:点击这里

 

cinder-manage命令新增reset_active_backend

 

场景为,A为主节点,B为从节点,当A挂掉后,故障转移从A到B后,需要一个机制能够将B提升为master backend,这样B能够复制到重新准备的C后端。

 

因此,命令reset_active_backend能够直接重置backend而不需要手动的修改数据库。

 

usage: cinder-manage db reset_active_backend [-h] [–enable-replication]

                                             [–active-backend-id ACTIVE_BACKEND_ID]

                                             –backend-host BACKEND_HOST

optional arguments:

  -h, –help            show this help message and exit

  –enable-replication  Set replication status to enabled (default: False).

  –active-backend-id ACTIVE_BACKEND_ID

                        Change the active backend ID (default: None).

  –backend-host BACKEND_HOST

                        The backend host name.

 

Code Review链接:点击这里

 

RBD驱动支持Active-Active的复制

 

RBD驱动添加支持Active-Active的复制。允许用户配置multiple volume backends,它们参与复制且均来自于同一集群的成员。

 

Code Review链接:点击这里

 

针对RBD驱动的rbd_exclusive_cinder_pool参数设置

 

如果查询每一个image(rbd)的预分配的大小,消耗大量的时间去采集provisioned_capacity_gb,而此时所使用的pool只供给cinder服务使用,那么为了提高reporting的速度以及取消大小的采集,我们可以设置rbd_exclusive_cinder_pool此参数。

 

Code Review链接:点击这里

 

RBD驱动list_manageable_snapshots

 

通过RBD驱动获取rbd backend中可管理的snapshots。

 

Code Review链接:点击这里

 

RBD驱动报告backend状态

 

在获取volume service状态时,返回backend_state字段用于标识backend状态。

Code Review链接:点击这里

 

以上是对Cinder Rocky的新特性进行简单概述,欲了解其他第三方驱动更新及其他特性,可以参考“链接,掌握详细信息。

搞个大事件

Rocky版新功能集锦之二:Cinder

值此Rocky版本发布之际,九州云将于10月10日上午10:00,正式线上同步发布全球首款基于 Rocky版本第七代全新开源云管理平台 ——Animbus® 7.0系列产品。

10月10日10点,诚邀业界同仁一同品鉴。

始发于:Rocky版新功能集锦之二:Cinder

Rocky版新功能集锦之一:Magnum加强对k8s特性的支持

 

摘要

8月31日,备受业界关注的OpenStack第18个版本Rocky正式发布。在人工智能,机器学习,NFV和边缘计算等用户的驱动下,Rocky版本的OpenStack变得比以往更强大,它带来了数十种增强功能,并支持各种硬件架构,包括裸机管理服务等,这些更新和升级能够很好的满足基础设施的新需求。OpenStack正力争为业界提供一个开放,完善,稳定,功能齐全的最优解决方案。即日起九州云将围绕Rocky版本,对部分重点项目的新特性进行展示,业界需要掌握的关键点都在这里。

 

Rocky版新功能集锦之一:Magnum加强对k8s特性的支持

 

在首期小编将重点介绍Magnum项目在R版本的更新情况。Magnum 是由 OpenStack Containers Team 开发的一项 OpenStack 服务,旨在将容器编排引擎作为 OpenStack 的一等资源,为OpenStack用户提供无缝的容器运行体验。通过Magnum,你可以想创建一个虚拟机一样创建一个容器集群,开箱即可用,而无需操心COE部署及网络调整,Magnum帮你解决了这些麻烦。借助OpenStack服务,Magnum还提供了COE不具有的多租户认证鉴权和多租户网络隔离等功能。

 

Magnum 架构及工作流程

 

Rocky版新功能集锦之一:Magnum加强对k8s特性的支持

 

Magnum不会直接去管理和部署集群所需资源,而是把创建集群所需资源解释成heat模板,由heat编排集群所需的计算、网络、镜像和存储资源完成集群创建。

 

和诸多核心项目相较而言,Magnum还是一个比较新的OpenStack项目,但经过几个版本的迭代,Magnum基本功能已经稳定,新的功能也在开发中。随着OpenStack Rocky版本的推出,Magnum也推出7.0.1和7.0.0版本。先来看看这次Magnum都更新了什么?

 

Magnum项目功能更新

 

  • k8s_fedora_atomic集群支持基于角色的权限控制(RBAC)功能。
  • 引入’fedorations’API端点,这个功能允许管理员可以将多个magnum集群作为一个集群管理,即所谓的“集群联邦(cluster fedoration)”这项功能目前还在开发中,更多信息请参考Gerrit Code Review
  • 多主节点配置下使用负载均衡减少浮动IP占用。
  • 新增cert_manager_api 标签以启用k8s证书管理API。
  • 现在默认将证书写入Kubernates的配置文件中,而不是生成额外的文件,若要使用旧版本特性,请使用output-certs选项。
  • 新增k8s_fedora_atomic驱动的cloud_provider_enabled标签,默认为True。
  • 新增ingress_controler和ingress_controler_role标签以支持k8s集群ingress控制器部署。ingress_controler默认值为””(即不部署控制器)可选值为traefik。
  • 启用了Octavia服务的OpenStack环境下,k8s负载均衡现在不仅可以用于集群主节点的高可用行,也可为k8s提供负载均衡服务。
  • 更新k8s图形化界面,增强ks8资源监控能力。k8s图形化界面更新至v1.8.3,同时heatpster(k8s的一款计算资源分析软件)组件现在会被单独部署,用户可以使用influx_grafana_dashboard_enabled标签来启用grafana-influx。
  • 更新k8s_fedora_atomic驱动至最新的Atmoic 27,etcd和flannel服务从基本操作系统中移除,改为在系统容器中运行。
  • 弃用功能声明:现在Magnum默认情况下不会收集k8s集群信息并发送到消息总线中,如果用户想监控k8s资源情况,heapster或其他工具可以做得更好,所以Magnum计划在Stein版本去掉这个功能。

 

总结起来Rocky版本的Magnum有如下特性:

 

容器集群完整生命周期管理标准API;

容器集群多租户支持;

多COE选择:包括 Kubernetes, Swarm, Mesos, DC/OS;

多容器集群部署环境选择:虚拟机或裸机;

基于Keystone的多租户安全和认证管理;

基于Neutron的多租户网络控制和隔离;

基于Cinder的容器卷服务;

OpenStack集成:云用户单点登录体验;

容器集群访问加密;

 

 

Magnum 相关术语介绍

 

集群

 

一个集群是Magnum用于启动COE的结构。在集群创建好后用户可以直接在集群上添加容器或者通过COE部署容器,如使用K8S时创建Pods,集群基于集群模板创建。

 

集群模板

 

Magnum的集群模板相当于Nova的Flavor。它定义了集群的COE,秘钥对和镜像。

 

容器编排引擎

 

COE管理一个或多个容器生命周期,即容器集群的管理软件。Magnum支持多种COE,包括Docker Swarm, Kubernetes, 和 Mesos,每种COE各有优劣。

 

标签

 

标签是声明某些COE特定参数的常用方法,标签的格式为”key/value”,他们将会被使用它们的驱动解释。

 

集群驱动

 

集群驱动是Python代码、heat模板、脚本、镜像和某特定COE文档的集合。集群驱动为COE提供和管理COE运行所需资源。

 

Kubernate 相关术语介绍

 

Kubernate是流行的容器编排引擎之一,也是Magnum文档中最常用于演示的COE,对K8S有所了解有助于阅读Magnum文档。

 

Pod

 

在K8s中,Pod是最小的资源调度单位。一个Pod是运行于同一环境的强耦合应用程序的组合。一个Pods由1个或更多容器组成。Pod的管理是由K8s完成,换言之,Magnum不会管理Pod。更多关于Pod的信息参考Kubernetes(k8s)中文文档 名词解释 Pods_Kubernetes中文社区。

 

Replication controller

 

Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么。**注意:**K8s 计划逐步废弃RC,而改用功能更加丰富的RS和Deployments。RS和Deployments参见Kubernetes(k8s)中文文档 名词解释:ReplicaSets_Kubernetes中文社区

 

服务

Kubernete Service 是一个定义了一组Pod的策略的抽象,我们也有时候叫做宏观服务。这些被服务标记的Pod都是通过label Selector决定的。

 

总体来看,R版本的Magnum更多表现在修复bug上,进一步完善现有功能,其中最大的亮点就是稳定性的更新和加强对k8s特性的支持,而这些离不开CERN、NEC、九州云、红帽、富士康等众多公司的积极参与。相信在下一个版本中,Magnum将会呈现更完美的自己。

 

搞个大事件

Rocky版新功能集锦之一:Magnum加强对k8s特性的支持

值此Rocky版本发布之际,九州云将于10月10日上午10:00,正式线上同步发布全球首款基于 Rocky版本第七代全新开源云管理平台 ——Animbus® 7.0系列产品。

10月10日10点,诚邀业界同仁一同品鉴。

始发于:Rocky版新功能集锦之一:Magnum加强对k8s特性的支持

OpenStack技术分享:Kolla patch指导书


Kolla项目的出现大大简化了OpenStack安装流程,提升了部署效率,这也是OpenStack社区发展极其重要的一笔。接下来将由九州云工程师曹袁即OpenStack社区Kolla项目Core分享有关升级的精彩内容:


升级准备(以horizon为例)


#kolla image更新方式


1、研发/社区已合并patch,测试通过后,提供最新build的image(一般是tar包)

a、拷贝镜像包到控制节点

b、通过docker load命令加载镜像到docker

c、使用docker tag image_id repository:new_tag把镜像做好标记

   (repository需要和原先保持一样,new_tag不能和原来一样)


2、提供patch链接(http://172.16.30.17/#/c/3316/

a、手动下载diff.zip包到本地,解压之后上传到horizon运行节点

b、通过docker命令,拷贝diff包到容器(docker cp xxx.diff horizon:/root)

c、进入容器,并切换到site-packages目录

d、使用git命令进行代码更新(git apply /root/xxx.diff),并检查确认

e、执行collectstatic&compress命令(horion需要,其他项目跳过)

f、重启容器,并测试

h、使用docker commit container repository:new_tag把修改保存到镜像

   (repository需要和原先保持一样,new_tag不能和原来一样)


3、将镜像push到仓库(本地或者共用)

dokcer push repository:new_tag


4、确认push成功

检查仓库路径下,是否已经生成对应tag文件(实际以仓库路径为准)

ls 仓库路径

/namespace/project/image_name/_mainfile/tags


5、备份kolla-ansbile(centos环境下,运行代码在/usr/share/kolla-ansible/)

cp –r /usr/share/kolla-ansible/ /opt


升级操作


在此以horizon为例,假设new_tag,CentOS。

#获取待升级项目(horizon)的default/main.yml中tag定义的名称值,此处为“horizon_tag”

vim /usr/share/kolla-

ansible/ansible/roles/horizon/defaults/main.yml


OpenStack技术分享:Kolla patch指导书


注:不是/etc/kolla/globals.yml配置文件的release_tag


#编辑/etc/kolla/globals.yml,添加如下配置:

horizon_tag:new_tag


#pull镜像到控制节点

kola-ansible –i inventory/mutinode pull –tag horizon


#执行升级操作

kola-ansible –i inventory/mutinode upgrade –tag horizon


(P版本之后的kolla-ansible,可以通过增–host 参数支持单节点升级)


验证升级成功


#验证horizon已经运行new_tag版本的image,且运行状态为up


OpenStack技术分享:Kolla patch指导书


#验证相关服务,确保升级成功


失败回退


#还原待升级项目(horizon)的default/main.yml中tag 

vim /usr/share/kolla-

ansible/ansible/roles/horizon/defaults/main.yml


#执行回退操作

kola-ansible –i inventory/mutinode upgrade –tag horizon


以上是对Kolla升级的简要概述,供大家参考。一直以来,Kolla项目是九州云贡献最为突出的领域。在九州云工程师张雷即OpenStack社区Kolla项目PTL的带领下,Kolla项目实现了诸多新特性,例如已经实现kolla升级,在R版本kolla将朝着零宕机升级这个目标继续前行。接下来,张雷及其团队将会陆续为大家分享Kolla方面的相关技术内容,敬请持续关注!


延伸阅读

女王的新装 | Q版新功能集锦之一:Kolla从升级到零宕机升级

九州云张雷当选OpenStack社区容器项目Kolla PTL

【开源实践分享】:Kolla集成外接ceph存储实践

【OpenStack容器技术】:Kolla 让 OpenStack 部署更贴心

OpenStack容器化实践分享:Core Dump


关于九州云99Cloud

九州云(99Cloud.Inc)成立于2012年,是中国第一家从事OpenStack和相关开源服务的专业公司。公司成立六年,秉承“开源 · 赋能变革”的理念,已经从单一的OpenStack产品提供商,发展成为涵盖云核心、云运营、云运维和云安全等多个领域的开源软件和服务提供商。九州云已支持了国家电网、中国人民银行、中国银联、中国移动、中国电信、中国联通、中国资源卫星、中航信(航旅纵横)、eBay、国际陆港集团、中国人寿、万达信息、东风汽车、诺基亚等重量级客户。在2018年最新的Queen发行版排名中,九州云在核心模块贡献跃居全球第四,中国第二,其中在容器部署Kolla项目、NFV编排Tacker项目等重量级项目上贡献全球第一。

OpenStack技术分享:Kolla patch指导书

始发于微信公众号: 九州云99CLOUD

CI/CD技术分享:OpenStack Zuul介绍

据统计,在上周结束的OpenStack温哥华峰会中,关于CI/CD持续集成和交付的议题超过40个,CI/CD成为了整场峰会最热门的话题之一。而Zuul作为CI/CD模块中耀眼的明星,被大家所熟知,在本次峰会上更是引起了业界高度关注。在这里小编将简单介绍下Zuul,包括Zuul 的CI简单流程图、组件及架构等。

——编者按


CI/CD技术分享:OpenStack Zuul介绍


什么是Zuul


随着OpenStack持续集成的推广,基于OpenStack开源项目的性质,项目大,全球各地的开发人员多,变更提交频繁。Jenkins不能解决并发多、单依赖的问题,拉长了问题反馈时间。为解决该问题,源于OpenStack开源社区的基于ZUUL框架的 CI方案出现在我们的视线中。


CI简单流程图


CI/CD技术分享:OpenStack Zuul介绍


Zuul组件及工作流程


为了更好的理解什么是Zuul和Zuul到底是怎么工作的,需要介绍一下Zuul有哪些组件。


CI/CD技术分享:OpenStack Zuul介绍

Zuul整体架构


Zuul-server

Zuul-server是Zuul的主要的服务,zuul-server是作为zuul的scheduler,zuul-server从gerrit接收消息,一旦消息被接收到,zuul-server就建立工作流程,并把处理结果返回给gerrit Zuul-server跟gerrit组件交流是通过执行“gerrit stream-events”,然后等待gerrit返回的信息,另外,zuul-server也与Gearman进行通讯。

Gearman

Jenkins的设计初衷并不用于并行执行,它设计中某些点使用到了全局锁,因此在Jenkins的slave节点增加到一定数量后(大约100台),Jenkins的master节点就会出现问题而成为瓶颈。同时master节点是单点部署,无法完成HA等处理。为了扩展Jenkins而引入了Gearman。


简单来说,Gearman是一个用来扩展Jenkins的一种协议,而且Gearman一开始并不是专门为Zuul开发的,但是Gearman很好的符合了Zuul的需求,因此OpenStack采用Gearman来扩展Zuul对Jenkins的调度。 在配置的时候可以选择单独创建Gearman-server或者是使用Zuul来部署Gearman,具体在/etc/zuul/zuul.conf里面进行配置:

1 [gearman_server]

2 listen_address = 127.0.0.1

3 log_config = /etc/zuul/gearman-logging.conf

4 start = true

5


把start改成true,zuul服务就会启动并管理Gearman进程。

Zuul-merger

这里不要被这个组件的名字所误导了,这个组件并不是当代码全部通过测试后用来merge到主干的。当开发者提交一个change后,zuul-merger把这个change merge到一个本地forked repository中 ,这样就可以进行下一步的测试了。


可以把zuul-merger单独部署在一台服务器上也可以进行高可用部署,即部署在多台服务器上组成zuul-merger的集群。


在zuul的配置文件 /etc/zuul/zuul.conf下可以对zuul-merger进行配置,在 [merger] section下面:

1 [merger]

2 git_dir = /var/lib/zuul/git

3 log_config = /etc/zuul/merger-logging.conf

4 pidfile = /var/run/zuul-merger/zuul-merger.pid

5 zuul_url = 127.0.0.1

6


  • git_dir是zuul对Git repository的一个copy

  • Log_config是配置zuul-merger的log目录

  • zuul_url是zuul server的url,这个url可能有多个(zuul集群的情况下)

Zuul-cloner

Zuul-cloner不像其他组件,它没有Damon,只有一个client,用来创建job的workspace

Zuul Workflow

下图解释了当一个patch提交给gerrit的时候zuul的workflow是怎么样的:


CI/CD技术分享:OpenStack Zuul介绍


Gerrit

用户的patch是提交给Gerrit的,也可以是一个新的commit,一旦这个patch被提交上来,Gerrit就会publish一个event,通知其他服务来处理这个event,如Zuul、Jenkins等。

Zuul Server

Zuul-server根据zuul.conf的配置来启动相应的关联进程,Zuul server会先起一个进程叫GerritWatcher,用来listen从Gerrit那边传过来的event(步骤3),在注册好所有的连接后,zuul-server会起一个Gearman,zuul-server同时会启动Gearman和Scheduler。


当一个Gerrit的event被publish后,GerritWatcher就会通知scheduler,scheduler先会去检查这个event是否合法(根据layout.yaml里面定义的规则),如果通过,便会触发一个trigger event(步骤4)。


Scheduler接着处理这个event,并把这个event添加到一个相关的pipeline里面(步骤5,也是根据layout.yaml里面定义的规则),接下去就是pipeline来处理这个event了,scheduler也会去检查这个event是否依赖于其他的event。

Zuul Merger

当scheduler触发完成trigger event后,把整个代码克隆下来,并把更改的代码并入主干的工作是由zuul-merger来完成的。在步骤6中,merger会从gearman那边获得一个“merge job”的信息,里面包括项目的名称,分支信息,change number和ref等信息。第一步merger需要确认这个commit是不是重复的,如果是,那么就返回已经发生的commit,如果不是,那么继续下一步工作。


HEAD ref重置完成后,如果ref指向了一个不可用的分支,那么zuul就会自动选择第一个可用的分支,然后merger会通过“git fetch”来update repo,再checkout。


接下来merger尝试merge更改到repo上,如果merge成功,那么就会在zuul-server中创建一个新的reference到repo中,最后,merger会返回一个动作完成的信息。

Gearman & Jenknis

现在repo已经准备完成,在上面merger的工作完成之后,现在需要测试这个代码的更改。这步操作其实是scheduler来做的,但是需要配合Gearman来执行。Scheduler发送给Gearman,scheduler也会发送一些变量给Gearman,一般是 ‘ZUUL_’ 开头的。


Gearman接着把数据发送给Jenkins,Jenkins可能是一个集群,Jenkins在测试完成后会把结果返回给zuul,zuul再去通知gerrit是否去merge这个更改。

是否必须使用Jenkins

OpenStack社区考虑过不再使用Jenkins,只使用Zuul来代替,但是如果你的CI系统跟Jenkins强绑定的话,系统中使用了很多Jenkins的plugin,那么再去转换到non-Jenkins的环境中会有比较大的困难。当然可以慢慢利用Zuul来替换Jenkins,但是如果一定要使用Jenkins的话,那么就需要“Jenkins Gearman”这个plugin来提供支持。

Pipelines

Pipelines是Zuul重要的组成部分,每一个gerrit的change都会由一个或者多个Pipelines来进行处理。

Upsteam

非Openstack核心团队的人员可以在评审代码后作出+1(好)、0(无评价)、-1(不建议合并)的评价。核心团队的成员可以给出非核心成员可给出的所有评价,此外还可以给出+2(好,approved)、-2评价(不要提交)。


标签属性中另外一列为“Verified”。只有Gerrit的非交互用户(non-interactive users)如Jenkins,才能在此属性上添加Verified标签。Verified一列可设置的值为+1(check pipeline测试通过)、-1(check pipeline测试未通过)、+2(gate pipeline测试通过)、-2(gate pipeline测试未通过)。此外,第三方搭建的外部测试平台也属于非交互用户,但是只能设置+1、-1。


Pipeline也有很多种:


  • periodic – 周期性工作的pipeline,比如用于非工作时间做常规的测试

  • expermental – 如果你有一个新项目,但是不知道它是怎么工作的,那么可以用于这个expermental pipeline

  • pre-release – 触发的job是归于一个新的pre-release tags

  • release – 触发的job是归于一个release tags

定制化Pipelines

可以通过配置Zuul来定制化pipelines,可以通过更改zuul layout配置文件,下面是一个配置例子:

1 – name: test

2 manager: IndependentPipelineManager

3 source: gerrit_internal

4 trigger:

my_gerrit:

6   – event: patchset-created

7   success:

8 my_gerrit:

9 verified: 1

10  failure:

11 my_gerrit

12 verified: -1

13


可以自定义一个pipeline,取名为test,如果pipeline运行成功,那么返回给gerrit +1,如果失败,那么返回给gerrit -1。上面的配置文件中还有

1 manager: IndependentPipelineManager

2


这个是用来决定pipeline具体是如何工作的。

IndependentPipelineManager

IndependentPipelineManager是当pipeline在处理信息是不需要关心信息处理的顺序的时候使用,在一些patch提交时,在其他test正在运行的时候,也不会对这个patch提交产生影响,当前提交的patch相对独立,就可以使用IndependentPipelineManager。

DependentPipelineManager

DependentPipelineManager则是当pipeline在处理信息是不需要关心信息处理的顺序的时候使用,如果当你同时提交了多个patch,当一个patch test failed的时候,那么同时提交的相关联的patch都需要再次test一次。


Zuul同时还可以很好的处理具有复杂依赖关系的多个patch。它能监控正在执行的任务,并可提前结束掉因依赖的patch测试失败而必定失败的测试任务。


参考文献

http://stackeye.com/2014/06/openstack-ci/

https://docs.openstack.org/infra/manual/zuulv3.html


关于九州云99Cloud

九州云(99Cloud.Inc)成立于2012年,是中国第一家从事OpenStack和相关开源服务的专业公司。公司成立六年,秉承“开源 · 赋能变革”的理念,已经从单一的OpenStack产品提供商,发展成为涵盖云核心、云运营、云运维和云安全等多个领域的开源软件和服务提供商。九州云已支持了国家电网、中国人民银行、中国银联、中国移动、中国电信、中国联通、中国资源卫星、中航信(航旅纵横)、eBay、国际陆港集团、中国人寿、万达信息、东风汽车、诺基亚等重量级客户。在2018年最新的Queen发行版排名中,九州云在核心模块贡献跃居全球第四,中国第二,其中在容器部署Kolla项目、NFV编排Tacker项目等重量级项目上贡献全球第一。

CI/CD技术分享:OpenStack Zuul介绍


始发于微信公众号: 九州云99CLOUD