云原生概念介绍
- 云原生的概念文档:CNCF Landscape Guide
- 云原生意义:充分利用云所提供的一切能力去设计程序来达到降低技术架构难度。
- K8s在云原生中的角色:是一个基座,提供可移植、可扩展的平台。提供很多开箱即用的功能,比如负载均衡、高可用、服务发现等。可以大大降低应用开发的难度。
CNCF云原生项目图
- CNCF的云原生的生态技术栈网站:CNCF Landscape
- CNCF项目分为三种:Sandbox(初创期) --> Incubating(正在孵化,可用于生产) --> Graduated(非常稳定,可用于生产)
云原生发展历程
- 2010年 WS02创始人Paul Frementle首次提出Cloud Native
- 2015年CNCF成立
- 2018年CNCF重新定义云原生:容器、微服务、服务网格、不可变基础设置和声明式API
- 2020年成为云原生元年,云原生逐渐成为云计算领域的重要发展方向。为企业十字花转型提供了强大的支持。
云原生技术体系
- 微服务
- 软件架构的风格,把应用拆分成若干个单体应用,之间通过API通信。某个服务异常不会影响其他服务
- 容器
- 轻量级虚拟化、可移植性高,是微服务的最佳载体
- 持续交付
- 解决传统瀑布式开发的问题。不停机更新。改了一个小功能立马就上线,而不是开发很多功能等一个时间窗口上线。
- Devops
- 通过自动化方式,提高软件交付的速度和质量
- 云原生十二要素
- 一组最佳实践原则
- 服务网格
- 可以让开发人员不用去关心服务治理的问题。比如多个微服务之间的多个实例,高可用和负载均衡都用服务网格来治理。
- 声明式API
- 是一种编程范式。通过声明目标状态来实现资源管理。
- 基础设施即代码
- 容器编排
- 资源调度、自动修复、服务发现、负载均衡、弹性伸缩、自带高可用等
- Serverless
- 函数即服务。无服务器计算。
- 事件触发,例如AWS的lambda服务,只有用户请求时才会实际在后台起实例来执行
云原生十二要素
-
一份基准代码,多份部署
-
针对不同的环境,要用同一份代码。
-
显式声明依赖
-
不要依赖系统组件(比如curl wget等),最好都要声明出来,让他自动下载。
-
在环境变量中存储配置
-
不要把配置写在代码中,用环境变量表示
-
配置放在配置中心中也可以
-
把后端服务当做附加资源
-
比如后端需要mysql等,需要做到mysql挂了,前端服务还能继续运行。
-
这个在实践中很难做到。可以忽略
-
严格分离构建、发布、运行
-
代码部署到一个环境中,发现bug之后不能直接在这个环境中去修改。
-
要在代码中心里面改,改完再构建发布运行
-
应用无状态化
-
数据最好放在远程对象存储或者数据库当中,而不是存在本地盘
-
NFS不推荐,高可用性不好
[!info] 对象存储
对象存储是一种数据存储架构,它将数据作为对象进行管理,而不是像传统文件系统那样以文件和文件夹的层次结构,或者像块存储那样以块的形式。每个对象都包含数据本身、元数据以及一个全局唯一的标识符。对象存储的特点:
- 扁平的命名空间:没有传统的文件夹层次结构
- REST API 访问:通过 HTTP/HTTPS API 进行访问
- 高度可扩展:可以存储大量数据
- 元数据丰富:每个对象可以包含自定义元数据
- 分布式架构:通常分布在多个节点上以提供高可用性对象存储特别适合云原生应用程序,因为它提供了高可用性、可扩展性和通过 API 的编程访问能力。
-
通过端口绑定来提供服务
- 某个服务需要暴露度端口来被访问。而不是本地开一个socket文件。
- 通过进程模型来扩展
- 服务扩容的时候,推荐使用扩容副本数来实现。而不是内部提高线程数
- 快速启动和优雅终止
- 不要在服务启动的时候做太多初始配置。要把初始化配置当做单独的任务完成。比如放到InitContainer中
- 运行环境一致性
- UAT、PROD等环境要尽量保证一致
- 日志当做事件流
- 日志写到本地文件当中不推荐。可以直接把日志输出到控制台,或者输出到管理日志的平台当中。
- 后台管理任务单做一次性进程运行
- 一次性管理进程是指用于管理应用程序的临时任务(数据库迁移、数据库清理和维护、运行一次性脚本、数据导入/导出、缓存预热、系统健康检查、批量数据处理),这些任务应该作为独立的、一次性的进程(比如cronjob)来运行,而不是集成到主应用进程中。
云原生最佳实践
- 应用日志直接输出到控制台。
- 不要写在本地文件内,会占用较大空间,收集比较困难。
- 用日志工具直接收集即可。
- 应用数据不要直接写在本地
- 比如token写到redis,用户数据写在数据库,数据图片写到对象存储当中。
- 应用配置和代码分离
- 应用服务治理采用云平台能力
- 比如用公有云提供的LB等开箱即用功能。
- 不需要重复造轮子,比如springcloud就不推荐使用了。
- 应用微服务化、可容器化
- 应用提供健康检查接口
- Java会出现假死状态,比如接口还在,请求在程序内却不能处理了。
- 应用提供Metrics接口
云原生AI
- 云原生人工智能CNAI:使用云原生技术构建和部署人工智能应用和工作负载。核心是将AI和韵苑升级技术相结合,以实现更高效、更灵活的AI应用开发和部署。
- 比较火的项目比如KubeFlow:把机器学习的每个阶段都独立成微服务,用K8s来做调度。
- 大模型的部署很复杂,并且可观测行很差。部署到K8s上就可以利用K8s的可观测性,比如OpenLLMMetrics