容器的下一代基础设施:腾讯云Serverless产品SCF实战

2020-12-04 20:24:32 浏览数 (1)

为什么选择腾讯云SCF

面临的问题

2020年上半年,我负责的业务初步完成IAAS层、PAAS层上云,借助云能力,基本解决了整体的资源供应效率、发布效率的问题。但是针对简单的接口应用、爬虫、刷任务脚本等,复用现有基础设施,交付速度一直提升不上来,后续的运维、运营工作负担也比较重。主要体现在以下几个痛点:

维度

原来

痛点

发布变更

完整发布流程

仅修改了配置或脚本,就需要走一遍完整的发布流程

资源调配

走资源申请流程

临时突发任务满足效率低(爬虫机,需绑公网IP)

运维管理

基础环境、装包手动

额外工作量

可用性

脚本任务手动切换

1、耗费开发精力去恢复2、需额外开发监控保障

存活性探测

配置探针

额外工作量

成本

低负载较多

依赖人工配置

分析整个系统约3000 模块,约80%以上模块,大都是低流量、轻逻辑模块,基本发布一次后,再变更的概率比较低,就算有变更,也是基于非核心逻辑变更。

如何解决这部分服务的运维问题呢?从上面痛点可以看出,是资源管理粒度的问题:用管理服务的方法,来管理单薄应用。单薄应用一般功能单一,甚至是一个函数。经过参考IAAS资源演进和业界经验,决定尝试用腾讯云SCF来解决这些问题。

IAAS资源演进

使用场景、管控能力、弹性能力比较:

资源类型

应用架构

管控

弹性

物理机

传统代码包

完全可控

虚拟机

SOA

完全可控

需借助基础设施

容器

微服务

完全可控

具备

Serverless

函数

功能受限

具备

Serverless简介

无服务器(Serverless)不是表示没有服务器,而表示当您在使用 Serverless 时,您无需关心底层资源,也无需登录服务器和优化服务器,只需关注最核心的代码片段,即可跳过复杂的、繁琐的基本工作。核心的代码片段完全由事件或者请求触发,平台根据请求自动平行调整服务资源。Serverless 拥有近乎无限的扩容能力,空闲时,不运行任何资源。代码运行无状态,可以轻易实现快速迭代、极速部署。

业界的一些使用Serverless案例

公司

量级

场景

主业务逻辑

优势

高德地图

QPS 2W

主页/导航页/到达页的推荐信息模块从BFF(Back-end For Front-end)转到SFF(Serverless For Front-end)

简单提效,整体上线耗时缩短了 40%弹性与成本,峰值是自动扩容,峰谷时不占用成本

蘑菇街

PB级数据

ETL

轻量,无需购买服务器更快速实现,学习成本低,基本只写脚本程序即可费用低,业务流量低峰期几乎零成本省心,与ckafka直接事件对接

新东方

全量

视频转码

在实现方面,云函数和容器差别不大开发流程上,云函数更加简单高效;云函数自带能力较完善对接自建平台,起 agent 不如容器方案简单在运维方面,云函数更加易用和省心在费用方面,云函数相比容器服务可节省费用 30% 以上

从这三个公司的用法可以看出,应用场景主要体现在:

1、非主业务逻辑

2、前端可以闭环,无需增加中间层

所以使用云函数时,可以考虑从这两个维度选择接入业务

SCF的问题

整体来看,scf零运维管理、自动扩缩容的特性实现了单薄、非核心应用的快速试错能力,但使用下来发现有以下问题:

维度

现状

问题

解决

冷启动

第一次访问有延迟

时长敏感或超时短的业务第一次访问可能失败

预置并发缓解

发布

官网控制台发布

体验较差,大函数输入时,界面可能卡死

引入Serverless Framework 蓝盾

灰度

通过版本灰度

大量手工操作

了解到coding集成了scf灰度能力,暂未调研,或者结合业务,自研灰度调度系统

函数管理

官网列表管理

函数数量增多时,不好快速定位同项目函数的组织结构

暂无

多环境

没有多环境

真实开发需要多环境

引入Serverless Framework模拟多环境

通过调研发现,Serverless Framework可以解决手动发布和多环境管理问题,所以云函数可以结合Serverless Framework做了一些实践,下面是一些工作记录。

Serverless Framework简介

Serverless Framework 是业界非常受欢迎的无服务器应用框架,开发者无需关心底层资源即可部署完整可用的 serverless 应用架构。Serverless Framework 具有资源编排、自动伸缩、事件驱动等能力,覆盖编码-调试-测试-部署等全生命周期,帮助开发者通过联动云资源,迅速构建 serverless 应用。

在本次实战中,我们主要使用Serverless Framework自动部署能力、多环境管理能力。

环境文件.env

部署scf时,如果没有预先在.env文件配置secret_key和secret_id,则会弹出认证界面。用户认证后,自动生成类似如下内容:

代码语言:javascript复制
TENCENT_APP_ID=1234567890
TENCENT_SECRET_ID=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TENCENT_SECRET_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TENCENT_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这些内容会自动过期,过期时间与控制台登陆的过期时间一致。

如果要实现登陆权限不过期,需要申请平台子账号权限,获取key和secret。

然后配置.env文件,删掉TENCENT_APP_ID、TENCENT_TOKEN,修改参数TENCENT_SECRET_ID和TENCENT_SECRET_KEY的值即可。

配置文件serverless.yml

配置文件是自动生成的

代码语言:javascript复制
component: django # (required) name of the component. In that case, it's express.
name: mydjangoDemo # (required) name of your express component instance.
org: mydjangoDemo # (optional) serverless dashboard org. default is the first org you created during signup.
app: mydjangoDemo # (optional) serverless dashboard app. default is the same as the name property.
stage: release # (optional) serverless dashboard stage. default is dev.

inputs:
  region: ap-XXXXXXXXXX
  functionName: DjangoFunction
  djangoProjectName: mydjangocomponent
  src:
    src: ./src
  functionConf:
    timeout: 10
    memorySize: 256
    environment:
      variables:
        TEST: vale
    vpcConfig:
      subnetId: ''
      vpcId: ''
  apigatewayConf:
    protocols:
      - https
    environment: release

主要参数说明

name: 表示实例名,会用在管理路径中

app: 表示应用名,会用在管理路径中

stage: SF框架的命名空间,可以模拟云函数多环境部署

src: 代码入口所在路径

vpcConfig: 配置云函数所在网络,vpcId即vpc网络ID,subnetId即vpc网络的子网ID

使用经验

简介

本文中CI工具,使用的是蓝鲸智云开源的持续集成平台,代码地址https://github.com/tencent/bk-ci/,是一个十分好用的平台,大家可以根据文档搭起来试用。

文档地址:https://bk.tencent.com/docs/document/6.0/129/5868

基于蓝鲸 ServerlessFramework的CICD

完成基于蓝鲸的CICD需要以下几步:

获取账号的KEY和ID

  1. 登陆腾讯云控制台打开访问管理,地址:https://console.cloud.tencent.com/cam/overview,如下图
  2. 从左边栏进入 访问密钥 - API密钥管理,点击新建密钥(如已有密钥,可直接使用)

申请构建机

由于Serverless Framework部署云函数到腾讯云走的公网接口,所以构建机需要申请带公网设备,可以找运维协助。

设备申请好后,可以按照如下步骤将构建机加入蓝鲸

安装nodejs环境

1、SF框架需要nodejs最低V10版本,所以下载最新nodejs linux安装包、解压并移动到/usr/local目录下

代码语言:javascript复制
[root@VM_75_248_centos ~]# wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz
[root@VM_75_248_centos ~]# tar xf node-v14.15.1-linux-x64.tar.xz
[root@VM_75_248_centos ~]# mv node-v14.15.1-linux-x64 /usr/local/node

2、配置PATH环境变量,并用source命令生效配置

代码语言:javascript复制
[root@VM_75_248_centos ~]# echo 'export PATH=$PATH:/usr/local/node/bin' >> ~/.bashrc
[root@VM_75_248_centos ~]# source ~/.bashrc

3、验证node是否安装成功

代码语言:javascript复制
[root@VM_75_248_centos ~]# node -v
v14.15.1

部署Serverless Framework

代码语言:javascript复制
[root@VM_75_248_centos ~]# npm install -g serverless
[root@VM_75_248_centos ~]# sls -v
Framework Core: 2.11.1
Plugin: 4.1.2
SDK: 2.3.2
Components: 3.3.1

根据命令执行结果,可见已安装成功。

在蓝鲸添加构建机

  1. 打开蓝鲸的环境管理,选择节点
  2. 在打开的界面选择第三方构建机,打开如下弹窗。根据申请的测试机信息,选择机型、地点等。

根据弹窗:

  1. 选择机器的系统,不同操作系统安装命令和安装方法不一样;
  2. 复制安装 Agent 的命令,在你的构建机的目标工作空间中执行该命令,进行 Agent 的下载和安装
  3. 安装完 Agent 以后,点击刷新,刷新出节点,点击导入即可。
  4. 在申请的测试机上面执行上图中的命令
  5. 执行完之后,点击第二步团创中的刷新,测试机就会出现在已连接的节点,点击倒入即可完成构建机导入。

构建流水线

  1. 打开搭建的蓝鲸平台中的流水线
  2. 本流水线主要有以下两个stage
  1. 需要注意的是stage-2,选 按节点选择,找到添加的自定义构建机
  1. 下面的原子任务,是bash插件。脚本内容只需要输入sls deploy即可

多环境实现

配置多环境

当前SCF没有多环境的概念,我们可以结合sf框架,模拟多环境。关键参数如图

stage是关键,用stage代表环境

functionName中有一个变量,这里是必须的。如果没这个变量,则不同环境的函数会相互覆盖,导致多环境实际无效

src是指scf入口代码真正的路径

vpcConfig是配置网络的,如果需要不同环境间强隔离,可以考虑不同vpc

environment是配置云函数的调用API,建议和stage一致

搞清楚这些参数后,可以在不同代码分枝,建不同的配置文件,结合蓝盾,即可实现多环境

多环境结果

多环境建设OK后,在Serverless Framework管理界面,可以看到如下结果

在scf控制台可以看到如下结果

与自己业务打通

scf如需访问自己传统业务,只需要修改serverless.yml文件中网络配置部分。

  1. 开发一个接口,其中会调用自研接口
代码语言:javascript复制
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
import requests, json
# Create your views here.

def index(request):
    d = requests.post('http://0.0.0.0/test_api/search_api/', data=json.dumps({'id': 398137}))
    return JsonResponse(d.json())
  1. release环境,未配置网络
  1. 发布release环境后,浏览器访问接口
  1. 在test环境增加自研vpc网络配置
  1. 浏览器访问验证,已经可以看到接口返回值了

接下来的使用方向

从云函数目前应用场景来看,主要适合实时文件处理、数据处理等场景,大流量场景用的不多,比较类似Python类的胶水语言:聚合各种接口或连接各种系统。但随着系统流量增大、承担的功能越来越重要,需要在下面几个方面实践和调研。

可用性架构输出

从官网介绍来看,小程序已具备可用区容灾、弹性自动扩容能力;借助API Gateway,可以实施流控及状态码监控。接下来可以借助这些能力做可用性架构测试。

开发流程闭环

当前使用云函数,主要是开发人员负担起了测试、灰度、上线等任务,加上函数代码本身比较简单,所以开发速度非常快。但对于一个完整的应用或子系统,如何协作,构建从开发、测试、灰度、上线的全生命周期的管理,也是接下来需要探索的一个问题。

持续运营能力

目前云函数主要的监控是控制台的调用次数,主要的日志功能就是控制台看日志。服务为维度的管理中积累的优秀监控实践、日志系统实践,目前都还不具备,如果想要有更多的核心场景使用云函数,这些能力要尽快完善。

Serverless未来发展趋势的思考

前端赋能

从高德的使用场景来看(出行界面的相关推荐功能使用的是Serverless),在使用Serverless前,推荐相关聚合接口由后端开发(Back-end For Front-end模式),容易形成厚的BFF层。使用Serverless后,转变为前端开发(Serverless For Front-end模式),借助于函数级别的管理模式,也解决了厚BFF层的问题。

随着Serverless生态完善,可以预料会极大解放前端生产力,前端工程师可以承担一部分后端的工作。

简化后端

Serverless的一个特性是自动扩缩容,即在单函数无法承载算力或并发要求时,自动扩充更多实例。那像传统的生产者、消费者模型可以省略了消息层,生产者直接调用消费者,而不需要考虑消费者不够用的情况;再比如多进程编程,借助Redis等设施,也直接可以省略了多进程编程,直接调用云函数即可。

随着基础设施的完善,可以预料后端的设计模式会有新的突破,传统的设计模式会变的更加简单。

驱动基础架构升级

Serverless一个特性是零运维。零运维我的理解是目标,对于实际的it环境,往往有若干环境,若干环境中有不同的基础设施,如dns,Serverless架构如何在没有运维的情况下,Serverless怎么和各环境无缝对接而开发无感,是一个需要考虑的问题。一个可行的点是Serverless和基础网络联动。

另一个特性是自动扩缩容。作为平台服务来讲,客户越多,那客户的行为具有更大的不可预测性,自动扩容的及时性、冗余资源的预测算法,都需要更多考量。

这些问题都对我们当前的基础架构引入了新的问题和挑战。

0 人点赞