带你走进云原生技术:云原生开放运维体系探索和实践

字节跳动云原生大数据平台运维管理实践 字节跳动过去几年在支撑自身业务的过程中积累了很多大数据领域的引擎工具,目前也在探索将这些引擎工具的能力进行标准化、产品化的输出。组件繁多:大数据领域完成一项工作需要很多组件配合。比如分布式大数据存储及各种任务执行引擎:Flink、Spark 及各种 ETL 的 OLAP 工具和调度 ETL 的任务调度工具,还有支撑工具引擎的运行日志监控系统和项目用户权限的辅助系统等;部署复杂:这些系统的组件繁多,相互配合也非常复杂,导致部署变得困难。比如部署一套完整的生产环境,可能会涉及到多个依赖和配置管理。 阅读详情

本文是云原生开放协同技术探索与实践一阶段的总结和综述。

蚂蚁基础技术在过去3年多以来持续、深入推进全面的云原生化技术演进,我们将在线、离线计算资源装进了一台计算机,将服务体系通过 mesh 的思路和技术手段进行了下沉解耦,可以说比较充分的拥抱了云原生技术,并获取了其带来的技术红利。

当完成了资源、服务的云原生化,我们发现在云原生基础能力之上的运维体系与云原生技术开放、共享的思路有较大的距离,在技术体系上也与云原生技术声明式、白盒化的思路相悖,同时由于缺少匹配的技术支撑,历史包袱等问题也成为了云原生运维难以真正代际演进的障碍。今天我要介绍的就是蚂蚁在这样的背景下在云原生运维方向进行的技术探索和实践。

规模化云原生运维探索

我们先来回顾一下在蚂蚁真实的实践方式和面对的问题。首先,我们来看看蚂蚁践行多年的经典运维中台,这类运维平台一般包括了控制器、业务模型、编排引擎、原子任务及管道,在蚂蚁这样的平台是一系列服务的集合,他们较好的满足了集中式、标准化、低变更频率的应用发布及运维需求。但这种模式在实践中也存在着明显的不足。

首先对于非标准应用、应用个性化需求、高成本需求、非紧急需求、技改类需求,往往无法较好的满足。在蚂蚁的实践中,非标运维需求、对核心应用模型及运维模型冲击较大的高成本改造需求、大量基础能力或运维功能的透出需求等长期无法得到较好的满足,需求往往是合理的,是难以获得足够的优先级执行落地。在研发阶段,运维平台长期积累了高复杂度的业务逻辑,修改测试涉及跨系统的长改造链路,同时基础能力的透出、运维能力的产品化依赖前端、服务端研发资源。这些问题使得运维平台研发日渐吃力,特别是在产品 GUI、业务模型、编排引擎等变更热点上,受限于扩展机制能力不足,内部实践中甚至出现过线上不断修改代码、发布服务以满足需求的情况。平台上线后,统一的质保和线上全链路功能验证同样面对较大的压力。对于最终的使用者,命令式按钮背后的黑盒计算透明度低,审计难,结果难预测,同时激情操作、操作界面不熟悉等问题也一直影响着线上的稳定性。这些问题长期存在,我们寄希望于代际的技术演进来解决这些问题。

当云原生基础服务逐渐稳定后,对于自身场景不在运维平台管理范围内的应用,研发同学自发的借助云原生社区工具链解决问题。基于 Kubernetes 生态高度开放、高度可配置的特点,研发者可以自助、灵活、透明的声明式应用运行、运维需求,以应用粒度完成发布、运维操作。

用户通过 kustomize 等社区技术缩短了对接基础设施的路径,并通过如 velocity 等文本模板技术部分解决了静态 YAML 文件在较多变量时维度爆炸的问题,解决了默认值设定的问题,同时通过 code review 的方式进行多因子变更及评审。由于 Kubernetes 及其生态提供了面向资源、服务、运维、安全的横向能力,使得这种简单的方式可有很好的普遍性和适用性,通过对不同的 Kubernetes 集群 “播放” 这些数据即可完成对基础设施的变更,本质上是一种声明数据的流转。面向 git 仓库的研发方式和 gitops 流程支持对运维产品研发资源的诉求较低,往往可以比较简单的搭建起来,不强依赖产品研发资源投入。相比经典运维中台,这些好处清晰明确,但从工程视角缺点也非常明显。

首先 Kubernetes API 的设计较为复杂,仅是 Kubernetes 原生提供的 low level API 就暴露了 500 多种模型,2000 多字段,场景上几乎涵盖了基础设施应用层的方方面面,即使是专业同学也很难理解所有细节。其次这种方式的工程化程度很低,违反 DRY 原则,违反各团队职责能力高内聚低耦合的原则,即使在有一定的工具支持的情况下,在内部的典型案例中一个多应用的 infra 项目仍然维护了多达 5 万多行 YAML,同时由于团队边界造成的多个割裂的平台,用户需在多个平台间切换,每个平台的操作方式各异,加上跳板机黑屏命令,完成一次完整的发布需要 2 天时间。

由于低工程化程度的问题,各团队间协同依赖人肉拉群同步,最终 YAML 由多个团队定义的部分组合而成,其中一大部分属于 Kubernetes 及运维平台团队的定义,这些内容需要持续跟踪同步避免腐化,长期维护成本高。

KUSION: 云原生开放协同技术栈

以上两种模式各有利弊,优势和问题都比较清晰。那么能不能既要也要呢,能不能在继承经典运维平台优势的情况下,充分利用云原生技术带来的红利,打造一个开放、透明、可协同的运维体系?

带着这样的问题,我们进行了探索和实践,并创建了基于基础设施代码化思路的云原生可编程技术栈 Kusion。

大家都知道 Kubernetes 提供了声明式的 low level API,提倡其上生态能力通过 CRD 扩展的方式定义并提供服务,整个生态遵循统一的 API 规范约束,复用 API 技术和工具。Kubernetes API 规范提倡 low level API 对象松耦合、可复用,以支持 high level API 由 low level API “组合” 而成。Kubernetes 自身提供了利于开源传播的极简方案,并不包括 API 之上的技术和方案。

回到云原生技术的本源,我们回看了 Kubernetes 前身 Borg 的应用技术生态。如下图示,在 BorgMaster 之上,Borg 团队研发了 Borg 接入三件套,即 BCL(Borg Configuration Language),Command-line tools,以及相应的 web service。用户可以通过 BCL 声明式编写需求,通过 Command-line tools 将 BCL 文件执行到 Borg 集群,并通过 web GUI 视图查看任务细节。经过大量的调研,我们了解到 Google 内部的运维能力及产品生态、质量技术生态都依赖这三件套构建而成,在内部也进行了多年的迭代演进。

这给了我们启发,今天我们有了容器技术、服务体系,有了大量用户和差异化的需求,有了一定数量的自动化运维平台,我们希望能通过云原生专用的语言和工具来链接 Kubernetes 生态、各个运维平台以及大量的用户,通过唯一事实定义消除运维平台孤岛,完成云原生基础设施在应用、运维层面的代际演进,达到 “Fusion on Kubernetes” 的目标。

带着这样的目标,我们持续地进行做技术探索和实践,目前已经形成了 Kusion 技术栈,并在蚂蚁的生产实践中进行应用。

Kusion 技术栈基于这样的基础能力而工作,包括如下组成部分:

  • 云原生配置策略专用语言 KCL (Kusion Configuration Language)

  • KCL 解释器及其 Plugin 扩展机制

  • KCL 研发工具集: Lint, Format, Doc-Gen,IDE Plugin(IDEA, VsCode)

  • Kusion Kubernetes 生态工具: OpenAPI-tool, KusionCtl(Srv)

  • Konfig 配置代码库,其中包括平台侧及用户侧代码

  • OCMP (Open CloudNative Management Practice) 实践说明书

Kusion 工作在基础设施之上,作为抽象及管理层的技术支撑服务上层应用。不同角色的用户协同使用 Kubernetes 生态提供的横向能力,通过声明式、意图导向的定义方式使用基础设施,在场景上支持典型的云原生场景,也服务了一些经典运维场景,完成了一阶段的建设工作。目前接入 Kusion 的产品包括 IaC 发布、运维产品 InfraForm、建站产品 SiteBuilder、快恢平台等。通过将 Kusion 集成在自动化系统中,我们尽可能的调和黑盒命令式自动化系统与开放声明式配置系统,使其发挥各自的优势。

集成 & 落地

新的技术体系首先面临着落地的问题,我们先来看看 Kusion 在集成落地方面的思考和做法。

从整体思路上,我们从经典运维系统中的变更热点业务层、编排层着手,以 KCL 声明式配置块的方式外置编写对应逻辑,并被控制器自动化集成。

这种思路是有迹可循的,我们来看看同行的经验,以雷神山医院的建设现场为例,我们可以看到现场大量的组件是预制品,经过了测试、验证、交付后由现场的塔吊负责组装。这些组件需要良好的品控,需要内置水管、电线等“能力”,否则即使组装也无法有效工作,同时需要给业务侧一定的自定义配置空间,还要易于组装及自动化以提升现场装配效率。实际上我们面对的大规模运维活动与这样的现场有类似之处,现代基建的高效手段非常值得我们学习借鉴。

对应我们的实际场景,我们基于 KCL 的工作方式需要满足以下要求:

  • 可分工、可协同:组件制作、验收、交付、使用可以基于角色需要合理分工协同,满足软件供应链的需求

  • 外置、预制的组件:组件独立于自动化系统存在,预制的组件在交付前需要经过充分的测试验证

  • 内置资源、服务、身份等要素:组件仅向用户暴露有效的业务信息,同时内置云原生、可信的逻辑

  • 易于业务定义:组件需要提供一定的自定义配置能力

  • 易于自动化:支持自动化组装,自动化对组件进行“增删改查”

接下来,我们来看看基于 Kusion 工作的典型流程,此处有一定的抽象和简化。

前文提到 Kubernetes API 提供了基于 OpenAPI 的 low level API 及扩展机制,基于高内聚、低耦合、易复用、易组装的原则设计,以 Resource、Custome Resource 的方式存在。此外,Kubernetes API 提供了大量的命令以操作容器、Pod 等资源。对于 SDN、Mesh,或是其他的能力扩展都是基于这样的整体约束和方式,大都提供了资源定义或命令操作。

基于这样的基础,在蚂蚁的实践中我们将整体的工作流程分为 4 个步骤:

  1. 代码化。对于资源定义,基于 OpenAPI Model/CRD 定义生成 KCL 结构体;对于命令操作,编写对应的声明式 KCL 结构体。这些结构体对应到平台侧原子能力定义。

  2. 抽象化。平台侧 PaaS 平台同学基于这些原子声明式编写抽象、组装,并定义出面向用户的前端结构体,从功能场景上涵盖了 AppConfiguration, Action / Ops, Locality / Topology, SA / RBAC, Node / Quota 等场景,并提供了简化编写的 Template 集合。以 AppConfiguration 为例,我们提供了SigmaAppConfiguration、SigmaJobConfiguration 分别对应于服务型和任务型应用定义,此外针对 SOFA 应用的特征提供了 SofaAppConfiguration。这些前端结构体作为 Kusion Models 的“接口层”存在,受限于业务进度等原因各场景积累的水位不同,仍需要长期的积累打磨。

  3. 配置化。应用侧研发或 SRE 同学基于这些前端结构体描述应用需求。用户可以通过结构体声明的方式为应用定义配置基线及不同环境的配置。在大部分情况下,用户仅需要进行结构体声明,即一些 key-value 对。对于有复杂需求的场景,用户可以进行逻辑编写或通过继承结构体的方式组织代码逻辑

  4. 自动化。当应用侧配置完成后,实际上已经定义好了可用的“组件”,具备了自动化的条件。平台侧控制器可以通过 KCL CLI 或 GPL binding API 完成编译、执行、输出、代码修改、元素查询等自动化集成工作,用户则可以通过 KusionCtl 工具执行 KCL 代码映射执行到 Kubernetes 集群。

通过这样统一的工作流程,我们轻量级地完成了对 Kubernetes 生态大量基础能力的透出,基于原子能力声明式地封装、抽象出面向应用的配置、运维能力,并完成了一定场景的落地应用。Kusion 提供了研发工具协助使用者完成其工作。我们可以对平台侧、用户侧分层协同模式下的实践做进一步的探讨。平台侧同学抽象并定义出前端结构体,例如 SofaAppConfiguration ,其中定义了业务镜像、所需资源、config、secrect、sidecar、LB、DNS、副本数、逻辑资源池、发布策略、是否超卖、是否访问公网等等。

前端结构体无法独立工作,实际上存在着与前端结构体对应的后端结构体,后端对前端透明,前-后端结构体分离解耦。后端结构体在运行时将前端结构体产生的数据“翻译”成对应的 low level API ,这种反向依赖的方式依赖于 KCL 语言能力。

从工程角度看平台侧同学实际上完成了一次轻量级、声明式的应用级 API 定义。这种前后端分离的设计有诸多好处。首先应用侧使用的前端结构体可以保持简单干净、业务导向、实现细节无关;其次可以通过编译时指向不同的后端文件动态切换到不同的后端结构体实现,以完成平台版本切换、实现切换等目的;最后这样分离的做法可以在统一模式的前提下保证充分的灵活性,例如平台可以通过 kcl base.k prod.k backend.k 多文件编译完成一次包含基线、环境配置、后端结构体的组合编译。事实上,我们可以将所有场景规约为 kcl user_0.k ... user_n.k platform_0.k ... platform_n.k 的范式,其中 user.k 代表用户侧代码,platform.k 代表平台侧代码。我们从另一个角度来看多团队协同的方式。由各团队自下而上定义平台能力及约束,并完成应用级的配置基线及配置环境特征,完成最后一公里的定义。

在理清工作流程后,我们来看 KCL 通过 Konfig 大库落地的实践。我们在 Konfig 代码仓库中定义了平台侧及用户侧的代码空间,通过统一配置代码库完成对代码的共享和复用,保证了对整体基础设施代码定义的可见性。在用户侧,通过 project、stack、component(对应蚂蚁内部应用) 三级目录的方式组织代码。以 cloudmesh 为例,在  tnt/middleware/cloudmesh  的 project 目录下含多个 stack,如 dev、prod,每个 stack 中含多个 component。代码在这三个维度得以隔离,并共享上下文。

在代码质保方面,我们通过单元测试、集成测试等手段保证对平台侧、用户侧代码的质量,我们正在引入代码扫描、配置回放、配置校验、dry-run 等验证手段保证代码变更的可靠性。在研发方面,我们通过主干开发、分支发布的方式保证不同应用并行研发的前提下尽可能不产生代码腐化的情况,并通过 tag 保护稳定分支。

在 IaC 产品落地场景中,通过标准化的结构体、代码版本化、多环境代码隔离、CI pipeline 等手段管理基础设施描述代码,通过代码变更的静态、动态 diff、模拟、异常提示、风险管控接入保证基础设施变更可控,通过代码 Pull Request 做变更审计及对变更人员的追踪。下图以业务发布场景为例展示了关键步骤,在业务代码通过质保流程并完成镜像构建后,CI 流程控制器通过 KCL API 对 Konfig 仓库中对应 KCL 文件中的 image 字段进行自动更新,并发起 Pull Request,由此触发发布流程。

IaC 提供了编译测试、live-diff、dry-run、风险管控接入等验证方式,并支持执行过程的可视化,产品基于 KCL 语言能力及工具建设,尽可能的减少业务定制。整个流程以 Konfig 代码的自动修改为起点,平台方、应用方、SRE 基于代码协同,通过产品界面进行线上发布,支持分批分步、回滚等运维能力。Konfig 中的代码“组件”可以被多个场景集成使用,例如此处被发布控制器集成的组件还可以被建站控制器集成,控制器只需关注自动化逻辑,无需关心被集成组件的内部细节。以文章开头的典型建站场景为例,在接入 Kusion 后,用户侧配置代码减少到 5.5%,用户面对的 4 个平台通过接入统一代码库而消减,在无其他异常的情况下交付时间从 2 天下降到 2 小时。

我们再来看更加动态性的大规模快速恢复场景。快恢平台在接到监控告警输入后决策产生异常容器 hostname 列表,并需要对容器进行重启等恢复操作。

我们通过 KCL 编写声明式的应用恢复运维代码,其中通过 KCL Plugin 扩展完成对在线 CMDB 的查询,将 hostname 列表转换为多集群 Pod 列表,并声明式定义 Pod 恢复操作。快恢平台执行 KusionCtl run AppRecovery.k 完成跨多集群的 Pod 恢复操作。通过这样的方式,快恢控制器无需理解容器恢复细节、Kubernetes 多集群映射执行细节等,可以更专注于自身异常判断及决策逻辑。

在项目落地过程中,我们也发现到了不少因为进度等原因造成的平台侧设计问题。例如平台侧操作定义不够规范,应用依赖等共性定义过于分散等问题,这需要我们在后续的落地过程中持续去沉淀提高。开放配置给了用户更大的灵活性和空间,但相比黑盒的方式需要更多的安全性保障。在开放协同推进的同时,可信原生技术部在并行推进云原生可信平台的建设,可信平台通过将身份与 Kubernetes 技术紧密结合提供相比社区方案能力更强的技术支撑。

举个例子,通过开放配置我们是不是可以通过 mount 证书的方式使得不可信不安全的服务获得访问目标服务的权限从而获取到关键数据?事实上在没有身份传递及高水位 Pod 安全保障的前提下这是完全可能。通过可信平台对 PSP(Pod Security Policy)、服务验证、服务鉴权等场景的加固,使得我们可以按需增强关键链路的安全策略。相比与社区方案,可信平台定义了更完整的 spiffe 身份标识,并使得身份作用于资源、网络、服务的各个环节,可以说可信是开放的必要前提。同时可信提供的鉴权能力、隔离能力也需要被用户使用,将原子能力封装并在应用配置层面透出依赖于 Kusion 的推进,使得接入 Kusion 的应用可以更简单的使用可信能力。可以说开放协同技术栈与可信平台是能力正交,相辅相成的云原生应用层技术。

最后,我们对集成落地做一个小结:

  • 平台侧编写 80% 内容,通过面向应用的前端结构体提供规范的配置块,再通过后端结构体定义屏蔽 low level API 资源及操作,最终通过这样的方式描述应用对 workload、编排、运维等方面的需求,重点在于可以定义什么、默认有什么及约束集合,并通过 Konfig 仓库共享复用。平台侧趋向引擎化,专注自动化控制逻辑,由 KCL 代码作为扩展技术外置编写业务逻辑。我们希望面对复杂的运维业务诉求,平台侧控制器逐步演进到低频变更,甚至零变更。

  • 应用侧输入 20% 内容,以平台侧前端结构体为界面声明应用侧诉求,重点在于要什么、要做什么,所写即所得。应用侧通过面向多项目、多租户、多环境、多应用的代码工程结构组织代码,通过 Pull Request 发起变更,通过 CICD pipeline 完成白盒化的线上变更。同时,应用侧有对单应用编译、测试、验证、模拟的自由度,在充分验证后交付使用;对多应用可通过 KCL 语言能力按需灵活组合。将大规模的复杂问题拆分缩小到应用粒度,得到充分验证后按需合并,本质上是一种分治思路的实践。针对蚂蚁的实际情况,我们通过 KusionCtl 工具支持研发测试环境的执行及可视化,通过 InfraForm 产品、SiteBuilder 产品等推动线上的部署过程。

协同配置问题模型

理解了落地思路和场景实践方式,我们将进一步下钻拆解具体的协同场景,同时分析 KCL 语言在配置场景的设计和应用。

我们先来看平台侧编写轻量级应用级 API 的一些要点。平台侧同学可以通过单继承的方式扩展结构体,通过 mixin 机制定义结构体内属性的依赖关系及值内容,通过结构体内顺序无关的编写方式完成声明式的结构体定义,此外还支持如逻辑判断、默认值等常用功能。

对于声明式与命令式的差异做简单的分析,我们以斐波那契数列为例,可以把一组声明式代码看作一个方程组,方程式的编写顺序本质上不影响求解,而“求解”的过程由 KCL 解释器完成,这样可以避免大量命令式拼装过程及顺序判断代码,对于存在复杂依赖的结构体而言优化尤为明显。

对于复杂结构,命令式拼装的写法多出一倍以上的代码量,补丁代码使得结果难以预测,同时需要考虑执行顺序问题,特别是在模块化过程中调整存在依赖的模块顺序非常繁琐且易出错。对于各种配套能力,我们通过 mixin 机制编写,并通过 mixin 声明的方式“混入”到不同的结构体中。

对于平台侧来说,稳定性保证尤为重要。

当配置数据量逐步增大时,良构类型是保证编译时问题发现的有效手段,KCL spec 包括了完备的类型系统设计,我们正在实践静态类型检查和推导,逐步增强类型的完备性。

同时 KCL 引入了多种不可变手段,支持用户按需定义结构体内属性的不可变性。通过这两种基础而重要的技术手段使得大量违反编写约束的情况可以在编译时被检查发现。

对于业务向的内容,KCL 支持通过结构体内置的校验规则及单元测试的方式支持。以下图所示代码为例,我们在 AppBase 中定义对 containerPort、services、volumes 的校验规则,同时在 MyProdApp 中定义叠加的环境相关的校验规则。目前校验规则在运行时执行判断,我们正在尝试通过编译时的静态分析对规则进行判断从而发现问题。

此外对于平台侧来说,升级推进是必须面对的问题。我们首先需要考虑最坏情况,即提供给用户的前端结构体需要做不兼容的调整,按照新增配置项并下线老配置项的思路,我们需要对待下线字段进行禁用,并以合理的方式告知用户。

当平台自身出现不兼容更新时问题相似,只是需要平台侧后端结构体进行调整,应用侧用户不直接感知。KCL 针对这类问题提供了字段禁用的功能,使用被禁用字段将在编译阶段通过警告或错误的方式提示,编译错误将 block 编译,从而迫使用户在编译阶段进行修改,避免将问题带入运行时造成影响。

对于兼容的平台侧调整,通常在后端结构体修改导入的原子定义文件即可。对于 KCL 解释器自身的变化,我们通过单元测试、集成测试、模糊测试等进行验证,对于 plugin 的变更通过 plugin 自身的测试验证。KCL 解释器及 plugin 的变化通过需要 Konfig 代码库的 UT、IT 进行测试验证,保障已有代码正常工作。在经过测试验证后,发起 Pull Request 通过 code review 评审。

我们再来简单梳理应用侧协同的场景。假设存在基线配置及生产环境配置,在我们的实践中存在三种典型场景。

第一种场景中,基线与生产配置中各定义了同名配置的一部分,由 KCL 自动合并生成最终配置块,这适用于对称配置的场景非常有效,如果出现冲突则会进行冲突报错。

第二种场景中,我们希望在生产配置中覆盖基线配置中的一些配置项,类似 Kustomize 的 overlay 覆盖功能,事实上这是大多数熟悉 Kubernetes 使用者的诉求。

对于第三种场景,编写者希望配置块全局唯一,不能进行任何形式的修改,若出现同名配置则会在编译阶段报错。在真实的场景中,基线与各环境配置可由研发与 SRE 配合完成,也可以由 Dev 独立完成,Kusion 本身不限制使用者职能。

通过场景分析我们对 KCL 有了初步的了解,我们以编程语言的理论、技术,云原生应用场景三方面为输入设计 KCL,我们希望通过简单有效的技术手段支撑平台侧、应用侧完成基础设施描述,将问题尽可能暴露在 KCL 编译、测试阶段,以减少线上运行时的问题频次。此外我们提供了便利的语言能力和工具帮助不同的使用群体更高效的完成其工作,并通过工程化的方式组织、共享代码,对接 Kubernetes API 生态。

抽象模型

通过对 Kusion 落地集成、协同编程场景的分析,我们了解到 Kusion 技术的组成场景及使用方式。我们再来看看 Kusion 关键抽象模型。

我们先来看 KCL 代码的抽象模型。以下图为例,首先 KCL 代码在编译过程中形成两张有向无环图,分别对应结构体内部声明代码及结构体使用声明。编译过程可以简单分为展开、合并、代换三步。通过这样的计算过程,在编译时完成了大部分代换运算,最终运行时进行少量计算即可得到最终的解。在编译过程中,我们同步进行类型检查和值的检查,他们的区别是类型检查是做泛化,取偏序上确界,值检查是做特化,取偏序下确界。

对于 KCLVM 的解释器,我们采用了标准的分层解耦的设计方式,由 parser、compiler、VM 三部分组成。我们希望尽可能的在编译时完成工作,例如图的展开、代换,类型的检查、推导等,这样可以保持 VM 部分尽可能简单。后续我们将在 KCLVM compiler 中支持对 WASM 中间表示的编译支持。此外我们通过 plugin 机制支持对 VM 运行时能力的扩展,并考虑了对 LSP Server 的支持以降低 IDE、编辑器支持成本。

在工程化方面,我们通过 project、stack、component 三级方式组织 KCL 代码。当代码映射到 Kubernetes 集群时,Kusion 支持两种映射方式。

第一种方式支持将 stack 映射为 namespace,component 在 namespace 内存在,即 stack 内共享资源配额,component 间通过 SDN 及 Mesh 能力做隔离,这是社区比较常见的一种实践方式。

第二种方式将 component 映射为 namespace,stack 通过 label 标识,通过 SA 管理权限,资源配额定义在 component 维度,component 间通过 namespace 的隔离能力做隔离,这是蚂蚁目前线上环境的实践方式。无论如何映射,用户无需感知物理集群对接及切换细节。此外,KCL 代码中资源定义都可以通过唯一的资源 ID 定位,这也是对代码进行“增删改查”的基础。

为了支持上述的隔离及映射逻辑,我们提供了 KusionCtl 工具帮助用户完成项目结构初始化、Kubernetes 集群映射、执行状态跟踪及展示、Identity 权限集成等常用功能。用户可以通过 KusionCtl 完成研发、测试环境的执行和验证工作。

对于线上环境,我们更推荐使用基于 Kusion 的运维产品进行变更操作。我们希望通过 KCL 代码开放、透明、声明式、意图导向、分层解耦的定义基础设施,本质上是面向数据及其约束的一种协同工作,变更是一种数据的流动。我们通过前置的预编译、计算、验证,最终将数据交付到各环境的运行时,相比于经典命令式系统中计算逻辑流动的方式,可以最大程度避免复杂命令式计算造成的运行时数据错误,特别是当计算逻辑发生变更时,这种运行时计算错误的结果通常都是一次线上故障。

最后,我们来看一种 Kusion 思路的技术架构,我们仍然以控制器、业务层、编排层、任务及管道的分层逻辑来看。自下而上的,由 Kubernetes API Server 收敛了管道并提供了原生资源定义,并通过 CRD & Operator 进行扩展提供稳定的原子任务定义。从我个人的角度看,Operator 如其名约“操作员”,重复着接收订单、执行操作的简单循环,订单未完成则持续操作。

Operator 应尽可能保持简单,避免复杂的业务逻辑拆解、控制逻辑、状态机,同时避免因为微小的差异创建新的 Operator 或通过 Operator 做单纯的数据、YAML 转换。Operator 作为收敛基础设施原子能力的存在,应尽量内聚、稳定。在业务层、编排层,我们通过 KCL 代码在 Konfig 仓库中编写,并结合 GitOps 支持应用粒度的变更、编译、测试、验证。控制器层高度引擎化,聚焦自动化逻辑,根据业务场景需要定制控制器及 GUI 产品界面。应用的配置代码“组件”由多个控制器共享复用,例如建站、发布、部分运维都将依赖应用 AppConfiguration 配置代码块。

总结 & 展望

最后,我们对开放协同技术工作做一个总结。

我们常说 Kubernetes 是云计算的 Linux/Unix,相比于 Unix 丰富的外围配套生态,Kubernetes 在配套技术能力上还有很长的路径。对比于使用便利的 Shell、Tools,我们还缺少一种符合 Kubernetes 声明式、开放、共享设计理念的语言及工具,Kusion 希望能在这一领域有所帮助,提升基础设施的开放程度及使用效率,易于共享、协同,提升稳定性,简化云原生技术设施的接入方式。

我们的探索和实践仍然在一个初级阶段,我们希望通过 Kusion 的技术和服务能力在运维、可信、云原生架构演进方面起到积极的作用。

我们希望推进真正的基础设施代码化,促成跨团队的 DevOps,成为持续部署与运维的技术支撑。在可信方面,策略及代码、可信集成、标准化的支撑是我们后续的工作重点之一,特别是与策略引擎的结合,是开放可信技术能力的关键步骤。

在云原生架构方面,我们将持续推进架构现代化的演进,通过技术手段支持更多上层自动化产品业务的快速创新,同时通过统一的流程、企业级的技术能力支持服务好基础设施应用场景。

纵观历史,技术总是朝着提高整体社会协作效能演进。

Kusion 带来的云原生开放协同无疑是这条朴素规律再次发挥效力的注脚。

延伸阅读

云原生架构技术揭秘:DevOps 技术打破开发运维壁垒,实现持续交付的变革之道 随着云计算的普及和企业数字化转型的加速,云原生架构逐渐成为软件开发和运维的新标准。在这样的背景下,DevOps 作为一种文化和实践,重要性日益凸显。对于研发工程师、架构师来讲,理解并掌握云原生架构领域中的 DevOps 技术,不仅是提升个人技能的需要,也是适应行业发展的必然要求。DevOps (Development and Operations)一词最早是由 James Turnbull 在 2009 年提出,当时是为了解决开发和运维之间的协作问题。 阅读详情

相关推荐

从部署到运维:打造全链路安全可控的云原生运维体系

安全运维不是"一次性项目",而是"持续迭代的体系"。在云原生时代,运维团队必须从"保障效率"转向"效率与安全并重",通过技术手段、流程规范和人员意识的结合,打造全链路安全可控的运维体系,让业务在安全的基础上快速迭代。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 244

运维从零认识云原生

无论我们所在的企业是否已经开启了云原生建设,我们都需要去充分的认识云原生,不断的储备和云原生相关的知识点。

yanggd1987的专栏 1439

微信小程序-如何根据缩放屏幕大小自适应icon图标更改marker

微信小程序如何根据用户的缩放屏幕来改变marker图标icon的大小,实现icon自适应屏幕缩放的效果

Bartender_VA11的博客 3980

云原生时代的IT运维:从工具到方法论的全面升级

一、云原生时代的降临云原生技术概述云原生是一种构建和运行应用程序的方法,它以云计算为基础,以容器化、微服务架构和自动化管理为核心,旨在帮助开发者构建可靠、可扩展、高性能的应用程序,并充分利用云计算的优势。从技术特点来看,云原生应用程序通常会使用容器来封装和部署应用程序及其依赖项,利用容器提供的隔离性和可移植性,使其可以在不同的环境中运行,像开发、测试和生产环境等。而且其采用微服务架构,把应用程序划...

ITIL之家公众号 1679

电赛经验分享——赛前准备

⏩ 大家好哇!我是小光,想要成为系统架构师的嵌入式爱好者。⏩在之前的电赛中取得了省一的成绩,本文对电赛比赛前需要准备什么做一个经验分享。加入小光嵌入式交流群(qq群号:737327353)免费获取博主所有资料哦!

qq_52608074的博客 7779

信号处理中的滤波器的阶数和谐波的理解

最近在读paper的时候,遇到了一些以前遗忘的问题,先重新查找,记录在这里,以备不时之查看。 我相信一定有小伙伴跟我有过一样的疑惑,那就是我们在使用滤波器的时候,总是遇到滤波器的阶数这个概念参数,我们很多都是根据别的paper里的设置,设置自己的科研参数,其实并不是很理解其中的含义: 其实我们常用的阶数N的意思是: 滤波器的阶数,就是指过滤谐波的次数,一般来讲,同样的滤波器,其阶

Miracle.Zhao的博客 2万+

从 Linux 到云原生:一位资深运维工程师的转型之路

在数字化转型的浪潮中,运维工程师的角色正从「系统管家」向「架构设计师」演进。本文以本人的十年运维历程为脉络,解析传统运维向云原生运维的转型路径,呈现电力、汽车行业的规模化实践与信创迁移的深度落地经验。

weixin_66855479的博客 977

三模冗余设计

在数字电路设计中,Voter模块(表决器) 和 三模冗余(Triple Modular Redundancy, TMR) 是高可靠性系统的核心设计技术,主要用于容错和抗辐射(如航天、医疗设备等关键领域)。容错机制:若任一模块故障(如SEU,单粒子翻转),其他两个模块仍能保证正确输出。功耗与面积:TMR会显著增加资源占用(约3倍),需权衡可靠性和成本。航天电子:抗辐射芯片(如FPGA)中用于防止单粒子翻转(SEU)。故障检测:可扩展设计以检测并隔离故障模块(如通过BIST)。

qq_45776815的博客 2053

云原生时代的运维体系进化

简介:基于容器、Kubernetes 等云原生技术,提供的开放社区标准、不可变基础设施、声明式 API 会成为企业 CloudOps 的最佳实践,也将在这个基础上推进数据化、智能化体系建设,将运维复杂性进一步下沉,让企业可以聚焦于自己的业务创新。阿里云也将持续向外输出自身在超大规模云原生实践和探索中的能力沉淀,与更多企业、开发者一起,躬身入局,全面拥抱云原生运维技术体系。 作者 | 易立 云原生已经成为数字经济技术的创新基石,并且正在深刻地改变企业上云和用云的方式。云原生的用云方式可以帮助企业最大化获得

阿里云云栖号 1369

【项目实战】主流车载操作系统,QNX实时操作系统入门介绍

QNX是一种实时操作系统,自1980年代初期由Quantum Software Systems成立以来,已被广泛应用于各种行业和领域。QNX具有实时响应、高可靠性和分布式等特点,为各种设备提供了强大的底层操作系统平台。随着科技的不断发展和进步,QNX系统的应用范围和潜力也在不断扩大。本文将全面介绍QNX系统,包括其引言、背景、系统特性、应用领域和生态系统等方面。QNX作为一种实时操作系统,具有高效的实时性能、高可靠性、分布式、可剪裁性和可扩展性等特点。它在各个领域都有广泛的应用,并拥有一个庞大的生态系统。

奶爸的编程之路,也就一周冷个三天 3071

【原理图PCB专题】原理图图纸锁定/解锁与PCB文件加密方式

在工作中我们会遇到需要冻结原理图进行评审和加密图纸防止被他人盗用的需求。那么在OrCAD Capture中如何对图纸进行锁定与解锁,如何在Allegro中对PCB工程进行加密呢?

一点硬件 3256

阿里云中间件首席架构师李小平:企业为什么需要云原生?

前天我参加了信通院的云原生产业大会,参加会议的企业非常多,并且来自于各行各业,我在会场上非常感慨。我想起 2019年的时候,我在搜索引擎上搜索“云原生”这个词,那时的搜索频率还比较低,而 ...

阿里巴巴中间件 887

深入理解 DDR5 Bank Group 与并行调度机制

Bank Group架构和并行调度机制,是DDR5性能跃升的核心秘密!理解它们才能写出高效调度程序,设计出性能强劲又稳定的DDR5系统。🎯记住:Bank Group不是简单的分组,而是高速并行的“魔法钥匙”,巧用它,你的DDR5设计将爆发惊人性能!

weixin_43199439的博客 313

架构运维体系建设与实践:从职责到落地的全维度解析

本文探讨了数字化时代下架构运维体系的建设思路与实践路径。架构运维的核心职责包括构建研发中台赋能业务开发,具体体现在提升开发效率、降低设施成本、保障系统稳定三方面。架构体系涵盖基础设施、中间件微服务层、能力支撑等层面,形成完整的生态系统。文章重点分析了微服务体系、全链路基础能力、中间件领域和监控治理领域的现状与改进方向,提出需完善流量隔离、网关升级、中间件防护等关键能力,并强调了云原生能力建设、命名中心构建等落地事宜。通过系统化的架构运维体系建设,实现业务系统的高效运转与稳定保障。

小程故事多的博客 1256

【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】

Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink CCI-500。它在 big.LITTLE 处理器集群之间提供完整的缓存一致性,并为其他代理(如 Mali GPU、网络接口或加速器)提供 I/O 一致性。CoreLink CCI-550 提供可扩展和可配置的互连,使 SoC 设计人员能够以尽可能小的面积和功耗满足性能目标,并且还增加了可降低整体系统延迟的监听滤波器。

CodingCos的博客 2210

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

云原生时代数据库运维体系演进

作者:vivo 互联网服务器团队- Deng Song数据库运维面临着大规模数据库实例难以有效运维、数据库难以做好资源弹性伸缩以及个人隐私数据安全难以保障这三个方面的挑战。对此,vivo给出了自身的应对方案。首先,vivo自研了数据库运维平台DaaS来支撑数据库运维工作。在规模覆盖、效率提升、故障告警处理等层面均衡发力,保障了数据的稳定性,以工单自助,故障自愈为核心,实现了数据库的高效运维。其...

架构师小秘圈 488

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

喜报!SOFAStack 社区荣获2021 年度云原生技术创新解决方案/产品奖

“5月26日,由中国信息通信研究院主办,云计算开源产业联盟、云原生产业联盟、云原生计算基金会(CNCF)支持的“云原生产业大会”在北京成功举办。”在 2021 云原生产业大会上,SO...

金融级分布式架构 490

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

​技术沙龙 | 移动云Teatalk(西安站)带你走进云网融合

随着5G时代的来临,如何更加有效的推动边缘计算发展,已成为业界的焦点、热点。移动云应时代需求,敏锐捕捉发展方向,10月23日,移动云主题沙龙成功举办。活动现场吸引了业界内外众多合作伙伴、...

优快云资讯 2807

精彩回顾|Meetup 合肥站--云原生技术沙龙

2022 年 8 月 13 日,安徽开发者社区联合 SOFAStack 社区、Apache APISIX 社区和云原生社区在合肥共同举办了云原生技术沙龙。本次活动吸引了众多当地的开源爱好者和参与者前来参加,伴随着现场浓厚的技术交流氛围,活动圆满落幕!????接下来,就让小编带着大家一起一览本次活动的精彩瞬间吧????✦Meetup08.13 合肥✦本次活动以云原生技术为主题,聚焦了云...

金融级分布式架构 313

优刻得UCloud UCan技术开放日深圳站:云原生在产业互联网加速应用

数字时代的发展,万物上云的步伐不断加快,以容器、微服务、服务网格等为代表的云原生技术体系得到越来越多的深入应用。在金融、制造、汽车、政务等多个领域,应用率普遍提升。 10月30日,UCloud优刻得的UCan技术开放日活动来到深圳。本次活动以“构建云原生,拥抱新增长”为主题。UCloud优刻得携手招商云、YY直播、英特尔的云原生技术专家,通过不同行业利用容器、边缘计算、信息安全等技术,助力企业数字化转型实践,为现场上百名技术从业者,带来了干货分享。 UCloud优刻得边缘计算产品负责人 李希源

xhwuli的专栏

云原生推动全云开发与实践

云原生带来开发模式的革新,为开发者提供一些非常有优势的特点。​1)架构层面:云原生开发模式是模块化的架构,通过标准化的接口和协议进行通信。​2)应用交付和更新层面:可以进行持续的自动化的迭代、集成和交付。​3)运维层面:标准化、自动化的运维模式。​4)扩展性方面:可按需自动弹性扩展。​5)依赖性层面:具有良好的可移植性,即完全没有厂商锁定的问题,不依赖于系统环境和硬件。​6)企业组织与文化:跨职能沟通与合作顺畅,应对变化能力强。

2401_83977530的博客 900

AI与云原生,技术圈最火热的搭档

作者 | 贺宇&华为云布道师在容器技术、编排系统、微服务理念等云化技术和管理方法的带动下,应用上云已然成为一种趋势,云原生理念应运而生。一方面,云计算已经重塑了软...

微服务技术与实践专栏 725

阿里云中间件首席架构师李小平:云原生实践助力企业高效创新

前天我参加了信通院的云原生产业大会,在会场上非常感慨,参加会议的企业非常多,并且来自于各行各业。我想起2019年的时候,我在搜索引擎上搜索“云原生”这个词,那时的搜索频率还比较低,而2019年又是“云原生”在国内开始飞速发展的一年。而今年的云原生会场上,已经有非常多的企业来参加,这些企业在技术、产品、生态中都在应用云原生,所以说,整个“云原生”已经从最开始的技术变成了行业,现在发展成了比较大的产业,并且这个产业的规模每年以非常快的速度在增长。 在今天,可能有很多咨询机构、企业,或者是个人开发者都在解读“云

数据库技术 166
上一篇: SOFAChannel#20 用安全计算保护关键业务
下一篇: 【直播】用安全计算保护关键业务
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值