OpenYurt v0.4.0 新特性发布:高效地管理边缘存储资源

alicloudnative阅读(1916)评论(0)

简介: OpenYurt 是由阿里云开源的基于原生 Kubernetes 构建的、业内首个对于 Kubernetes 非侵入式的边缘计算项目,目标是扩展 Kubernetes 以无缝支持边缘计算场景。它提供了完整的 Kubernetes API 兼容性;支持所有 Kubernetes 工作负载、服务、运营商、CNI 插件和 CSI 插件;提供良好的节点自治能力和云边协同能力。OpenYurt 可以轻松部署在任何 Kubernetes 集群服务中,让强大的云原生能力扩展到边缘。

头图.png

作者 | 高文俊
来源|阿里巴巴云原生公众号

简介

OpenYurt 是由阿里云开源的基于原生 Kubernetes 构建的、业内首个对于 Kubernetes 非侵入式的边缘计算项目,目标是扩展 Kubernetes 以无缝支持边缘计算场景。它提供了完整的 Kubernetes API 兼容性;支持所有 Kubernetes 工作负载、服务、运营商、CNI 插件和 CSI 插件;提供良好的节点自治能力和云边协同能力。OpenYurt 可以轻松部署在任何 Kubernetes 集群服务中,让强大的云原生能力扩展到边缘。

边缘本地存储


OpenYurt v0.4.0 版本推出全新特性:边缘本地存储管理,用于高效地管理边缘节点的存储资源,用户可以通过 ConfigMap 来动态配置集群内节点的本地资源,并能无缝对接 CSI 存储插件,通过原生的 PV/PVC 方式使用本地存储。

该项目组件主要包含两个部分, 一个是定义在集群中 kube-system namespace 的 node-resource-topo ConfigMap, 一个是部署在集群中 kube-system namespace 下面的 node-resource-manager Daemonset, 每个 Node 节点上的 node-resource-manager 通过挂载 node-resource-topo ConfigMap 的方式生产并管理用户定义的本地资源。架构如下:

1.png

主要优点:

  • 简单易用:node-resource-manager 可以仅通过定义 ConfigMap 就完成对集群中的本地资源的初始化和更新。
  • 易于集成:node-resource-manager 可以与 csi 插件集成来完成 kubernetes 集群中的相关本地资源的生命周期管理。
  • 与云平台无关:node-resource-manager 可以轻松部署在任何完全兼容 Kubernetes API 的集群中。

关于边缘本地存储设备管理的详情和使用方法,请参考 configmap.md:
https://github.com/openyurtio/node-resource-manager/blob/main/docs/configmap.md

IOT 设备管理 API

阿里联合 VMware 在 OpenYurt 社区推出了 IOT 边缘设备管理的 API 标准定义,API 基于 Kubernetes 的 CRD(custom resource definitions)模型实现。任何边缘平台只需实现对应 CRD Controller,即能通过这些 API 接入 OpenYurt 集群,完成面向终态的设备管理。

未来我们将继续基于 OpenYurt + EdgeX Foundry 来进行 IOT 等边缘场景下的探索,共建统一 API 下的多场景设备接入、使能和融合能力,打造云原生 IOT 领域标准。

关于 API 定义,请参考《Proposal: managing edge devices by integraing Edgex Foundry into OpenYurt》:
https://github.com/openyurtio/openyurt/pull/236

支持 Kubernetes 1.18 版本


OpenYurt 正式支持 Kubernetes 1.18 版本,用户可无缝转换 Kubernetes 1.18 集群至 OpenYurt 集群,并使用 1.18 版本的 API 和新特性。

更多特性

未来计划​

OpenYurt V0.4.0 版本发布,提供了边缘本地存储管理,边缘 IOT 设备管理等全新能力,并发布了 Kubernetes 1.18 版本的支持,以及一系列扩展能力和优化。未来 OpenYurt 社区会在本地存储项目提供存储调度能力,在 IOT 设备管理领域持续投入和探索演进,在社区治理和贡献者体验方面加大建设力度,同时也非常欢迎有兴趣的同学加入参与共建,共同打造一个稳定、可靠的云原生边缘计算平台。

更多社区详情请关注:https://github.com/openyurtio/openyurt

相关链接

dubbo-go v3 版本 go module 踩坑记

alicloudnative阅读(1700)评论(0)

头图.png

作者 | 董剑辉、盛傲飞
来源 | 阿里巴巴云原生公众号

问题背景


该问题源于我们想对 dubbo-go 的 module path 做一次变更,使用 dubbo.apache.org/dubbo-go/v3 替换之前的 github.com/apache/dubbo-go

首先,我们做了路径映射,在 dubbo.apache.org 下放置了一个 dubbogo/v3 文件,内容如下:

<html>
  <head>
    <meta name="go-import" content="dubbo.apache.org/dubbo-go/v3 git <https://github.com/apache/dubbo-go>">
    <meta name="go-source" content="dubbo.apache.org/dubbo-go/v3 git <https://github.com/apache/dubbo-go/tree/3.0{/dir}> <https://github.com/apache/dubbo-go/blob/3.0{/dir}/{file}#L{line}>">
    <meta http-equiv="refresh" content="0; url=https://pkg.go.dev/dubbo.apache.org/dubbo-go/v3">
  </head>
  <body>
    <p>Redirecting to <a href="<https://pkg.go.dev/dubbo.apache.org/dubbo-go/v3>">pkg.go.dev/dubbo.apache.org/dubbo-go/v3</a>...</p>
  </body>
</html>


其次,我们修改了 go.mod 的 module 和对应的所有 import,并修改了所有子模块引用 dubbo-go 使用的 module 路径。

问题分析


在做完上述的修改后,我们提 PR 时,发现 CI 失败,经过进一步的日志排查,我们确定是 CI 在跑集成测试时发生了错误,具体的错误提示信息如下:

1.png

这一段的执行逻辑是希望利用 docker 对 dubbo-go 中的集成测试内容构建镜像,并启动容器进行测试,该镜像打包所用的 Dockerfile 路径在 github.com/apache/dubbo-go/test/integrate/dubbo/go-server 目录下,对照错误日志的 STEP 标识,我们可以定位到具体错误发生下面的两个步骤:

# ...

# STEP 9
RUN test ${PR_ORIGIN_REPO} && go mod edit -replace=dubbo.apache.org/dubbo-go/v3=github.com/{PR_ORIGIN_REPO}@${PR_ORIGIN_COMMITID} || go get -u dubbo.apache.org/dubbo-go/v3@develop


# ...


# STEP 11
RUN go mod tidy && go install github.com/apache/dubbo-go/test/integrate/dubbo/go-server


在 STEP 9 中,我们使用 go mod edit -replace 替换了 dubbogo 的依赖路径,将其替换为发起 PR 请求的仓库地址和 commit id。在此基础上,当镜像构建跑到 STEP11 ,尝试使用 go mod tidy 拉包时发生了错误。

回过头查看错误日志,我们可以发现:

2.png

由于我们只指定了 commit id,因此在 go mod 实际运行过程中,它会为我们生成一个假定版本号(关于假定版本号的更多说明可以查看本文最后的问题拓展),这个假定版本号抓取远程仓库的最新有效 tag 为 v1.4.1【注:此处远程仓库为 github.com/Mulavar/dubbo-go,这是我自己的 dubbo-go 分支,该分支拉取 fork 的时间比较早,其最后 tag 是 v1.4.1】,并自增为 v1.4.2,主版本是 v1。但在先前,我们的 dubbogo module path 是声明为 dubbo.apache.org/dubbogo/v3,主版本是 v3,这导致了 go mod edit -replace 前后的依赖主版本分别是 v3 和 v1 ,出现了不一致,实际拉取 dubbogo 依赖的时候出错。

问题解决


在问题分析一节中我们定位到这个问题在镜像构建的 STEP 9,即:

# STEP 9
RUN test ${PR_ORIGIN_REPO} && go mod edit -replace=dubbo.apache.org/dubbo-go/v3=github.com/{PR_ORIGIN_REPO}@${PR_ORIGIN_COMMITID} || go get -u dubbo.apache.org/dubbo-go/v3@develop


这一步,我们使用 go mod edit -replace 时将一个 v3 版本的 go module 替换成了一个 v1 版本的 module,导致主版本不一致发生错误,因此我们只需在替换依赖路径时指定替换后的 module 主版本也为 v3 即可,我们在 go mod edit -replace 后的模块依赖路径后也加上 v3 后缀如下所示。

修改前:

go mod edit -replace=dubbo.apache.org/dubbo-go/v3=github.com/{PR_ORIGIN_REPO}@${PR_ORIGIN_COMMITID}

⇒ 修改后:

go mod edit -replace=dubbo.apache.org/dubbo-go/v3=github.com/${PR_ORIGIN_REPO}/v3@${PR_ORIGIN_COMMITID}

修复该问题后我们提交代码查看 CI,在 STEP 8 打印的日志信息中,可以看到替换后的 dubbogo 路径多了 v3,并且在拉包的时候跟的版本号(v3.0.0-20210509140455-2574eab5ad0b)主版本同样是 v3,成功拉取了依赖。

3.png

问题拓展

1. Semantic Import Versioning


在我们使用 Go modules 去构建项目的依赖关系时,对 go 项目的依赖都需要声明我们所使用的版本号,考虑到每次发布新版本时,兼容一直是开发者最为重视和头痛的问题,因此 go 通过语义导入版本控制(Semantic Import Versioning)来制定版本号的标准,来确保每个开发者能够根据自己的项目需求指定使用的依赖版本。根据 go 的语义导入版本控制准则,版本号由三部分构成:

4.png

注:上图及以上部分内容参考自《Go Modules 详解》一文。

其中 Major version 表示这是一个新的大版本,甚至这个新版本可能和旧版本是不兼容的。

而 Minor version 则表示这是一个大版本中的迭代,主要用于新增 feature 时递增。

Patch version 则是粒度最细的版本更新,表示一些 bug 的修复。

而指定主版本则有两种方式,一种是如上的直接声明,另一种则是在项目路径的最后加上版本后缀,如 dubbogo 3.0 版本声明的 module 则是 dubbo.apache.org/dubbo-go/v3,其中 v3 就是一个主版本的声明。

2. pseudo-version


Go 在使用依赖时推崇我们指定明确的版本号,比如 dubbogo 的 go.mod 中声明的对 cloud.google.com/go 的依赖:

5.png

但考虑到在某些场景下,我们想要使用模块依赖的某个未发版的版本(该模块只有一个已知的 commit id),如 dubbogo 声明的 github.com/Microsoft/go-winio 依赖,就可以使用一个假定版本号(pseudo-version)去替代真实的版本号。假定版本号的格式为:

// (1) vX.0.0-yyyymmddhhmmss-abcdef123456
// (2) vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456
// (3) vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdef123456+incompatible
// (4) vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456
// (5) vX.Y.Z-pre.0.yyyymmddhhmmss-abcdef123456+incompatible


可以看到 pseudo-version 被短斜杠分为三部分,其中第一部分 X.Y.Z 与 4.1 节提到的一致,分别是 major versionminor versionpatch version,而第二部分是一个格式为 yyyymmddhhmmss 的时间戳,第三部分是一个 12 位的 commit hash,可以手动指定,如果没有,则由 go 自动生成。

关于 pseudo-version,go 的生成规则如下:

  • 查询该项目对应主版本(若项目依赖路径没有显式的 v2/v3 后缀,则默认为 v1 版本)的最新 tag。
  • 有 tag 则使用最新 tag 递增 patch version。
  • 无 tag ,根据项目路径带的后缀版本号自动生成(如 v3 则自动生成一个 3.0.0 开头的 pseudo-version)。

遵循这个规则,回头看前文的问题分析和问题解决,我们就可以明白为什么在一开始 dubbo-go 的 pseudo-version 是 v1.4.2,这正是因为 go 认为 replace 后的 dubbogo 依赖主版本是 v1,去查找了该主版本下的最新 tag,并递增了 patch version,从而导致前后主版本不一致,当我们对版本路径加上 v3 后,go 查找不到对应主版本下的 tag,为我们自动生成了 v3.0.0,从而通过了 CI 。

3. Go 模块嵌套


和 Java 不同,go 其实是没有子模块概念的。即使有些时候,我们会看到有个 repo 里有多个 Go modules,比如项目的根目录有一个 go.mod ,里面有些子目录里又有 go.mod 。

这在 Go modules 被称为嵌套模块,而非父子模块,即两个模块没有任何关系,是相互独立的

那什么时候才需要单 repo 多模块呢?一般来说,碰到以下两种情况我们才会考虑使用单 repo 多模块的开发形式。

  1. 某个嵌套模块变动非常频繁,需要经常发版。
  2. 当中的嵌套模块仅仅依赖某个固定版本的根模块。

两种情况其实本质都是两个模块之间没什么强的版本绑定关系,但是由于一些其他原因需要放在一个 rpeo 下,因此形成了单 repo 多模块的局面。

4. dubbogo 静态映射文件内容解析


dubbo-go 使用了静态文件映射的方式实现了模块重定向,静态文件的内容如下:

其中的核心部分是 meta 标签 go-import 和 go-source

<html>
  <head>
    <meta name="go-import" content="dubbo.apache.org/dubbo-go/v3 git <https://github.com/apache/dubbo-go>">
    <meta name="go-source" content="dubbo.apache.org/dubbo-go/v3 git <https://github.com/apache/dubbo-go/tree/3.0{/dir}> <https://github.com/apache/dubbo-go/blob/3.0{/dir}/{file}#L{line}>">
    <meta http-equiv="refresh" content="0; url=https://pkg.go.dev/dubbo.apache.org/dubbo-go/v3">
  </head>
  <body>
    <p>Redirecting to <a href="<https://pkg.go.dev/dubbo.apache.org/dubbo-go/v3>">pkg.go.dev/dubbo.apache.org/dubbo-go/v3</a>...</p>
  </body>
</html>

1)go-import


go-import 的作用,是告诉 go get 去哪儿可以找到源码,content 分为三部分:

  • dubbo.apache.org/dubbo-go/v3:这个项目的 module 声明。
  • git:使用的版本控制工具。
  • <https://github.com/apache/dubbo-go>:告诉 go get 这个项目应该去哪儿找源代码。

2)go-source


go-source 的作用,则是给项目生成具体的 go doc(现为 pkg.go.dev ) 文档,一共有 4 部分,前两部分和 go-import 一样,是该项目的 module 声明和版本控制工具,后两部分则分别起如下作用:

  • <https://github.com/apache/dubbo-go/tree/3.0{/dir}>:声明该项目的源代码所在位置。
  • <https://github.com/apache/dubbo-go/blob/3.0{/dir}/{file}#L{line}>:映射文档和代码,帮助我们在点击文档的目录树时,可以跳转到对应的具体内容。

比如在 https://pkg.go.dev/dubbo.apache.org/dubbo-go/v3 上,我们点击其中一个文件:

6.png

就会跳转到对应文件对应的文档。

7.png

欢迎对 apache/dubbo-go 项目有兴趣的同学搜索钉钉群号 31363295,加入钉钉交流群!

参考资料

作者简介


董剑辉(github @Mulavar),刚从 浙江大学 VLIS 实验室毕业,目前在任 猿辅导 服务端开发工程师。

盛傲飞(github @aofei),goproxy.cn 项目作者,曾给 go 源码【如 mod 工具】提交过很多 PR。

携手共建云原生||2021云原生产业大会谐云精彩回顾

谐云阅读(1745)评论(0)

5月26日, 2021云原生产业大会在北京正式举办。云原生产业大会由中国信息通信研究院主办,中国信通院云计算开源产业联盟、中国信通院云原生产业联盟、云原生计算基金会(CNCF)支持。
来自云原生领域的顶级专家、国内外IT巨擘、云原生头部企业等近1000位嘉宾齐聚一堂,分享前沿的云原生技术与实践,共同探讨云原生发展趋势,为云原生未来发展指明方向。
谐云作为国内最早一批进行云原生底层技术研究和行业落地的厂商,在云原生方面积累了丰富的技术成果和实践经验。2021云原生产业大会,谐云在多项成果上交出了满意答卷。
1.中国工程院院士陈纯视频致辞

本次云原生大会特邀浙江大学陈纯院士进行开场致辞,陈院士在致辞中指出了云原生发展的重要性,并从三个方面分析了云原生产业发展的意义和趋势:从技术特征来看,云原生具有极致的弹性能力、故障自愈能力以及大规模可复制能;从应用价值来看,云原生实现了异构资源标准化,加速了数字基础设施升级,提升了业务应用的迭代速度;从产业融合来看,云原生为其他信息技术大规模应用提供了重要支撑。

陈纯院士还提到,云计算正面临重要发展机遇,抓住机遇实现核心技术的突破与产业的发展离不开人才的培育。浙大曾是云计算领域云原生行业的黄埔军校,为云原生行业输送了大量顶尖人才。谐云的创始团队也是来源于浙大并深根浙大,正在践行云原生时代的使命担当。

 

2.谐云与上汽集团共建的网络安全应急平台荣获云原生优秀案例
云原生优秀案例评选作为此次大会的亮点于今日揭晓。云原生优秀案例的评选标准从企业规模与应用范围、云原生应用架构、结合行业特色的云原生服务特点、应用/技术创新点、应用效益以及企业资质等维度进行,评选出云原生应用方面成功实践的企业,特别是将传统应用架构重构为云原生应用架构的实践案例。谐云与上汽集团携手打造的网络安全应急响应平台项目荣获云原生优秀案例。谐云根据上汽集团的特性和需求,使用微服务、DevOps及低代码集成技术,完成云原生架构升级的落地,助力上汽集团全面实现云原生化,实现降本增效,是谐云在汽车行业的又一经典标杆案例。

3.谐云专家助力云原生行业及DevOps工作组

云原生成熟度高级专家授牌

谐云CTO苌程受聘担任云原生成熟度高级专家,在本次大会上,信通院云计算与大数据研究所所长何宝宏为专家组颁发聘书。

云原生产业联盟DevOps工作组专家授牌

谐云产品总监林科受聘担任云原生产业联盟DevOps工作组专家并领取聘书。

 

谐云自2011年开始云原生底层技术的研发和实践,团队有不可多得的实践及技术人才,持续不断的为云原生的落地和实践进行推广。
4.《云计算开放应用架构》联合发布
会上,由阿里云计算有限公司、杭州谐云科技有限公司、中国信息通信研究院等 10 余家单位联合发起的《云计算开放应用架构》标准文件在“云原生产业大会”现场发布。该架构以阿里云、微软云联合发起的开源项目“开放应用架构模型”为实现基础,旨在为云端应用管理者提供统一的应用描述规范及开放应用程序能力管理框架,以期推动简洁、高效、可控的云原生应用管理与交付方式在更多行业和企业中的大规模落地。
作为核心发起单位代表,阿里云云原生产品研发负责人李小平表示:开放、标准、敏捷是云原生技术得以快速发展的关键。云原生正在帮助企业打通数字化落地的‘最后一公里’,在这样的关键节点下,需要全行业的共同定义和建设。
谐云一直致力于帮助企业进行数字化改革和实践,本次受邀联合发布《云计算开放应用架构》,谐云将继续深度参与云原生行业生态建设,分享云原生落地实践和经验。
5.“后Kubernetes时代的云原生技术探索和实践分享

在云原生基础设施分论坛上,谐云云原生平台产品总监徐运元分享了后Kubernetes时代的云原生技术探索和实践。谐云在长达九年的技术自研道路上,坚持创新,积极探索,勇于实践,开发出了EBPF、中间件平台、边缘计算平台等产品,推出了针对各个行业的云原生解决方案,已经助力百余家企业成功实现云原生落地,全面拥抱云原生。

 

本次会议,谐云在多方面得到了来自行业、客户和专家们的肯定和认可。未来,谐云将继续秉承“底层核心技术+ 超前发展理念”,推动云原生技术创新和产业发展,为数字中国建设贡献力量。

Serverless Devs 的官网是如何通过 Serverless Devs 部署的

alicloudnative阅读(1702)评论(0)

作者 | 江昱
来源 | 阿里巴巴云原生公众号

只有自己吃自己的狗粮,自己做的东西才不“🐶”。Serverless Devs 自发展之处到现在,已经经历了几个月的时间,在这几个月,Serverless Devs 的成长是迅速的,这很大一部分的原因是“我们在吃自己的狗粮”,我们相信,如果自己都用不爽的东西,大家一定很难用的起来。

今天这篇文章,是一个关于 Serverless Devs 官网建设的文章,文章很简单,也很有趣。

什么是 Serverless Devs?


「Serverless Devs」是由阿里云开源的 Serverless 开发者平台,致力于为开发者提供强大的工具链体系。通过该平台,开发者可以一键体验多云 Serverless 产品,极速部署 Serverless 项目。Serverless Devs 让开发者以更短的路径体验到多个主流云厂商 Serverless 产品,以更快的速度创建和部署 Serverless 应用,以更简单、更自动化的方法进行项目管理和运维,Serverless 项目通过该平台完成全自动化后,可节省 99.9% 的管理成本。

Serverless Devs 与 Docusaurus


众所周知,开源项目的官网不宜太复杂,其实简简单单的就好,所以我们经过了很长时间的对比,最终选择了 Docusaurus 作为官网的框架选型。那么问题来了,我们选型结束之后,我们要如何来建设官网?

经过一些简单的调研,我们决定用 Serverless Devs 建设 Serverless Devs 官网,并将其部署到 Serverless 架构上,很绕嘴是吧?但是,这个过程却真的很“经典”:

我们通过 Serverless devs 初始化了 Docusaurus:s init devsapp/website-docusaurus,这一部分可以参考文档:https://github.com/devsapp/website-example

讲真,虽然也就是一行代码的事情,但是整个初始化还是比较“赏心悦目”的,作为一个 Serverless 应用全生命周期的工具,Serverless Devs 在脚手架和引导层面还是下了很多功夫的:

1.png

可以看到,初始化的时候,系统引导式的让我们填写了项目名,存储桶名,以及需要的密钥信息,同时完成之后,还告诉我们:

You could [cd /Users/jiangyu/Desktop/start-fc/website/serverless-website] and enjoy your serverless journey!


感觉还是很贴心的。

接下来,按照指引:

2.png

可以看到帮助文档:

3.png

当执行 s website-starter -h 之后,首次运行帮助信息,可能涉及到组件加载过程,稍等片刻,可以看到帮助信息:

4.png

此时,我们要将项目部署到线上,只需要执行 s deploy 即可。

当然,我们还需要对项目进行一定的配置,以及对我们的官网进行一定的建设。

关于网站建设,可以参考 Docusaurus 的官网文档,关于 Serverless Devs 的 website 组件配置,可以参考上图给我们 🧭 More information: https://github.com/devsapp/website

5.png

在文档中可以了解更多的配置内容,最终生成我们的 s.yaml:

edition: 1.0.0
access: website_access

services:
  website:
    component: devsapp/website
    actions:
      pre-deploy:
        - run: npm install
          path: ./
        - run: npm run build
          path: ./
    props:
      bucket: serverless-devs-website
      src:
        codeUri: ./
        publishDir: ./build
        index: index.html
        subDir:
          type: index
      region: cn-hongkong

CD 与 Serverless Devs


当我们建立好了网站页面,在本地也可以正常运行,通过本地的 s deploy 也可以顺利部署了,这个时候面临了新的问题:我如何更新我的网站?每次都要手动的在本地发布么?是否可以利用 Github Action,接入自动化的能力呢?

所以:

name: Website Publish

on:
  push:
    branches: [ master ]

jobs:
  publish-website:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 12
          registry-url: https://registry.npmjs.org/
      - run: npm install
      - run: npm install -g @serverless-devs/s
      - run: s config add --AccountID ${{secrets.ALIYUN_ACCOUNT_ID}} --AccessKeyID ${{secrets.ALIYUN_ACCESS_KEY_ID}} --AccessKeySecret ${{secrets.ALIYUN_ACCESS_KEY_SECRET}} -a website_access
      - run: s deploy

此时我再 push 代码,就可以自动将网站发布出来了。

这里面的核心点如下所示:

  1. 安装 Serverless Devs:run: npm install -g @serverless-devs/s
  2. 配置密钥信息:run: s config add –AccountID ${{secrets.ALIYUN_ACCOUNT_ID}} –AccessKeyID ${{secrets.ALIYUN_ACCESS_KEY_ID}} –AccessKeySecret ${{secrets.ALIYUN_ACCESS_KEY_SECRET}} -a website_access
  3. 部署:run: s deploy

整个效果:

6.png

部署后的页面:

7.png

这里要说明,此处配置密钥信息,使用了 Github 的 Secrets 功能,这个功能还是比较基础的,所以不多赘述,主要就是将发布的所需要的密钥信息配置到 Secrets 里面。

总结


其实,目前来说很多人的博客,部分的官网都是通过静态网站等进行部署,通过 Serverless Devs 走这一套还是比较方便的:

  • 得益于 Serverless Devs 的行为描述,我们可以更简单地将 npm install,npm run build 等指令集成到项目中。
  • 得益于 Serverless Devs 的引导能力,包括创建、入门,以及密钥配置时的获取链接,Serverless Devs 确实在不断的从细节出发,为便利而努力。
  • 得益于 Serverless Devs 的灵活性,只需要两三行代码,就可以配置出 Github 的 CD 能力,将网站持续发出去,个人觉得这个还是挺爽的。

当然,目前来看还是有一些问题等待去做的:

  • Serverless Devs 的场景还是有待丰富的。
  • 这个社区官网只有 CD,没有 CI 其实还是有一定风险的,要慢慢的完善起来。

程序员写好技术文章的几点小技巧

alicloudnative阅读(1431)评论(0)

头图.png

作者 | 门柳
来源 | 阿里巴巴云原生公众号

去年成为了内网技术分享平台的年度作者,受邀写一篇关于“如何写好文章”的文章。我本身并不喜欢写字,去年写的几篇文章,涉及的话题自带流量,所以阅读量多了一些,谈不上有多擅长。不过还是决定分享一下自己在写文章时用到的一些小技巧,希望对大家有帮助。

最重要的是内容


和所有人强调的一样,好文章最重要的是要有好的内容,好的技术文章要让读者有益。如果你想写一篇爆款文章,但是又觉得没有内容可写,那就不要勉强了,放下笔,合上电脑,有这个时间不如去看书打游戏。

如何让自己有源源不断的内容可写?这与平时的积累有关,多阅读,多思考,多写作,真正的技巧无外乎这些。方法论层面的东西不再赘述,我重点讲几个具体的小技巧,直接“授之以鱼”。

优秀文章的特点

1. 阅读量 ≠ 文章质量


有些文章标题比较吸引眼球,有些话题自带流量,有些内容的受众比较广,所以有很高的阅读量,但这并不代表文章本身的质量。

前几天无意翻到一篇《超长用户行为建模在躺平家居内容推荐中的应用实践》,我觉得写得不错,但是内容我完全看不懂,是专业领域的文章,受众不多,有上千的阅读量就已经很不错了。但是另一篇《如何画好一张架构图?》就有超过 3W 的阅读量。当然反例也有很多,就不再列举了。我自己写的几篇讲技术细节的文章,就没有讲技术对比、讨论技术发展的文章阅读量高。内容越专越细,能读下来的人就越少,但并不代表文章质量不高,反之亦然。

技术文章盲目追求阅读量和点赞数不是件好事,所以第一个小建议就是不要太关注阅读量和点赞数,写的文章对别人有用,才是最有成就感的。至于除了阅读量和点赞数以外,还有什么指标可以衡量一篇文章的好坏,欢迎大家留言讨论。

2. 文章要长长长长长长长长长长长长长长长(也别太长)


我翻了几篇阿里技术公众号里阅读量较高的文章,各种话题都有,风格差异很大,但是有一个共同点:文章写得很长。这并不代表文章写了很多字就是好文章,背后的真实含义是:好文章的内容足够丰富。

内容丰富详实,这是一篇好文章的必要条件。还有一个条件是要包含真正有价值的内容,不能含太多水分。

提供一个小技巧:如果你写了一篇文章但是觉得内容很单薄,可以先当成一篇笔记存起来,等有了更丰富的积累之后再整理成文章。扩展文章内容的方法,并不是添加无意义的空话套话,而是根据文章探讨的问题延展开来。

比如说介绍自己解决的一个老大难 Bug,可能真正修改的代码并没有几行,把过程讲出来也不过寥寥几段。这时候你就可以再分析一下 Bug 存在的原因,为什么一直拖到现在,再思考一下如何避免这类问题,遇到同类 Bug 怎样快速排查。这样自己想问题的角度更全面了,文章内容也更丰富了。

比如你想介绍一项自己在学的新技术,发现自己写的东西其实就是官方文档的简化版,去重之后几乎什么都不剩了。这时候不要再继续抄文档了,把自己的思考总结先记下来,继续学习技术,持续记录新的内容,有更全面的了解之后,再写文章。

3. 清晰的叙事结构


优秀的技术文章,结构一定是清晰的,有可能目录就代表了某个技术体系,或者代表了解决问题的思路。

优秀的内容 + 清晰的结构 = 好文章

能把技术问题讲清楚,就很考验表达能力,这是大部分程序员比较欠缺的。对于技术类文章,常见套路也不多,我简单介绍两类吧:

  • 线性叙事,逐步推进:适用于介绍排查问题的过程、分享设计思路、介绍项目的迭代进展。
  • 结构化叙事,层层展开:适用于讲规划、做总结、画大图、介绍一整套技术方案。

4. 线性叙事,逐步推进


对于这类文章,读者是应该按顺序一段一段看的,写的时候脑海中模拟读者的视角来写。这类文章的小技巧就是:模拟读者视角,设定一条主线,有节奏的向前推进。和讲故事差不多,每一步的推进要有逻辑,要保持思路不要断掉。

有时候稍微加点趣味也是不错的,比如《Flutter Widget 和 CSS 布局原理 PK》这篇文章,目标是分析 Widget 和 CSS 的设计差异,我把文章写成一场比赛,先介绍参赛选手,然后分了 5 个 Round 开始 Battle,然后是 Love&Peace,最后一个 Happy Ending。

另外一篇《记一次完整 C++ 项目编译成 WebAssembly 的实践》介绍了自己尝试新技术的心路历程,先介绍背景,再分析需求做拆解,然后讲尝试了什么方案,遇到了什么坑,又继续试其他方案,最终是什么结果。读起来比较流畅。

5. 结构化叙事,层层展开


除了按顺序看的,还有不按顺序看的文章吗?有的,尤其在专业的技术文章里很常见,大部分是“总-分”的结构,先讲整体框架,再分章节介绍各个部分。

比较常见的是那种总结型的文章,比如《平台建设的 7 大问题:蚂蚁AI平台实践深度总结》《救火必备!问题排查与系统优化手册》,就是翻阅性质的书,可以通读一遍,也可以只看其中一段,之后遇到相关的问题,根据目录跳着阅读。

对于文思泉涌的人,可以一口气把整篇文章写完。但实际情况是,很多时间被碎片化,可能还要引用一些专业内容,可能需要查资料,写文章的过程会被中断。这类文章不是一口气写完的,是先搭架子再填充完整的。其实写起来也很简单:先想好标题,再划分好目录结构,再一段一段的填充内容,最后再润色一下连接部分。文章可以不按顺序看,也可以不按顺序写。

我自己写的《关于浏览器、Weex、Flutter 的比较和思考》这篇文章就是先划分好了目录,再一点一点填充的,写文章的时间跨度也比较长,想起来一点写一点。

线性叙事是个链表,结构化叙事是树。

提升写作技巧


我初高中的时候比较喜欢看闲书,偶尔自己写点东西,但是我作文考得并不高,这里大言不惭地聊一下怎么写作文吧哈哈哈哈哈。只讲怎么写技术文章,并不能提升任何文学功底,但说不定能帮你避开一些小坑。

1. 碎片化记录,结构化整理


大部分人的问题是不知道该写什么,即使已经有足够的积累,有明确的话题要写,也不知道该如何下笔。这就要靠日常的积累了。

在平时工作的时候,可以建个文档库,把日常的一些琐碎的想法记录下来,随时写随时存。我是用手机的便签 App 随手记东西,比较喜欢它的语音转汉字功能,工作相关、生活相关,随时随地想起任何话题都可以记录下来。

在有了明确话题,准备写文章之前,先把各种碎片化的记录收集起来,形成一份“素材”文档,然后梳理文章脉络,把素材应用进去。操作起来很简单,刚开始的时候会遇到前后不通畅的问题,那就不要直接复制素材的内容,重新换个表达方式写出来。多练习练习就好了。

2. 刻意练习,先写再改


有了素材之后,平时可以专门练习写作能力,先写一小段话,明确的描述一个观点,然后不断修改。其实写周报就是一个很好的锻炼机会(现在不要求写了,自行练习),练习把做的事情描述清楚,说话的方式简单点,不要用太多高大上的词汇。最关键的部分在于:写完花五分钟再改一遍!读一下是否通顺,有没有把问题讲清楚。反复修改才是提升写作技巧的关键。

用周报举例有点奇怪,毕竟是邮件类型的东西,和写文章差别很大,还是不要乱改周报了,改自己以前写的文章吧。找一篇自己以前写的,内容很不错但是写得不太行的文章,重写一遍!这个过程既温习了技术,又锻炼了写作技巧。不要觉得无聊浪费时间,亲测很有效的。

3. 注意排版和语法细节


对于不拘一格的程序员来说,写出来的文章没有排版,就是家常便饭。不需要追求高级的排版技巧,稍微注意一下几个常见的问题就好了。

1)正确使用标点符号


大部分的文章里就只有逗号和句号,逗号和句号也是看心情随意划分,键盘上按到哪个是哪个。其实还有单双引号、顿号、冒号、分号、叹号、破折号、省略号、书名号、中文括号「」【】等等…… 使用方法可以去网上搜,这部分我觉得问题很常见,就单独多讲了两句。对了,中文文章要用全角标点符号,尽量不要混用英文标点符号。

2)添加多种展现形式,可参考 GitHub 的 Markdown 语法


如果全都是普通段落,看起来太平,可以加上无序列表、有序列表、段落引用、表格等等。行内排版可以加上粗体、斜体、代码标记等,偶尔还可以用删除线。

其他还有一些小的建议:

  • 区分大标题小标题,分配的均匀一些,最多不要超过三层。
  • 每个章节的长短也尽量均匀一些,太长的内容就拆个小标题。
  • 重要数据给出明确的数据源,扩展信息给出资料连接。
  • 中英文混写的时候,在中间加一个空格。
  • 注意英文的大小写,尤其是专业名词的缩写。
  • 英文喜欢长句,复合从句一层套一层;中文追求言简意赅,错落有致,可以多加标点符号,把长句分隔开。
  • 写完之后通读一遍,尽量少写错别字……

最后一个小技巧:多用图片。即使图片里只有文字,信息量也远超文字。

1.png

然而这篇文章并没有加很多图片,因为这并不是一篇技术文章,大家在讲技术原理的时候要多用图片,一图胜千言!

写在最后


最后一个小建议:文章写多了就可以逐渐形成自己的风格,让所有文章都保持某种共性。

比如我每篇文章最后都会发招聘信息!

欢迎优秀的你加入淘系技术部-跨平台技术团队!一起打造靠谱的跨平台方案。这里有手淘核心链路在使用的 DinamicX、淘系的 H5 容器、Weex、淘宝小程序容器。淘系的基础架构、研发支撑是隔壁的兄弟团队,我们在广泛的支撑新零售的业务。技术深度足够深,业务场景足够丰富,欢迎优秀的小伙伴来一起搞事情,手淘跨平台技术团队欢迎你的加入!(请联系 hanks.zh@alibaba-inc.com )

飞猪基于 Serverless 的云+端实践与思考

alicloudnative阅读(2101)评论(0)

头图.png

作者 | 王恒飞(承荫)
来源 | 阿里巴巴云原生公众号

本文整理自飞猪旅行前端技术专家–王恒飞(承荫)在【阿里云 Serverless Developer Meetup 上海站】上的分享。点击查看直播回放:https://developer.aliyun.com/live/246653

过去两年,飞猪前端一直在积极地进行 Serverless 建设和实践,2019 年 – 2020 年我们和集团 Node 架构组、研发平台一起完成了基础能力的建设和业务试点,成为集团率先落地 Serverless 实践的 BU,2020 年 – 2021 年我们开始大规模地在飞猪推广使用 Serverless 的能力,从导购全链路到核心中后台,都能够看到 Serverless 的身影,这一年我们完成了 Serverless 从业务试点到生产力工具的转变,本文将主要分享飞猪基于 Serverless 的实践成果以及未来想要做的事情。

Serverless 的使用规模


2020 年 – 2021 年飞猪 Serverless 的规模和重要度都有很大的变化,主要表现在三方面:

  • 一是函数组规模增长一倍以上,Qps 峰值增长 650%。
  • 二是使用 FaaS 开发的人员规模增长 560%,其中前端人员 80% 以上参与到 FaaS 的开发中。
  • 三是影响力的表现,目前不仅飞猪前端都对 Serverless 很熟悉,客户端也有很多人参与到 FaaS 的开发,更重要的是后端和产品同学也知道我们有 Serverless 进行服务开发的能力。

具体的数据如下:

1.png

为什么要引入 Serverless


飞猪为什么这么迫切地要引入 Serverless?这主要是出于前后端研发模式升级以及前端职能扩展的考虑,下面回顾一下飞猪前端架构的发展和研发模式的演进。

1. 飞猪前端架构的发展


飞猪前端架构总结下来就是从最初纯粹的前端开发,到解决多端一致性的跨端开发,再到接管视图服务端逻辑的前台开发,Serverless 就是前端升级转变的核心一环。

2.png

2. 研发模式的演进历程


前端人员为什么一定要参与服务侧开发?从前后端研发模式的演进来看,主要经历了以下三个大的阶段:

第一阶段是资源解耦,这个阶段前端把静态资源分离出来部署到 cdn,解决了和后端服务同机部署的耦合。

第二阶段是模板解耦,我们之前提到的前后端解耦大部分指的就是模板的解耦,一种不彻底的解法就是渲染解耦,服务端放一个空模板内容部分全靠 CSR,彻底的解法就是前端接管模板,可以独立部署模板也可以使用 node.js 替代。

第三个阶段就是试图解耦,一方面是由于客户端体系和前端的离线体系的限制,端侧对于视图的动态性要求极高,没有服务侧能力的前端只能将视图的动态性放在服务端做,另一方面由于端侧架构对于数据接口协议的特殊要求,需要服务端来进行协议的转换,也就是服务端常说的 Do 到 Vo 的处理,这就造成了前后端视图的耦合,为了去除这部分耦合,前端通过 Node.js 做 BFF 层来接管视图层的逻辑,Serverless 则是给了前端做 BFF 开发的最佳选择。

3.png

3. 为什么一定是 Serverless


其实在 Serverless 出现之前,前端也尝试了用 node 应用来做 BFF 层的开发,飞猪也是在 2017 年通过 Midway + React SSR 的架构将飞猪 PC 主链路首页、搜索、商品详情、订单详情 Node 化,但是应用级别的开发在前端存在以下几个问题:

  • 开发成本高:Node 应用级别的开发对于新手前端还是具备一定的开发成本,之前做过粗略的估计,上手成本至少需要 3 人/日,还不包括后续的性能优化、内存泄漏排查等一系列能力。
  • 运维成本高:Docker、镜像、机器日志查看、域名申请、机器替换等一系列运维能力对于前端来说具备非常高的复杂度,也是注定无法推广的一个重要原因。
  • 机器成本高:前端在使用应用开发时过度偏向于前端架构设计带来的应用离散和机器利用率低的问题,根本原因是前端在用页面开发的思维去做应用开发,导致新建一堆应用占用大量闲置机器。

2017 – 2019 年也是集团 Node 开发停滞的两年,这个阶段由于上述问题的闲置,Node 开发无法在移动端铺开,前端使用 Node 主要在中后台的开发,这时矛盾主要表现在前端迫切渴望研发模式转变和涉足服务端开发的高昂成本,直到 Serverless 浪潮的出现让我们看到了曙光,下面来看下 Serverless 能给前端带来什么样的变化:

4.png

Node FaaS 通过将中间件集成到 Runtime 的上下文中,开发通过 Api 的方式调用来实现极低上手和开发成本,只要会写 js 就能在 0.5 人/日内上手 FaaS 开发,同时 Serverless 容器底层通过机器统一管理、镜像统一、灵活调度、按需付费等方式向开发者屏蔽容器的运维,两者结合完美地帮我们解决了之前 Node 应用开发遇到的三大问题,至此前后端研发模式升级的最后一块拼图集齐,前端开始云+端的变革。

飞猪云+端的核心落地场景

1. 落地场景总览


从飞猪首页到搜索、频道,再到大促会场,Serverless FaaS 实现了在飞猪导购全链路的覆盖,成为飞猪前端的常用生产力工具之一。另外中后台开发已全面使用 FaaS 开发,并且赋能客户端同学,下图右侧的包体积平台就是飞猪客户端同学使用 Node FaaS 开发完成。

5.png

2. 云+端场景 – 数据协议处理


数据协议处理是 BFF 层最为常见的场景,包括接口合并、Do 到 Vo 的转换等,飞猪 80% 以上的 C 端 FaaS 场景都是用作数据协议的处理,通过 FaaS 来做协议转换能够解放服务端,同时增强前端对视图层的控制,可谓一举两得。

6.png

一个最新的例子(如下图所示),这是一个飞猪的内容详情页,页面涉及内容中台、评价中台、互动、算法等 5 个以上接口,这些接口都是现成的分散在各个系统,对于前端来说肯定是不想在端上调 5 次接口,不管是从性能还是架构设计上考虑,都是不合理的,这时就需要一个服务端接口的合并,FaaS 就非常适合做这样的事情,通过原子能力的拼装,无需服务端介入,极大缩短了需求的交付周期。

7.png

3. 云+端场景 – SSR 同构渲染


SSR 同构渲染并不是一个新的概念,最早在 React 支持 SSR 的时候,前端就具备一套代码在 Server 和 Client 端执行的能力,飞猪这边早在 2017 年就在 pc 端上线了 Midway + React SSR 的页面。

移动端由于流量比 PC 大很多,且在 Server 侧执行 Js 是一个极耗机器资源的操作,通过 Node 应用的方式做 SSR 机器和运维成本跟随着页面流量指数级上升,ROI 并不高,但是 Serverless FaaS 的自动托管,能帮前端解决机器利用率和运维成本的问题。

再配合客户端的文档预加载,我们可以做到客户端预加载直出率(500ms下)100%,端外渲染 2s 达标率 90+%,性能提升 80% 以上。

8.png

4. 云+端场景 – 一体化应用


一体化研发是一种更加符合前端人员习惯的开发模式,常见的分为中后台一体化和 Rax+FaaS 一体化,将 FaaS 代码和 Assets 代码在一个仓库下开发,调试和部署能够极大地提高开发效率,目前飞猪用得最多的就是中后台一体化开发。

9.png

Serverless 研发配套建设


在基础建设方面定义为两部分:研发态效率的提升运行时稳定性的保障

1. 研发态效率


开发阶段主要涉及的操作是新建项目、调试和发布,飞猪通过已有的 Clam 工程体系集成 FaaS 的脚手架模板,对接 def api 打通创建项目、迭代和发布的能力,让前端同学开发 FaaS 能有和开发页面一样的体验,降低上手和开发成本,同时封装 Mtop 调用和容灾 SDK,封装常用 FaaS Utils 集合的方式提高代码的复用度。

2. 运行时稳定性


通过函数监控 Alinode、网关监控 Sunfire 以及全链路日志的排查能力,做到问题的快速发现和定位。

10.png

通过 tair 容灾和 cdn 容灾,保障大部分场景在函数或者网关挂掉的情况下,仍能够正常展示页面。

未来


2020 年 – 2021 年我们完成了 Serverless 向生产力工具的转变,2021 年 – 2022 年总体来看是彻底完成飞猪研发模式转变的目标,让 FaaS 成为前后端都习以为常的一环,规划还没做具体,有以下几个关键的事情要做:

  • 中后台和长尾函数 0 – 1 的弹起尝试:这块考虑到一些中后台函数和长尾函数每天可能只有几十个 Uv 够不到 Qps 级别,目前预留 1 核机器的方式仍是有些浪费,考虑在不影响初次请求的情况下尝试 0 到 1 的弹起,做到机器的极致利用率。
  • 飞猪物理网关的替换:目前虽然飞猪 Java 的网关出于维护状态投入较低,但是一旦流量发生变化,网关的稳定性会成为瓶颈,希望能够有 Fc 专门的团队接管流量网关,之前飞猪也是完成了一个线上试点,2021 年 – 2022 年继续推进。
  • 研发态和运行时问题的可观测增强:从 FC 底层容器到函数代码内部再到函数依赖、流量网关,不管是部署出现的问题还是线上的问题,都比较难定位,通常需要拉着 FC、研发平台、Runtime 的同学一块排查,后续希望能推动可观测性的增强,让业务开发能够快速发现问题。

写在最后


基于 Serverless 的云+端结合已经基本成型,这将是前端近些年来最大的变革之一,未来 FaaS 将是前端开发不可或缺的一环,我们需要用它来做研发模式升级,也需要用它帮助前端扩大职能,通过 FaaS 的能力让前端开发深入到服务层,更好地贴近业务、理解业务、帮助业务。

作者简介


王恒飞(承荫),飞猪旅行前端技术专家,飞猪 Serverless 引进和实践者,探索和推动云+端的研发模式。

CNI 基准测试:Cilium 网络性能分析

KubeSphere阅读(3340)评论(0)

原文链接:https://cilium.io/blog/2021/05/11/cni-benchmark

作者:Thomas Graf

译者:罗煜、张亮,均来自KubeSphere 团队

Thomas Graf 是 Cilium 的联合创始人,同时也是 Cilium 母公司 Isovalent 的 CTO 和联合创始人。此前 Thomas 曾先后在 Linux 内核的网络、安全和 eBPF 领域从事了 15 年的开发工作。

注:本文已取得作者本人的翻译授权

大家好!👋

随着越来越多的关键负载被迁移到 Kubernetes 上,网络性能基准测试正在成为选择 Kubernetes 网络方案的重要参考。在这篇文章中,我们将基于过去几周进行的大量基准测试的结果探讨 Cilium 的性能特点。应广大用户的要求,我们也将展示 Calico 的测试结果,以便进行直接对比。

除了展示测试的结果数据外,我们还将对容器网络基准测试这一课题进行更深入的研究,并探讨以下几个方面的问题:

  • 吞吐量基准测试
  • 容器网络是否会增加开销
  • 打破常规:eBPF 主机路由(Host Routing)
  • 测量延迟:每秒请求数
  • Cilium eBPF 和 Calico eBPF 的 CPU 火焰图对比
  • 新连接处理速率
  • WireGuard 与 IPsec 加密开销对比
  • 测试环境

测试结果汇总

在详细分析基准测试及其数据之前,我们先展示汇总的测试结论。如果您希望直接了解测试细节并得出自己的结论,也可以跳过这一节的内容。

  • eBPF 起决定性作用:Cilium 在某些方面优于 Calico 的 eBPF 数据路径(Data Path),例如在 TCP_RR 和 TCP_CRR 基准测试中观察到的延迟。此外,更重要的结论是 eBPF 明显优于 iptables。在允许使用 eBPF 绕过 iptables 的配置环境中,Cilium 和 Calico 的性能都明显优于不能绕过 iptables 的情况。

    在研究具体细节后,我们发现 Cilium 和 Calico 利用 eBPF 的方式并不完全相同。虽然二者的某些概念是相似的(考虑到开源的性质,这也并不奇怪),CPU 火焰图显示 Cilium 利用了额外的上下文切换节省功能。这或许可以解释 TCP_RR 和 TCP_CRR 测试结果的差异。

    总体而言,从基准测试结果来看,eBPF 无疑是解决云原生需求挑战的最佳技术。

  • 可观察性、NetworkPolicy 和 Service:对于这个基准测试,我们把关注的焦点放在二者的共性上,也就是网络。这使得我们可以直接对比节点网络带来的性能差异。然而,在实际应用中也会需要用到可观测性、NetworkPolicy 和 Service,在这些方面 Cilium 和 Calico eBPF 数据路径差异巨大。Cilium 支持一些 Calico eBPF 数据路径不具备的功能,但即便是 Kubernetes NetworkPolicy 之类的标准功能,Cilium 和 Calico 的实现方式也不一样。如果我们投入更大的精力测试在这些更高级的用例中应用 eBPF,我们可能会发现二者在这些方面的性能有显著差异。然而,限于篇幅本文将不对此作更多的探讨,更加深入的研究将留给下一篇文章。

  • 对比 WireGuard 和 IPsec:有些令人意外,尽管 WireGuard 在我们的测试中能够实现更高的最大吞吐量,但 IPsec 在相同的吞吐量下 CPU 使用效率更高。这很有可能得益于 AES-NI CPU 指令集。该指令集支持卸载 IPsec 的加密工作,但 WireGuard 不能从中受益。当 AES-NI 指令集不可用时,结果就明显反转了。

    好消息是,从 Cilium 1.10 开始,Cilium 不仅支持 IPsec 还支持 WireGuard。您可以选择其中之一来使用。

吞吐量基准测试

免责声明:

基准测试难度很大。测试结果很大程度上依赖于运行测试的硬件环境。除非是在相同的系统上收集的结果,否则不应直接用绝对的数值进行比较。

让我们从最常见和最明显的 TCP 吞吐量基准测试开始,测量运行在不同节点上的容器之间的最大数据传输速率。

bench tcp stream 1 stream

上图显示了单个 TCP 连接可实现的最大吞吐量,最优的几个配置性能刚好超过了 40 Gbit/s。以上结果由 netperf 的 TCP_STREAM 测试得出,测试环境使用了速率为 100 Gbit/s 的网口以确保网卡不会成为瓶颈。由于运行单个 netperf 进程通过单个 TCP 连接传输数据,大部分的网络处理是由单个 CPU 核心完成的。这意味着上面的最大吞吐量受到单个核心的可用 CPU 资源限制,因此可以显示当 CPU 成为瓶颈时每个配置可以实现的吞吐量。本文后面将会进一步扩展测试,使用更多的 CPU 核心来消除 CPU 资源的限制。

使用高性能 eBPF 实现的吞吐量甚至略高于节点到节点的吞吐量。这令人非常意外。通常普遍认为,相较于节点到节点的网络,容器网络会带来额外的开销。我们暂时先把这个疑惑搁置一旁,进一步研究之后再来分析这个问题。

100 Gbit/s 传输速率所需的 CPU 资源

TCP_STREAM 基准测试的结果已经暗示了哪些配置可以最有效地实现高传输速率,但我们还是看一下运行基准测试时系统整体的 CPU 消耗。

bench tcp stream 1 stream cpu

上图显示了达到 100 Gbit/s 吞吐量整个系统所需的 CPU 使用率。请注意,这不同于前一个图中吞吐量对应的 CPU 消耗。在上图中,所有的 CPU 使用率都已折算为传输速率稳定在 100 Gbit/s 时的数值以便可以直接对比。上图中的条形图越短,对应的配置在 100 Gbit/s 传输速率时的效率越高。

注意:TCP 流的性能通常受到接收端的限制,因为发送端可以同时使用 TSO 大包。这可以从上述测试中服务器侧增加的 CPU 开销中观察到。

TCP 吞吐量基准测试的意义

虽然大多数用户不太可能经常遇到上述的吞吐量水平,但这样的基准测试对特定类型的应用程序有重要意义:

  • 需要访问大量数据的 AI/ML 应用程序
  • 数据上传/下载服务(备份服务、虚拟机镜像、容器镜像服务等)
  • 流媒体服务,特别是 4K+ 分辨率的流媒体

在本文后面的章节,我们将继续深入讨论测量延迟:每秒请求数新连接处理速率,以更好地展示典型微服务工作负载的性能特点。

容器网络是否会增加开销

在第一个基准测试的分析中我们提到,与节点网络相比,容器网络会带来一些额外开销。这是为什么呢?让我们从架构的角度来对比这两种网络模型。

container overhead

上图表明容器网络也需要执行节点到节点网络的所有处理流程,并且这些流程都发生在容器的网络命名空间中(深蓝色部分)。

由于节点网络的处理工作也需要在容器网络命名空间内进行,在容器网络命名空间之外的任何工作本质上都是额外开销。上图显示了使用 Veth 设备时,Linux 路由的网络路径。如果您使用 Linux 网桥或 OVS,网络模型可能略有不同,但它们基本的开销点是相同的。

打破常规:eBPF 主机路由(Host-Routing)

在上面的基准测试中,您也许会疑惑 Cilium eBPF 和 Cilium eBPF 传统主机路由(Legacy Host Routing)两种配置的区别,以及为什么原生的 Cilium eBPF 数据路径会比主机路由快得多。原生的 Cilium eBPF 数据路径是一种被称为 eBPF 主机路由的优化数据路径,如下图所示:

ebpf hostrouting

eBPF 主机路由允许绕过主机命名空间中所有的 iptables 和上层网络栈,以及穿过 Veth 对时的一些上下文切换,以节省资源开销。网络数据包到达网络接口设备时就被尽早捕获,并直接传送到 Kubernetes Pod 的网络命名空间中。在流量出口侧,数据包同样穿过 Veth 对,被 eBPF 捕获后,直接被传送到外部网络接口上。eBPF 直接查询路由表,因此这种优化完全透明,并与系统上运行的所有提供路由分配的服务兼容。关于如何启用该特性,请参阅调优指南中的 eBPF 主机路由

Calico eBPF 正在将一些类似的绕过方法用于 iptables,但这与 Cilium 的原理并不完全相同,文章后面会进一步介绍。不管如何,测试结果证明绕过缓慢的内核子系统(例如 iptables)可以带来极大的性能提升。

逼近 100 Gbit/s 的线速率(Line Rate)

在上文中,我们分析了只涉及一个 CPU 核心的基准测试结果。接下来我们将放开单核的限制,将 TCP 流并行化以运行多个 netperf 进程。

bench tcp stream 32 streams

注意:由于硬件有 32 个线程,我们特意选择了 32 个进程,以确保系统能够均匀地分配负载。

上图并没有提供十分有价值的信息,仅仅表明如果投入足够多的 CPU 资源,所有测试配置都能达到接近 100 Gbit/s 的线速率。然而,从 CPU 资源来看,我们仍然可以发现效率上的差异。

bench tcp stream 32 streams cpu

请注意,上图中的 CPU 使用率涵盖了全部的 CPU 消耗,包括正在运行的 netperf 进程的消耗,也包括工作负载执行网络 I/O 所需的 CPU 资源。然而,它并不包括应用程序通常需要执行的任何业务逻辑所带来的 CPU 消耗。

测量延迟:每秒请求数

每秒请求数与吞吐量指标几乎完全相反。它可以衡量单个 TCP 持久连接上按顺序的单字节往返的传输速率。此基准测试可以体现网络数据包的处理效率。单个网络数据包的延迟越低,每秒可处理的请求就越多。吞吐量和延迟的共同优化通常需要进行权衡。为了获得最大的吞吐量,较大的缓冲区是理想的选择,但是较大的缓冲区会导致延迟增加。这一现象被称为缓冲区膨胀。Cilium 提供了一个称为带宽管理器(Bandwidth Manager)的功能,该功能可以自动配置公平队列,可实现基于最早发出时间的 Pod 速率限制,并为服务器工作负载优化 TCP 栈设置,使吞吐量和延迟之间达到最佳平衡。

这个基准测试经常被忽视,但它对用户来说通常比想象的重要得多,因为它模拟了一种十分常见的微服务使用模式:使用持久化的 HTTP 或 gRPC 连接在 Service 之间发送请求和响应。

下图显示单个 netperf 进程执行 TCP_RR 测试时,不同配置的性能表现:

bench tcp rr 1 process

在这个测试中表现更好的配置也实现了更低的平均延迟。然而,这并不足以让我们对 P95 或 P99 延迟得出结论。我们将在未来的博客文章中探讨这些问题。

bench tcp rr 1 process cpu

我们进一步测试运行 32 个并行的 netperf 进程以利用所有可用的 CPU 核心。可以看到,所有配置的性能都有所提升。然而,与吞吐量测试不同的是,在本测试中投入更多的 CPU 资源并不能弥补效率上的欠缺,因为最大处理速率受延迟而非可用 CPU 资源限制。即便网络带宽成为瓶颈,我们也会看到相同的每秒请求数值。

bench tcp rr 32 processes

总体而言,结果非常鼓舞人心,Cilium 可以在我们的测试系统上通过 eBPF 主机路由实现近 1,000,000 请求每秒的处理速率。

bench tcp rr 32 processes cpu

Cilium eBPF 和 Calico eBPF 的 CPU 火焰图对比

总体而言,Cilium eBPF 和 Calico eBPF 的性能基本相同。这是因为它们使用了相同的数据路径吗?并不是。并不存在预定义的 eBPF 数据路径。eBPF 是一种编程语言和运行时引擎,它允许构建数据路径特性和许多其他特性。Cilium 和 Calico eBPF 数据路径差异很大。事实上,Cilium 提供了很多 Calico eBPF 不支持的特性。但即使是在与 Linux 网络栈的交互上,两者也有显著的差异。我们可以通过二者的 CPU 火焰图来来进一步分析。

Cilium eBPF(接收路径)

cilium flamegraph zoom

Cilium 的 eBPF 主机路由提供了很好的免上下文切换的数据传送途径(从网卡到应用程序的套接字)。这就是为什么在上面的火焰图中整个接收端路径能够很好地匹配到一张火焰图中。火焰图也显示了 eBPF、TCP/IP 和套接字的处理块。

Calico eBPF(接收路径)

Calico eBPF 接收端看起来却不太一样。虽然有着相同的 eBPF 处理块执行 eBPF 程序,但 Calico eBPF 接收路径穿过了额外的 Veth,这在 Cilium eBPF 数据路径接收端并不需要。

calico flamegraph zoom1

上图中的处理仍然在主机的上下文中执行。下面的这火焰图显示了 Pod 中被 process_backlog 恢复执行的工作。虽然这与 Cilium 场景下的工作一样(都是 TCP/IP+套接字数据传送),但因为穿过了 Veth 从而需要额外的上下文切换。

calico flamegraph zoom2

如果您希望自己进行更进一步的研究,可以点击以下链接打开交互式的火焰图 SVG 文件查看细节:

新连接处理速率

连接处理速率基准测试基于每秒请求数的基准测试,但为每个请求都建立了新的连接。此基准测试的结果显示了使用持久连接和为每个请求创建新连接两种方式的性能差别。创建新 TCP 连接需要涉及系统中的多个组件,所以这个测试是目前对整个系统压力最大的测试。通过这个基准测试,我们可以看到,充分利用系统中大多数的可用资源是可能的。

这个测试展示了一个接收或发起大量 TCP 连接的工作负载。典型的应用场景是由一个公开暴露的服务处理大量客户端请求,例如 L4 代理或服务为外部端点(例如数据抓取器)创建多个连接。这个基准测试能够在卸载到硬件的工作最少的情况下尽可能地压测系统,从而显示出不同配置的最大性能差异。

首先,我们运行一个 netperf 进程来进行 TCP_CRR 测试。

bench tcp crr 1 process

在单个进程下不同配置的性能差异已经十分巨大,如果使用更多的 CPU 核心差异还将进一步扩大。同时也可以明显看出,Cilium 再次能够弥补网络命名空间额外开销造成的性能损失并达到和基线配置几乎相同的性能。

bench tcp crr 1 process cpu

后续计划:这个 CPU 资源使用率让我们很惊讶并促使我们在接下来 1.11 的开发周期做进一步研究。似乎只要涉及到网络命名空间的使用,发送端的资源开销总是必不可少的。这一开销在所有涉及网络命名空间的配置中都存在,所以很有可能是由 Cilium 和 Calico 都涉及的内核数据路径造成的。我们会及时更新这部分研究的进展。

当并行运行 32 个进行 TCP_CRR 测试的 netpert 进程以利用所有 CPU 核心时,我们观察到了一个非常有意思的现象。

bench tcp crr 32 processes

基线配置的连接处理速率显著下降。基线配置的性能并没有随着可用 CPU 资源的增多而进一步提升,尽管连接跟踪状态表大小发生了相应变化并且我们确认并没有发生因连接跟踪表记录达到上限而导致的性能降低。我们重复进行了多次相同的测试,结果仍然相同。当我们手动通过 -j NOTRACK 规则绕过 iptables 连接跟踪表时,问题立刻解决了,基线配置性能恢复到 200,000 连接每秒。所以很明显,一旦连接数超过某个阈值,iptables 连接跟踪表就会开始出现问题。

注意:在这个测试中,Calico eBPF 数据路径的测试结果一直不是很稳定。我们目前还不清楚原因。网络数据包的传输也不是很稳定。我们没有将测试结果纳入考虑,因为测试结果不一定准确。我们邀请 Calico 团队和我们一起研究这个问题并重新进行测试。

鉴于我们使用的是未经修改的标准应用程序来处理请求和传输信息,每秒处理 200,000 连接是一个非常优秀的成绩。不过,我们还是看一下 CPU 的消耗。

bench tcp crr 32 processes cpu

这个基准测试结果显示了不同配置的最大性能差异。为了达到每秒处理 250,000 新连接的目标,整个系统必须消耗 33% 到 90% 的可用资源。

由于发送端 CPU 资源消耗一直高于接收端,我们可以确信相同资源下每秒能接收的连接数要大于每秒能发起的连接数。

WireGuard 与 IPsec 加密开销对比

可能所有人都会认为 WireGuard 的性能会优于 IPsec,所以我们先测试 WireGuard 在不同的最大传输单元(MTU)下的性能。

bench wireguard tcp 1 stream

不同的配置之间有一些差异。值得注意的是,Cilium 与 kube-proxy 的组合比单独 Cilium 的性能更好。然而,这个性能差异相对较小并且基本可以通过优化 MTU 弥补。

以下是 CPU 资源的消耗:

bench wireguard tcp 1 stream cpu

上述结果表明在 MTU 相同的情况下,不同配置之间的 CPU 使用率差异很小,因而可以通过优化 MTU 配置获得最佳性能。我们还对每秒请求数进行了测试,得到的结果也相同。感兴趣的读者可以参阅 Cilium 文档的 CNI 性能基准测试章节。

WireGuard 与 IPsec 对比

对 Wireguard 和 IPsec 的性能进行比较更加有趣。Cilium 支持 IPsec 已经有一段时间了。从 1.10 开始,Cilium 也开始支持 WireGuard。在其他方面相同的情况下,把这两个加密方案放在一起进行对比,结果一定会非常有趣。

bench wireguard ipsec tcp stream 1 stream

不出所料,WireGuard 的吞吐量更高,并且在两种 MTU 配置下,WireGuard 的最大传输速率更高。

下面继续测试当吞吐量达到 10 Gbit/s 时,WireGuard 和 IPsec 在不同的 MTU 配置下的 CPU 使用率。

bench wireguard ipsec tcp stream 1 stream cpu

虽然 WireGuard 的最大吞吐量更高,但 IPsec 在吞吐量相同的情况下 CPU 开销更小从而更有效率,这个差异非常巨大。

注意:为了实现 IPsec 的高效率,需要使用支持 AES-NI 指令集的硬件来卸载 IPsec 的加密工作。

后续计划:目前我们还不清楚为什么 IPsec 的高效率没有带来更高的吞吐量。使用更多的 CPU 核心也没有明显提升性能。这很可能是由于 RSS 不能很好地跨 CPU 核心处理加密流量,因为通常用于哈希和跨 CPU 核心分配流量的 L4 信息是加密的,无法解析。因此,从哈希的角度来看,所有的连接都是一样的,因为在测试中只利用了两个 IP 地址。

这是否会影响延迟?让我进一步研究。延迟基准测试最能准确地描述微服务工作负载的实际状况,微服务工作负载通常都会使用持久连接来交换请求和响应。

bench wireguard ipsec tcp rr 1 process

CPU 效率与观察到的每秒请求数相符。然而,每个配置总共消耗的 CPU 资源都不是很高。相比 CPU 消耗方面的差异,延迟方面的差异更为显著。

bench wireguard ipsec tcp rr 1 process cpu

测试环境

以下是我们使用的裸机配置。我们搭建了两套完全一样的互相直连的系统。

  • CPU:AMD Ryzen 9 3950X,AM4 平台,3.5 GHz,16 核 32 线程
  • 主板:X570 Aorus Master,支持 PCIe 4.0 x16
  • 内存:HyperX Fury DDR4-3200 128 GB,XMP 频率 3.2 GHz
  • 网卡: Intel E810-CQDA2,双端口,每端口速率 100 Gbit/s,PCIe 4.0 x16
  • 操作系统内核: Linux 5.10 LTS(配置为 CONFIG_PREEMPT_NONE

除非特别说明,所有测试都使用了标准的 1500 字节 MTU。虽然 MTU 的值越高,测试结果的绝对数值会越好,但本文的基准测试的目的在于比较相对差异,而不是测试最高或最低性能的绝对数值。

测试配置

应广大用户的要求,我们展示了 Calico 的测试结果以便进行对比。为了尽可能清晰地进行对比,我们使用了以下配置类型进行测试:

  • 基线配置(节点到节点):此配置不使用 Kubernetes 或容器,在基准测试过程中直接在祼机上运行 netperf。通常情况下此配置的性能最优。
  • Cilium eBPF: Cilium 版本为 1.9.6 并按照调优指南进行了调优,开启了 eBPF 主机路由和 kube-proxy 替换。此配置需要操作系统内核版本为 5.10 或以上。此配置与 Calico eBPF 配置对比最具有参照性。我们重点进行了直接路由模式的基准测试,因为这种模式下性能通常尤为重要。后续我们也会进一步进行隧道模式的相关基准测试。
  • Cilium eBPF(传统主机路由):Cilium 版本为 1.9.6,以传统主机路由的模式运行,使用标准 kube-proxy,支持 4.9 及以下内核版本。此配置与 Calico 配置对比最具有参照性。
  • Calico eBPF:Calico 版本为 3.17.3,同时使用了开启 kube-proxy 替换、连接跟踪绕过以及 eBPF FIB 查询的 eBPF 数据路径。此配置需要操作系统内核版本为 5.3 或以上。此配置与 Cilium eBPF 配置对比最具有参照性。
  • Calico: Calico 版本为 3.17.3,使用标准 kube-proxy,支持较低版本的操作系统内核。此配置与 Cilium eBPF(传统主机路由)配置对比最具有参照性。

复现测试结果

测试所用的全部脚本都已经上传到 GitHub 仓库 cilium/cilium-perf-networking 中,可用于复现测试结果。

下一步

我们在性能调优方面已经取得了不少结果,但我们还有许多其他的想法并将进一步优化 Cilium 各方面的性能。

  • 可观察性基准测试:单纯的网络基准测试是必要的,但是实现可观察性所需资源的消耗才是真正区分系统高下的领域。无论是对系统安全还是对故障排除来说,可观察性都是基础设施的关键特性,并且不同系统的可视化资源消耗有很大不同。eBPF 是实现可观察性的优秀工具,并且 Cilium 的 Hubble 组件也可以从中受益。在本文的基准测试中,我们禁用了 Hubble 以便测试结果可以与 Calico 对比。在后续的文章中,我们将对 Hubble 进行基准测试,以验证 Hubble 的 CPU 需求并将 Hubble 与其他类似的系统对比。

  • Service 和 NetworkPolicy 基准测试:当前的基准测试结果并不涉及任何 Service 和 NetworkPolicy。我们没有对二者进行测试以控制本文的内容范围。我们将进一步对使用 NetworkPolicy 的用例进行测试,除此之外还将对东西向(east-west)和南北向(north-south)的 Service 进行测试。如果您已经等不及了,Cilium 1.8 的发布博客已经公布了一些基准测试结果,并且展示了 XDP 和 eBPF 对性能的显著提升。

    目前,我们仍然对 NetworkPolicy 在 CIDR 规则方面的性能不太满意。我们当前的架构针对少量复杂的 CIDR 进行了优化,但并没有覆盖使用 LPM 来实现的一些特例。一些用户可能希望对单独 IP 地址的大型放行和阻止列表进行基准测试。我们会把这个用例放在优先事项中,并且提供基于哈希表的实现。

  • 内存优化:我们将继续优化 Cilium 的内存占用。Cilium 主要的内存占用来自于 eBPF 的 Map 分配。这些是网络处理所需要的内核级数据结构。为了提高效率,eBPF Map 的大小是预先设定的,以便根据配置所需的内存量最小。我们目前对这方面并不是很满意,这将是我们后续版本的重点工作。

  • 打破更多的规则:更多地绕过 iptables:我们认为 iptables 应该完全绕过。容器命名空间和系统其他部分仍有优化潜力。我们还会继续努力加快服务网格的数据路径应用程序。目前已经有一个利用 Envoy 的 Socket 层重定向的初步版本。请期待这个方面的进展。

  • 想法和建议:如果您有其他想法和建议,请告诉我们。例如,您希望我们进行哪些基准测试或改进?我们非常希望能得到反馈意见。您可以在 Cilium Slack 发表想法或者通过 Twitter 联系我们。

更多信息

KubeSphere 社区活动通知

为了跟社区新老朋友们零距离交流,我们将联合 CNCF 和其他合作伙伴,从五月到七月,在上海、杭州、深圳、成都这四个城市分别为大家带来技术的交流与碰撞。2021 年继上海站首次 Meetup 火爆全场之后,我们将依旧延续 KubeSphere and Friends 的主题,于 5 月 29 日杭州为大家带来 Kubernetes and Cloud Native Meetup。

我们特别定制了 KubeSphere 全套纪念周边礼品:T恤、马克杯、纪念徽章、帆布袋、口罩等。除此之外还有各种云原生硬核书籍等你来拿!

怎么样,心动了么?报名参与即将到来的杭州站即可获得定制周边纪念品!

于 KubeSphere

KubeSphere (https://kubesphere.io)是在 Kubernetes 之上构建的开源容器混合云,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。

KubeSphere 已被 Aqara 智能家居、本来生活、新浪、华夏银行、四川航空、国药集团、微众银行、紫金保险、中通、中国人保寿险、中国太平保险、中移金科、Radore、ZaloPay 等海内外数千家企业采用。KubeSphere 提供了开发者友向导式操作界面和丰富的企业级功能,包括多云与多集群管理、Kubernetes 资源管理、DevOps (CI/CD)、应用生命周期管理、微服务治理 (Service Mesh)、多租户管理、监控日志、告警通知、审计事件、存储与网络管理、GPU support 等功能,帮助企业快速构建一个强大和功能丰富的容器云平台。

 ✨ GitHub:https://github.com/kubesphere
 💻 官网(中国站):https://kubesphere.com.cn
 👨‍💻‍ 微信群:请搜索添加群助手微信号 kubesphere

5.29 相约杭州!云原生 Meetup 第二期杭州站报名开启!

KubeSphere阅读(3573)评论(0)

以容器技术和容器编排为基础的云原生应用,被越来越多的企业用户接受和使用,并且在生产环境中使用容器技术的比例逐年增加。KubeSphere 作为一款面向应用的开源容器混合云,经过 3 年的发展和 10 个版本的迭代,收获了一百多位开源贡献者,超过十万次下载,并有数千名社区用户用 KubeSphere 作为企业容器云平台。

KubeSphere 之所以能够如此快速发展,得益于开源社区带来的天然优势,以及社区里长期活跃的用户、贡献者积极参与社区,帮助推动产品和社区快速成长,我们坚持认为 KubeSphere 开源社区的每一位用户和贡献者朋友都是 KubeSphere 生态中的重要组成部分。

为了跟社区新老朋友们零距离交流,我们将联合 CNCF 和其他合作伙伴,从五月到七月,在上海、杭州、深圳、成都这四个城市分别为大家带来技术的交流与碰撞。2021 年继上海站首次 Meetup 火爆全场之后,我们将依旧延续 KubeSphere and Friends 的主题,于 5 月 29 日杭州为大家带来 Kubernetes and Cloud Native Meetup。

活动议程

杭州站是今年 Kubernetes Meetup 的第二站,目前已基本确定讲师和议题。

时间和地点

活动时间:5 月 29 日 13:00-18:00

签到时间:5 月 29 日 13:00-14:00

活动地点:浙江省杭州市拱墅区丰潭路 430 号丰元国际大厦 A 座硬趣空间地下一层

活动报名

杭州目前已经开启招募,若您希望获取经验,期待和各位极客交流,那就抓紧报名吧!位置有限,先到先得!

扫描下方二维码即可进入到报名页面进行报名,活动免费!

活动礼品

本次活动特别定制了 KubeSphere 全套纪念周边礼品:T恤、马克杯、纪念徽章、帆布袋、口罩…… 礼物门票数量有限,赶快报名,手慢则无!

报名参与或者提交议题即可获得定制周边纪念品!

除了提供周边礼品之外,我们还会赠送各种云原生相关的硬核书籍,有电子工业出版社提供的 《Kubernetes 生产化实践之路》:

还有人民邮电出版社图灵教育提供的张磊大神的巨著《深入剖析 Kubernetes》:

你以为只有这两套书吗?当然不是,本次 Meetup 还会送出机械工业出版社华章公司提供的以下书籍:

现场参与互动即可获取以上书籍奖品哟~

提交主题分享

您充满了开发创意却无处施展吗?我们已经为您搭好舞台:Serverless、微服务、DevOps、开源、容器… 任何关于云原生和 KubeSphere 的观点、干货、技术实践、用户故事都是我们社区非常欢迎的。

目前杭州站还有两个闪电演讲空缺,其他城市站还有多个主题演讲空缺,我们面向大家公开招募。只要您有兴趣分享,就可以提交您的议题,采纳后即可获得讲师专属大礼包一份!

扫描下方二维码提交您的议题吧!

DevOps Workshop

杭州站 Meetup 同样设置实践区域,但不同的是,这次升级啦!

杭州站 Meetup 设置了 DevOps Workshop,有兴趣的同学可以单独报名哦!另外我们会提供午餐,在午餐后可以继续参与下午的 Meetup 分享和互动交流环节!

时间:5 月 29 日 9:30-12:00

地点:浙江省杭州市拱墅区丰潭路 430 号丰元国际大厦 A 座硬趣空间一层

人数:上限 15 人,先到先得,报满即止

参与者需要:

  • 携带笔记本电脑
  • 确保有可以访问 SSH 的客户端

活动安排(以下内容根据实际参加者的情况做适当的增减):

  • KubeSphere DevOps 介绍
    • SIG 介绍
    • 功能介绍
  • Jenkins 简单介绍
    • 流水线语法概述
    • 配置及代码简介
    • Kubernetes 动态节点介绍
  • Jenkins 稳健性方案介绍
    • 可观测性
    • 告警
  • 案例分享
    • 如何在私有环境中构建、发布 Java 应用
    • 如何实现基于 SpringBoot 的持续交付
  • 参会者实际演练
  • Q&A

报名 Workshop 可加入 DevOps Workshop 现场交流群。

若七天后二维码失效,可添加小KK微信:KubeSphere

上海站活动现场精彩回顾

 

于 KubeSphere

KubeSphere (https://kubesphere.io)是在 Kubernetes 之上构建的开源容器混合云,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。

KubeSphere 已被 Aqara 智能家居、本来生活、新浪、华夏银行、四川航空、国药集团、微众银行、紫金保险、中通、中国人保寿险、中国太平保险、中移金科、Radore、ZaloPay 等海内外数千家企业采用。KubeSphere 提供了开发者友向导式操作界面和丰富的企业级功能,包括多云与多集群管理、Kubernetes 资源管理、DevOps (CI/CD)、应用生命周期管理、微服务治理 (Service Mesh)、多租户管理、监控日志、告警通知、审计事件、存储与网络管理、GPU support 等功能,帮助企业快速构建一个强大和功能丰富的容器云平台。

 ✨ GitHub:https://github.com/kubesphere
 💻 官网(中国站):https://kubesphere.com.cn
 👨‍💻‍ 微信群:请搜索添加群助手微信号 kubesphere

后Kubernetes时代,每个行业需要定制化的符合自身的云原生战略

谐云阅读(1710)评论(0)

本文由谐云CTO苌程撰写,就国内外云原生生态概况做了详细介绍,在国内大厂纷纷构建云原生生态的背景下,谐云认为在各个行业云原生落地需要符合行业属性,具备行业特点。在此基础上,谐云论证了金融、通信、能源行业的云原生体系演进方向,推出了针对金融、通信、能源行业的云原生解决方案,总结了云原生落地实践经验,供大家大家交流分享。

「一、国内外云原生的生态全景图」

1.1CNCF云原生生态全景图

提到云原生,就不得不提到CNCF(Cloud Native Computing Foundation)-云原生行业基金会。CNCF于2015 年7月由Google 牵头成立,隶属于 Linux 基金会,初衷是围绕云原生服务云计算,致力于培育和维护一个厂商中立的开源生态系统,维护和集成开源技术,支持编排容器化微服务架构应用,通过将最前沿的模式民主化,让这些创新为大众所用。

自2016 年 11 月起,CNCF 开始维护 Cloud Native Landscape,汇总流行热门的云原生技术与工具,并加以分类,为企业构建云原生体系提供参考。

截止2021年2月28日,全景图列举了和云原生相关的产品及服务的完整名单,由1449个项目共同构成了恢弘庞大的云原生世界。整个全景图按照功能分为29个模块,分别归属于9种大的类别(应用定义与开发、编排与管理、运行时、配置、平台、可观察性与分析、Serverless、会员和其它)。

 

CNCF维护的云原生生态全景图

1.2云原生产业联盟-中国云原生生态全景图
图片

2019年4月,由中国信通院发起的云原生产业联盟正式成立,联盟聚焦容器、DevOps、微服务、Serverless等前沿开源技术和理念,推动云原生技术在中国的产业化落地,是汇聚国内外云原生领域创新应用与实践案例的技术生态联盟。

2020年7月,中国信通院发布了国内首个云原生技术生态图景,对国内云原生技术进行详细梳理,从云原生底层技术、云原生应用编排及管理、云原生应用、云原生安全技术、云原生监测分析共五大类、20个细化分类,详细展示国内云原生技术生态的全景视图,为国内云原生技术生态全貌提供了重要参考。

中国云原生技术生态图景

 

1.3.1 阿里巴巴成立云原生技术委员会,云原生升级为阿里技术新战略

2020年9月,阿里巴巴成立云原生技术委员会,大力推动阿里经济体全面云原生化,并沉淀阿里巴巴10多年的云原生实践,对外赋能数百万家企业进行云原生改造,提升30%研发效率的同时降低30%IT成本,帮助客户迈入数字原生时代。

云原生技术委员会的成立,标志着阿里将云原生升级为新的战略方向。阿里自2009年首次上线核心中间件系统、2011年淘宝天猫使用容器调度、再到自研云原生硬件神龙服务器、云原生数据库PolarDB,阿里拥有10多年的云原生实践经验,并拥有国内规模最大的云原生产品家族和开源生态。

阿里云原生产品家族及开源生态,提供云原生裸金属服务器、云原生数据库、数据仓库、数据湖、容器、微服务、DevOps、Serverless等超100款产品,覆盖政务、零售、教育、医疗等各个领域。

阿里云原生全景图

 

1.3.2 华为发布云原生2.0的战略,打造围绕以应用为中心的云原生基础设施

2020年11月30日,华为基于云原生的数字化转型实践,发布了华为云云原生2.0全景图,提出云原生2.0是企业智能升级新阶段,企业云化从「ON Cloud」走向「IN Cloud」,成为「新云原生企业」。

华为提出云原生2.0时代,是面向所有企业的,任何企业只要有意愿都可以成为新云原生企业。在云原生2.0时代,原有的基础设施将全面升级为云原生基础设施。云原生,就是企业生产力,是中国企业应对市场不确定性的关键。

在华为云原生2.0全景图中,提出以容器为核心的统一计算,以应用为中心、支持多种算力和不同场景的云原生基础设施。并通过擎天架构软硬件协同能力、多云治理及边云协同等高效计算能力,全面打造资源高效、应用敏捷、业务智能和安全可信的云原生2.0计划。

华为云原生2.0全景图

 

1.3.3 谐云云原生全景图理解:云原生全景图的落地需要具备行业属性和行业特点

国内外全景图覆盖全行业所涉及领域太大,所有细节项目都研究透花的精力太多。每个企业最实用的手段是只关注对其行业属性有帮助、能够辅助其更好的落地行业应用的云原生项目,并将这些内容有机组合形成满足自身需求的云原生战略。

浙大SEL实验室自2011年开始在PaaS技术层面的展开研究,并于2015年作为高校代表以创始会员的身份和google一起创建了CNCF组织。起源于浙大SEL实验室的谐云从成立起,就致力于助力企业落地云原生技术,在金融、通信、能源等行业有着近百个项目的实践经验,并帮助客户打造了全球最大的客服云平台、数千台主机的金融业案例等行业标杆案例,为云原生在金融、通信、能源行业的落地提供了参考。

根据10多年的云原生项目技术落地经验,谐云将金融、通信、能源行业的云原生技术落地分成了几个阶段:建好容器云、管好容器云、用好容器云这三个阶段,每个阶段谐云都提供符合这几个行业的产品和服务。谐云希望能够帮助这些行业更好的落地云原生,用好云原生,管好云原生。

谐云产品图谱

 

「二、未来,金融、通信、能源行业云原生战略重点将从传统容器云、微服务、devops三驾马车向融合云原原生可观测性及云原生生安全的云原生体系演进」

自2016年起,谐云开始大规模推广云原生技术在金融、通信、能源行业的落地,这三个行业都属于国家的支柱产业,和民生戚戚相关,对云原生落地所承载的业务的可用性要求很高。另外这几个行业的IT机房规模也是全国排在前几名的行业,都需符合国家产业层面的“瘦身健体”要求,在宏观经济不确定的情况下,IT投资需要降本增效。据谐云的观察,未来,云原生在这三个行业的应用趋势,将重点在原有容器平台中增强云原生可观测性及云原生安全版块。

这一趋势也与信通院报告一致,信通院云大所何宝宏在云原生趋势中指明“云原生其内涵已从容器、微服务和DevOps的老三样,扩展纳入了与底层融合、安全、监测和编排管理等。”这也从侧面证明了谐云的判断,未来,云原生行业符合金融、通信、能源等行业的云原生战略除了微服务、devops、容器以外,为了能够管好容器云、用好容器云,云原生版图里面还应该包含云原生可观测性和云原生安全。

金融、通信、能源行业云原生发展图

图片

 

「三、谐云推荐的金融、通信、能源云原生解决方案」

根据多年的实践经验,谐云联合合作伙伴一起推出了面向金融、通信、能源等行业的云原生解决方案,在业务可用级别高、应用安全性能及应用可监控可观测性三方面进行了实践。

3.1云原生可观测性对金融、通信、能源行业落地云原生十分重要
图片

国内目前支持云原生可观测性的方案除了promethus和APM方案以外,没有很好的方案。Pomethus在资源层面的监控已经成为事实上的标准,但是仅仅有他还不足以帮助这些行业的企业进行很好地业务运维。而APM方案虽然不用重新开发业务,但是APM对技术开发语言的限制和对业务代码动态修改侵入,在相对保守行业使用度并不高。

根据谐云服务金融、通信、能源行业客户的经验,可观测性方案要实现以下指标,才能更好的服务业务运维。

a. 云原生上的业务是否正常,需要从访问量、错误率、延时等反应业务健康度的判断指标

b. 云原生上的业务一旦出现不正常,需要秒级定位至具体的service或者pod的定位指标

c. 在定位到service或者pod之后,需要进一步排查问题原因:是业务开发供应商的代码导致的,还是容器网络、容器组件所导致的排查指标。

只有完成了以上三个层次的可观测指标采集,才能实现对云原生的业务了然于胸。

可观测性指标图解

 

3.2随着业务对云原生平台依赖度的增加,云原生安全的重要性也提上日程
图片

云原生安全和传统技术安全最主要的区别在于云原生在开源层面引入了非常多的组件,这对云原生的业务带来新的安全挑战。

在容器镜像的构建阶段,需要对代码进行审计,使用可信无漏洞的基础镜像,并对构建的镜像进行漏洞扫描。

在容器镜像分发阶段,需要对镜像进行签名确保无篡改,同时对镜像仓库进行访问控制。

在容器运行时,需要对容器运行时漏洞进行扫描、入侵检测、异常检测。

容器安全问题总结

 

3.3面对不断推陈出新的云原生领域,谐云始终伫立桥头引领技术方向

云原生是一个新技术层出不穷的领域。基于此,谐云联合浙大,产学研一体化,不断引入云原生最新的技术,如使用ebpf构建可观测性方案等,引领国内云原生的技术发展方向。在多年的云原生实践中完成了金融、通信、能源行业的云原生可观测性及云安全的技术架构,实现了对云上业务监控和故障,实现了故障的秒级发现和分钟级修复,并通过容器运行时保障业务安全达到了行业领先水平。

未来,谐云将重点围绕着金融、通信、能源行业,在建好容器云、管好容器云、用好容器云的相关环节联合合作伙伴精深产品战略,一起夯实企业落地云原生的基础,提高企业综合竞争力。

参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!

alicloudnative阅读(1706)评论(0)

头图.png

头图来源:https://opensource.guide/
来源 | 阿里巴巴云原生公众号

只有贡献代码才算是参与开源项目社区贡献吗?

一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献,总觉得我的代码被社区合并了,我才算一个贡献者,这是一个常见的错误认知。其实,在一个开源社区中有非常多的角色是 non-code contributor,一个开源社区中的很多关键职责被大家给忽略了。

组织活动也可以是贡献社区:

  • 你可以像远在巴西库亚巴的 @fzamperin学习,为你喜欢的开源项目组织 workshop 或线下 meetup
  • 你还可以帮助社区成员找到合适的线下峰会来提交技术议题
  • ……

技术写作或者技术布道也是贡献社区:

  • 为你喜欢的开源项目编写或者改进文档
  • 建立一个如何使用这个开源项目的 samples
  • 将文档翻译成其他语言,帮助全球开发者认识、使用该项目
  • 在自己的公众号或者博客分享使用该项目的指南和心得
  • ……

设计和官网开发也是贡献社区:

  • 重构开源项目官网来帮助开发者更好的认识、使用该开源项目
  • 进行用户调研来更好地改善官网导航和目录
  • 构建一个 style guide 来帮助该项目拥有一个更统一、完善的视觉设计
  • 为该开源项目设计贴纸、T 恤等周边
  • ……

Apache Dubbo Samples SIG 成立!samples 贡献者招募中

Apache Dubbo 发展到今天,已经有 386 个贡献者,贡献者了包括代码、测试、用例、文档、使用建议等丰富内容。当前 Dubbo Core 有 2.7、3.0 两个非常活跃的演进分支,其中 2.7 版本已被众多知名企业大规模的投入生产环境,如携程、工商银行、瓜子二手车等,而 3.0 分支也已经在 3 月份发布了 preview 版本,按照计划在 6 月份第一个 3.0 可用版本也将正式发布。

内核的快速演进与迭代促进了 Dubbo 的快速发展,同时,也给整个社区与 Committer 核心项目组带来新的挑战,这体现在:

  • 新 Feature 相关的用户示例与文档缺失。用户对新版本特性如何使用无从知晓,翻阅代码成为唯一的途径。
  • 稳定性无法得到充分保障。在迭代过程中,单元测试、集成测试没有得到有效的补充,这导致测试覆盖度的下降和回归成本的高涨,更糟糕的是如果发版环节有些问题仍未被发现,则它们将不可避免的被带到用户使用环节。

由于文档和用例的缺失,我们不得不处理大量的 Issue、也包括其他的线上答疑,来解答用户的疑问,其中有一些是用户不知道某个具体功能怎么用,有一些则是使用了不正确的配置方式导致不能正常运行;稳定性的下降则是对我们自己以及 Dubbo 用户两方面的双重打击,持续的出现问题会导致用户开始对 Dubbo 的版本发布失去信心,而对我们这些核心维护者而言,花费大量精力完成的版本却给用户带来了困扰,这会让整个开发组也变得沮丧。毫无疑问,对于 Dubbo 社区而言,解决以上问题成为了当前迫在眉睫的工作任务,这本身的重要性并不亚于大家所热衷的核心功能开发,但我们也认识到,投入到其中需要花费一定的精力,仅仅靠当前的几位维护者会非常吃力,尤其是考虑到他们还需要兼顾整个 Dubbo 社区的运作。

在这样的背景下,我们想到了召集来自社区的力量,今天在 Committer 核心成员的一致建议下,Apache Dubbo 决定成立 Samples SIG(注:SIG  是 special interest group 的缩写,即兴趣小组),以期能改善以上的示例缺失、稳定性等问题。毫无疑问,这个 SIG 的运转需要广大开发者的积极参与,当然,社区的核心开发者们也会积极的活跃在其中。

Dubbo 现状

当然,能稳定的支撑这么多企业与实例稳定的运行,Dubbo 的测试与稳定性机制也并非一无是处,以下是 Dubbo 具备的一些能力与运作机制。

  • 单元测试。单元测试全部位于_https://github.com/apache/dubbo_主干仓库,目前能达到大概 40% – 50% 的覆盖度,但遗憾的是近期的很多新增修改,包括 2.7 与 3.0,在这方面做的都有所欠缺。
  • 集成测试。Dubbo 的集成测试项目位于_https://github.com/apache/dubbo-samples_,里面包含了我们当前建设的大部分 Dubbo Feature 用例,你可以把当做一个Quick Start的示例工程用,也可以作为功能参考手册(代码),我们在其上构建了自动化的集成测试机制,能实现对所有用例的全量验证。
  • 基于 Github Actions 的自动化测试流程。每一次代码提交、PR 都会触发这个 Workflow,它会对主干仓库进行编译,并依次运行单元测试、集成测试,同时还有一些代码合规范的检查。

我们要做的提升计划,就是在以上已有组件的基础之上继续完善。通过梳理,我们总结出以下部分内容需要重点完善:

  • Dubbo 3.0 中新引入的一些核心机制、组件的单元测试覆盖
  • Dubbo 3.0 中新引入的一些核心组件的用户用例、集成测试
  • Dubbo 重点组件的,如 Zookeeper、Nacos 等
  • Dubbo 内核一些核心组件,如 Registry、Directory、URL、FilterBuilder、Context、AsyncRpcResult、ApplicationModel、ServiceRepository 等的单元测试覆盖

请关注下文的 SIG 联系方式,以实现更好的持续协作和任务进度的更新。

对参与者的帮助与要求

参与到 SIG 中来,不论你是学生、初学 Dubbo 的开发者、用户、或是混迹职场的技术达人,这里应该都能您带来一些帮助:

  • 掌握 Dubbo 新特性的使用方式
  • 快速了解 Dubbo 的核心工作机制
  • 掌握 Dubbo 的演进动态的一手信息
  • 如果你是企业用户,也能共同实现推动 Dubbo 稳定性的提升,解决 Dubbo 的企业落地问题
  • 与业内的技术专家、同行深入交流,提升自己,实现信息共享
  • 积累活跃度,成为开源达人,与 Apache 结缘并有机会成为 Apache Dubbo Committer

另外,社区也会不定期的举办线上、线下活动,获得社区贡献者专属礼物。
我们对参与者的唯一要求就是热情,希望参与者能持续的投入在 Dubbo 社区的建设中,并定期的参加我们 SIG 的交流活动,以实现与其他人的协作。

参考文档

Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域

alicloudnative阅读(1815)评论(0)

头图.png

作者 | Vineyard 团队
来源 | 阿里巴巴云原生公众号

Vineyard 是一个专为云原生环境下大数据分析场景中端到端工作流提供内存数据共享的分布式引擎,我们很高兴宣布 Vineyard 在 2021 年 4 月 27 日被云原生基金会(CNCF)TOC 接受为沙箱(Sandbox)项目。

Vineyard 项目开源地址:
https://github.com/alibaba/v6d

项目介绍

现有的大数据分析场景中,对于端到端任务,不同的子任务之间通常使用例如 HDFS、S3、OSS 这样的分布式文件系统或对象存储系统,来共享任务之间的中间数据,这种方式在运行效率和研发效率上存在诸多问题,以下图所示的一个风控作业工作流为例:

1.jpg

  1. 工作流中不同任务之间为了共享中间数据,前一个任务将结果写入文件系统,完成之后,后一个再将文件读出作为输入,这个过程带来了额外的序列化及反序列化、内存拷贝、以及网络、IO 的开销,我们从历史任务中观察到有超过 60% 的任务为此花费了 40% 以上的执行时间。
  2. 对于生产环境,为了高效地解决某一个特定范式的问题往往会引入一个新系统(例如分布式图计算),但这样的系统往往难以直接与工作流中的其他系统无缝衔接,需要很多重复的 IO、数据格式转换和适配的研发工作。
  3. 使用外部文件系统共享数据给工作流带来了额外的中断,因为往往只有当一个任务完全写完所有结果,下一个任务才能开始读取和计算,这使得跨任务的流水线并行无法被应用。
  4. 现有的分布式文件系统在共享中间数据时,特别是在云原生环境下,并没有很好的处理分布式数据的位置问题,造成网络开销的浪费,从而降低端到端执行效率。

为了解决现有大数据分析工作流中存在的上述问题,我们设计和实现了分布式内存数据共享引擎 Vineyard。

2.jpg

Vineyard 从以下三个角度来应对上述几个问题:

  1. 为了使端到端工作流中任务之间的数据共享更加高效,Vineyard 通过内存映射的方式,支持系统间零拷贝的数据共享,省去了额外的 IO 开销。
  2. 为了简化新计算引擎接入现有系统所需要的适配和开发,Vineyard 对常见的数据类型,提供了开箱即用的抽象,例如 Tensor、DataFrame、Graph,等等,从而不同计算引擎之间共享中间结果不再需要额外的序列化和反序列。同时,Vineyard 将 IO、数据迁移、快照等可复用的组件以插件的形式实现,使其能够很灵活地按需注册到计算引擎中去,降低与计算引擎本身无关的开发成本。
  3. Vineyard 提供一系列 operators,来实现更高效灵活的数据共享。例如 Pipeline operator 实现了跨任务的流水线并行,使得后续任务可以随着前序任务输出的产生,同时进行计算,提高了端到端整体效率。
  4. Vineyard 与 Kubernetes 集成,通过 Scheduler Plugin,让任务的调度能够感知所需要的数据的局部性,在 Kubernetes 让单个任务的 Pod 尽可能地调度到与 Pod 所需的输入数据对其的机器上,来减小数据迁移需要的网络开销,提升端到端性能。

在初步的对比实验中,相比于使用 HDFS 来共享中间数据,对于评测任务,Vineyard 能够大幅降低用于交换中间结果引入的额外开销,对于整个工作流的端到端时间有 1.34 倍的提升。

核心功能

接下来从 Vineyard 核心的设计与实现,以及 Vineyard 如何助力云原生环境中大数据分析任务两个方面来介绍 Vineyard 的核心功能。

1. 分布式内存数据共享

Vineyard 将内存中的数据表示为 Object。Object 可以是 Local 的,也可以是 Global 的,以分布式执行引擎 Mars 和 Dask 为例,一个 DataFrame 往往被拆分成很多个 Chunk 以利用多台机器的计算能力,每台机器上有多个 Chunk,这些 Chunk 是 Vineyard 中的 LocalObject,这些 Chunk 一起构成了一个全局的视图,即 GlobalDataFrame。这个 GlobalDataFrame 能够直接共享给其他计算引擎,如 GraphScope,作为图数据的输入。有了这些数据类型的抽象,Vineyard 上的不同计算引擎之间就可以无缝地共享中间结果,将一个任务的输出直接用作下一个任务的输出。

更具体地,Vineyard 中又是如果表达一个特定类型的 Object,使之能够很容易地适配到不同的计算引擎中去呢?这得益于 Vineyard 在 Object 的表示上提供的灵活性。Vineyard 中,一个 Object 包括两个部分,Metadata,以及一组 Blob。Blob 中存储着实际的数据,而 Metadata 则用于解释这些 Blob 的语义。例如对于 Tensor,Blob 是一段连续内存,存储着 Tensor 中所有的元素,而 Metadata 中记录了 Tensor 的类型、形状、以及行主序还是列主序等属性。在 Python 中,这个 Object 可以被解释为一个 Numpy 的 NDArray,而在 C++ 中,这个 Object 可以被解释为一个 xtensor 中的 tensor。这两种不同编程语言的 SDK 中,共享这个 Tensor 不会带来额外的 IO、拷贝、序列化/反序列化、以及类型转换的开销。

同时,Vineyard 中的 Metadata 是可嵌套的,这使得我们通过很容易地将任何复杂的数据类型描述为 Vineyard 中的 Object,不会限制计算引擎的表达能力。以 GlobalDataFrame 为例,见下图中 Metadata 的结构。

3.png

2. 云原生环境中数据与任务的协同调度

对于一个真实部署的大数据分析流水线,仅仅有任务之间的数据共享是远远不够的。在云环境中,一个端到端流水线中包含的多个子任务在被 Kubernetes 调度时仅仅考虑了需要的资源约束,连续的两个任务的 co-locate 无法保证,在两个任务之间共享中间结果时仍然有数据迁移引入的网络开销,如下图,在运行 Task B 时,因为两个任务的 Pod 没有对齐,数据分片 A3、A4 需要被迁移到 Pod 所在的 Vineyard 实例上。

4.png

对此,Vineyard 通过 CRD 将集群中的数据(Vineyard Objects)表示为可观测的资源,并基于 Kubernetes 的 Scheduler Framework 设计和实现了一个考虑数据局部性的调度器插件。当前一个任务 Task A 完成后,从结果对象的 Metadata 中,调度器插件可以知道所有分片的位置,在启动下一个任务时,调度器给数据所在的节点(图中的 Node 1、Node 2)更高的优先级,使任务 Task B 也尽可能地被调度到对应的节点上,从而省去了数据迁移引入的额外开销,来改善端到端的性能。

快速上手

Vineyard 集成了 Helm 以方便用户安装和部署:

helm repo add vineyard https://vineyard.oss-ap-southeast-1.aliyuncs.com/charts/
helm install vineyard vineyard/vineyard

安装之后,系统中会部署一个 Vineyard DaemonSet,并暴露一个 UNIX domain socket 用于与应用的任务 Pod 之间的共享内存和 IPC 通信。

此外,还可以参考 Vineyard 的演示视频:
https://www.youtube.com/watch?v=vPbF1l5nwwQ&list=PLj6h78yzYM2NoiNaLVZxr-ERc1ifKP7n6&t=585

未来展望

Vineyard 已经作为分布式科学计算引擎 Mars 和一站式图计算系统 GraphScope 的存储引擎,Vineyard 助力大数据分析任务离不开与云原生社区的紧密互动,未来Vineyard 会进一步地完善与社区其他项目如 Kubeflow、Fluid 等的集成,助力更多云上大数据分析任务。

Vineyard 将继续与社区同行,支持关注社区的反馈,致力于推动云原生技术在大数据分析领域的生态建设和应用。欢迎大家关注 Vineyard 项目,加入 Vineyard 社区并参与项目的共建与落地!

业界率先支持 MCP-OVER-XDS 协议,Nacos 2.0.1 + 1.4.2 Release 正式发布

alicloudnative阅读(2029)评论(0)

来源 | 阿里巴巴云原生公众号

Nacos 是阿里巴巴开源的服务发现与配置管理项目,本次同时发布两个版本:

  1. 发布 2.0.1 版本,主要致力于支持 MCP-OVER-XDS 协议,解决 Nacos 与 Istio 数据服务同步问题。
  2. 发布 1.4.2 版本,极大增强 K8s 环境中 JRaft 集群 Leader 选举的稳定性。

Nacos 2.0.1

2.0.1 主要变更为:

  1. 在 nacos-istio 插件及模块中,支持 MCP-OVER-XDS 协议,解决 Nacos 与 Istio 数据服务同步问题。
  2. 增强了 Jraft 协议在 K8s 环境中的 Leader 选举的稳定性。
  3. 修复了频繁抛出 Server is Down 错误的问题。

具体变更为:

[#3484] Support ldap login.
[#4856] Support mcp over xds.
[#5137] Support service list add view subscriber.
[#5367] Support client encryption plugin for nacos 2.0.
[#5307] Push support config some parameters
[#5334] Fix Server is Down problem in k8s environment.
[#5361] Check isUseGrpcFeatures() when register instance using GRPC protocol.
[#5486] Refactor Distro Config as singleton and replace GlobalConfig.
[#5169] Fix instance beat run only by responsible server.
[#5175] Fix publishConfig lost type.
[#5178] Fix NPE when init server list failed.
[#5182] Fix throw NoSuchFieldException in ConfigController when service connect to nacos.
[#5204] Fix query error when pageNo is larger than service number.
[#5268] Fix subscriber app unknown
[#5327] Fix ThreadPool usage problem and add some monitor for distro.
[#5384] Fix the problem of unable to shutdown NacosConfigService.
[#5404] Fix frequently udp push for client 1.X.
[#5419] Fix Nacos 2.0 client auth may invalid for non public namespace.
[#5442] change state to UP when received status form old version server.
[#5096] Add unit tests in nacos 2.0.
[#5171][#5421][#5436][#5450][#5464] Fix IT for nacos 2.0.

Nacos 1.4.2

  1. 该版本优化了 JRaft 模块,与最新的 nacos-k8s 项目配合使用,极大增强集群选主的稳定性。
  2. 另外,该版本了修复有关“Server is Down”问题的提示及众多 1.4.1 版本中的 Bug。

具体变更为:

[#4452] Add config compare features.
[#4602] Add new way for export config.
[#4996] Make log level changeable for nacos-core module.
[#5367] Add pre-plugin in client for encrypting config.
[#3922] Method createServiceIfAbsent in ServiceManager require sync.
[#4274] skip master-select task when db.num is 1.
[#4753] Use SafeConstructor to parse yaml configuration.
[#4762] Naming health check thread num support user define it by self.
[#4770] Beta publish: change the way of select betaIps, from input to select.
[#4778] Make SecurityProxy.accessToken threadsafe in single writer multi reader.
[#4903] Add securuty hint for login page.
[#4917] Raft ops interface add auth.
[#4980] Log4J2NacosLogging.loadConfiguration() return directly When location is blank.
[#5010] Fix the usage of TemplateUtils.
[#5190] Add some hint log when login failed.
[#5234] Solve the problem that page can be edited while publishing-config request is processing.
[#5331] Fix the mouse hovers over the margin in a pointer state and cannot be clicked.
[#5350] Add hint and detail reason for consistence status Down.
[#5439] Support specified naming UDP push port for client.
[#5434] Optimize the ConfigType.isValidType method.
[#3779] Check groupName can't be empty.
[#4661] ConfigServletInner#doGetConfig code optimization.
[#3610] Fix the press F1 to full screen issue in new config page.
[#3876] Fix push empty service name.
[#4306] Fix search service by group error problem.
[#4573,#4629] Jraft leader status check error.
[#4672] Fix cloning configuration lost description.
[#4699] Fix metadata batch operation may delete instance problem.
[#4756] Fix config list sort and search problem.
[#4787] Losting member if parsing host throw UnknownHostException.
[#4806] Fix addListener method comment.
[#4829] Remove instance when distro and raft remove instances data.
[#4852] Fix main.js is too large problem.
[#4854] Modify Header to support Keys Ignore Case.
[#4898] Fix instance list page bug.
[#4925] Fix member list change will cover member status and metadata problem.
[#5078] Fix the problem of inconsistent results for querying subscriber list data multiple times.
[#5026] Fix MetricsHttpAgent metrics twice.
[#5018] Check group and dataId in groupKey.
[#5114] ConcurrentHashSet.java is not compatible with jdk1.6 or 1.7.
[#5253] Fix missing auth identity header error.
[#5291] Fix Beat task will stop when throw unexpected exception.
[#5301] Respond all kinds of collections for istio's request.
[#5351] Fix Consistence status can't switch to UP after Jraft election.
[#5390] Fix ip verify error.
[#5427] Fix NPE if Jraft leader is null in CurcuitFilter.
[#5437] Fix config beta feature will lost dump event problem.
[#5451] Fix the tag can't be removed problem.
[#4822][#4823][#4824][#4825][#4979][#5506] Fix dependency security problem.
[#5277] Subscriber list servername add required.
[#5380][#5418] Add and enhance unit test.

社区

随着 Nacos 2.0.1 及 1.4.2 的发布 Nacos 社区又新增了一位 Committer:haoyann,这位同学在推进多数据源支持、鉴权及安全性、配置模块优化与完善等内容中作出许多贡献,并积极参与社区讨论。

haoyann_commiter.jpg

Nacos 社区欢迎更多愿意参与共建的小伙伴加入,包括但不限于:

  • 源代码
  • 文档
  • 社区讨论
  • 多语言实现
  • 周边生态产品结合

积极参与将可以获得 Nacos 社区赠送的精美小礼品~

About Nacos

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。