wingwj.github.io

Growing ⇈ !

View My GitHub Profile

庖丁解牛——StarlingX 技术详解(1. stx-nfv篇)

Author: WingWJ

Date: 30th, Jan, 2019

StarlingX version: 23rd, Jan, 2019

一、引言

最近开始看StarlingX。

去年底在柏林峰会上,看到不少和边缘计算等相关的议题,各种公众号之类也吵嚷的火热。相关开源项目也有不少,比如Red Hat的VCO(Virtual Central Office)、Linux基金会下的Akraino、OpenStack基金会的StarlingX、RedHat贡献给OPNFV的vCO等。但从业界来看,似乎当前还处于雷声大雨点小的状态,但从各大厂商都在开源抢占标准,加上5G的东风,可见业界还是很看好这个方向的。临渊羡鱼,不如退而结网。亲自看看吧!就先从OCF的StarlingX开始。

但去网上找了找资料,发现有关StarlingX的还多是宣传水贴,有价值的干货很少,在网络上找了半天也没见到一篇像样的。所以,还是自己来吧,边学边写。

另外,StarlingX是由一套巨大的私有系统开源而来的,除了正常的云平台逻辑外,提供了从安装部署、主机管理、故障处理、升级补丁等多全方面内容。所以,本系列计划以逐个拆解的方式,来将各个子系统/项目分开来解析,最后得到一份完整的拼图。这也是本文标题的由来。

二、StarlingX 简介

StarlingX最早起源于Wind River Titanium Cloud R5,由Intel和风河贡献给OCF社区。在2018柏林峰会前刚发布了第一个正式版本。StarlingX是OCF的一个独立项目,不是OpenStack的子项目,它基于OpenStack构建了一个完整的云基础架构软件堆栈,适用于IoT(物联网),电信,自动驾驶,AR/VR/高清视频传输等对性能/延迟有较高要求的场景。当前边缘计算的玩法,是把计算和存储资源部署在网络边缘,通过智能终端、5G等新兴技术结合,来把计算量从中心云卸载到边缘云上,以解决延迟与性能的问题。

有关5G各种应用场景、使用特征、需求分析等,不是本文重点。本文只聚焦于StarlingX技术实现本身。

先来看下StarlingX的架构图:

StarlingX基于OpenStack各组件,对上层提供了一套对象抽象来方便上层编排;而下层则结合当前云计算领域最流行的各项技术,如libvirt、OVS、DPDK、Ceph、K8s等。此外,StarlingX还提供了很多中间件如软件管理、故障管理、服务管理等功能,提供了更丰富的管理能力。

上图中,列举了StarlingX涉及的各个项目(project),分为主要项目及支持项目两类。其中重要的为上面的八个,对应各个项目名,分别提供了以下功能:

这么多内容,该从哪里下手开始入门呢?当然要从最关键部件开始。:)

以下将从stx-nfv project开始,先完成这个中心项目的学习,然后将触角逐步延伸,逐个将它涉及的其他部件添加进来,最终构成一张完整的StarlingX技术地图。

注:以下分析均基于OpenStack社区StarlingX 项目 2019-01-23日版本。

三、STX-NFV Project 详解

作为StarlingX 与 OpenStack 交互中间件,stx-nfv主要提供NFVI Orchestration功能,此外还负责VM故障恢复及主机补丁升级。

这里先看下stx-nfv的功能列表。以下是官方定义:

1. 项目概述

整个stx-nfv项目,包含 nfv、guest-agent/server、nova-api-proxy 三大功能:

 

2. NFV

其中最关键的部件为 nfv,代码结构大致如下。简单看下几个模块的代码名,就能了解到它们提供的功能:

这里能看到nfv有关的全部进程:

以下,重点介绍下nfv各组件的主要功能。各模块功能介绍如下,其中作为独立进程启动的只有前三个:

3. Guest Agent

在stx-nfv project中第二部分功能,是有关Guest Agent的。这一部分主要是用C及C++编写的。

接下来看下 Guest Agent的功能。它其实与原生的Guest Agent没太大区别,都是通过UNIX socket在VM与hypervisor间打开一条通信渠道,让VM内的消息能传出去,VM外的指令能发进来;消息以 json格式传递。具体原理可以查看这里:http://www.linux-kvm.org/page/Virtio-serial_API 。说到与原生的区别,主要是针对StarlingX的逻辑,又做了一些消息的额外传递&处理;类似的通信功能都是通过这条通道来实现的。当前主要提供了三大功能:

 

在实现上,以心跳检测为例:

 

在代码包中,官方还附了一份pdf文档,来说明该心跳检测的原理,可以查看这里:stx-nfv/guest-client/guest-client-3.0.1/TiS-Guest-Heartbeat-Service.pdf。

 此外,StarlingX中利用Guest Agent 的通道,还实现了另外两个功能,分别是资源调整及Server Group:

这里,顺带着把 mtce也先提一下。mtce是maintenance的简写,它是stx-metal project 的核心,主要用来完成环境节点状态维护、进程保护、资源上报等功能。上文中介绍的Guest Agent 及Guest Server 都是mtce的一部分,而mtce Agent是mtce的管理中心。有关这部分内容,后续会介绍,到时一并补完。#TODO

下图以Guest Agent为视角,罗列了它与其他组件的协作关系:

 

4. Nova-Proxy-API

最后,在stx-nfv project 中,还额外扩展了一个proxy组件称为nova-proxy-api,作为分发器,主要用来进行请求转发。因为有些消息(如VM的常用操作)需要传递到nfv模块中(以同步下发),而有些消息则可以直接发往Nova去。来看下真实环境: 

controller-1:~# ps -ef|grep nova-api-proxy
root     31196     1  0 Jan19 ?        00:04:23 /usr/bin/python /usr/bin/nova-api-proxy --config-file=/etc/proxy/nova-api-proxy.conf

我们再看下配置文件里的内容,除了鉴权信息外,最重要的是 一进两出 的端口信息:

controller-1:~# cat /etc/proxy/nova-api-proxy.conf
[DEFAULT]
api_paste_config=api-proxy-paste.ini
auth_strategy=keystone
debug=False
show_request_body=False
pool_size=256
osapi_proxy_listen=192.168.121.2
osapi_proxy_listen_port=8774
osapi_compute_listen=192.168.121.2
osapi_compute_listen_port=18774
nfvi_compute_listen_port=30003
nfvi_compute_listen=127.0.0.1
 
[keystone_authtoken]
admin_user=nova
admin_tenant_name=services
...

这个服务通过api_proxy.py::main()启动,流程与其他OpenStack服务类似,比较简单。这里不列了。

最关键的逻辑,其实是在 nova-api-proxy/acceptor.py 里定义的。即如果操作是POST类型且操作类型在列表里时,这些操作需要先路由到nfvi 去。否则直接发往OpenStack Nova去。——简单概括下,即nfvi 把需要转发的消息,事先在nova-api-proxy里注册了。

 

5. 小结

本章最后,把本文中涉及的各组件画到一起,如下:

其中组件sysinv(stx-config相关)、FM(stx-fault相关)、mtce Agent(stx-metal相关),由于只在本文流程中涉及还没开始展开,所以暂时以虚线标注,等后续介绍时再逐步填充进去,最终组成一张完整的技术地图。

四、一点想法

本文最后,其实还想吐槽下StarlingX的组件结构。

以上。这篇就先写到这里,剩余的组件边看边写,估计得到年后更了。