云原生概念介绍

  • 云原生的概念文档:CNCF Landscape Guide
  • 云原生意义:充分利用云所提供的一切能力去设计程序来达到降低技术架构难度。
  • K8s在云原生中的角色:是一个基座,提供可移植、可扩展的平台。提供很多开箱即用的功能,比如负载均衡、高可用、服务发现等。可以大大降低应用开发的难度。

CNCF云原生项目图

  • CNCF的云原生的生态技术栈网站:CNCF Landscape
  • CNCF 项目的成熟度分为 Sandbox、Incubating 和 Graduated。成熟度反映项目采用情况、社区健康度与治理等,不直接保证某个部署适合生产环境。

云原生发展历程

  1. 2010年 WS02创始人Paul Frementle首次提出Cloud Native
  2. 2015年CNCF成立
  3. 2018年CNCF重新定义云原生:容器、微服务、服务网格、不可变基础设施和声明式API
  4. 2020年成为云原生元年,云原生逐渐成为云计算领域的重要发展方向。为企业数字化转型提供了强大的支持。

云原生技术体系

  • 微服务
  • 一种将应用拆分为多个可独立部署的服务、通过 API 等方式通信的架构风格。服务仍可能相互依赖,需要隔离与容错设计。
  • 容器
  • 轻量级虚拟化、可移植性高,是微服务的最佳载体
  • 持续交付
  • 解决传统瀑布式开发的问题。不停机更新。改了一个小功能立马就上线,而不是开发很多功能等一个时间窗口上线。
  • DevOps
  • 通过自动化方式,提高软件交付的速度和质量
  • 云原生十二要素
  • 一组最佳实践原则
  • 服务网格
  • 可以让开发人员不用去关心服务治理的问题。比如多个微服务之间的多个实例,高可用和负载均衡都用服务网格来治理。
  • 声明式API
  • 是一种编程范式。通过声明目标状态来实现资源管理。
  • 基础设施即代码
  • 容器编排
  • 资源调度、自动修复、服务发现、负载均衡、弹性伸缩、自带高可用等
  • Serverless
  • 函数即服务。无服务器计算。
  • 事件触发,例如AWS的lambda服务,只有用户请求时才会实际在后台起实例来执行

云原生十二要素

  1. 一份基准代码,多份部署

  2. 针对不同的环境,要用同一份代码。

  3. 显式声明依赖

  4. 不要依赖系统组件(比如curl wget等),最好都要声明出来,让他自动下载。

  5. 在环境变量中存储配置

  6. 不要把配置写在代码中,用环境变量表示

  7. 配置放在配置中心中也可以

  8. 把后端服务当做附加资源

  9. 把 MySQL 等后端服务视为可通过配置连接的附加资源;应用不应把某个具体服务实例写死在代码中。

  10. 例如可以通过修改连接配置切换数据库实例。

  11. 严格分离构建、发布、运行

  12. 代码部署到一个环境中,发现bug之后不能直接在这个环境中去修改。

  13. 要在代码中心里面改,改完再构建发布运行

  14. 应用无状态化

  15. 数据最好放在远程对象存储或者数据库当中,而不是存在本地盘

  16. NFS不推荐,高可用性不好

说明:对象存储
对象存储是一种数据存储架构,它将数据作为对象进行管理,而不是像传统文件系统那样以文件和文件夹的层次结构,或者像块存储那样以块的形式。每个对象都包含数据本身、元数据以及一个全局唯一的标识符。

对象存储的特点:
- 扁平的命名空间:没有传统的文件夹层次结构
- REST API 访问:通过 HTTP/HTTPS API 进行访问
- 高度可扩展:可以存储大量数据
- 元数据丰富:每个对象可以包含自定义元数据
- 分布式架构:通常分布在多个节点上以提供高可用性

对象存储特别适合云原生应用程序,因为它提供了高可用性、可扩展性和通过 API 的编程访问能力。

  1. 通过端口绑定来提供服务
  2. 某个服务需要暴露端口来被访问。而不是本地开一个socket文件。
  3. 通过进程模型来扩展
  4. 通过增加进程实例(在容器平台中通常体现为增加副本)来扩展服务;线程数仍可按工作负载需要调整。
  5. 快速启动和优雅终止
  6. 不要在服务启动的时候做太多初始配置。要把初始化配置当做单独的任务完成。比如放到InitContainer中
  7. 运行环境一致性
    • UAT、PROD等环境要尽量保证一致
  8. 日志当做事件流
    • 日志写到本地文件当中不推荐。可以直接把日志输出到控制台,或者输出到管理日志的平台当中。
  9. 后台管理任务单做一次性进程运行
    • 一次性管理进程是指用于管理应用程序的临时任务(数据库迁移、数据库清理和维护、运行一次性脚本、数据导入/导出、缓存预热、系统健康检查、批量数据处理),这些任务应该作为独立的、一次性的进程(比如cronjob)来运行,而不是集成到主应用进程中。

云原生最佳实践

  1. 应用日志直接输出到控制台。
  2. 不要写在本地文件内,会占用较大空间,收集比较困难。
  3. 用日志工具直接收集即可。
  4. 应用数据不要直接写在本地
  5. 比如token写到redis,用户数据写在数据库,数据图片写到对象存储当中。
  6. 应用配置和代码分离
  7. 应用服务治理采用云平台能力
  8. 比如用公有云提供的LB等开箱即用功能。
  9. 不需要重复造轮子,比如springcloud就不推荐使用了。
  10. 应用微服务化、可容器化
  11. 应用提供健康检查接口
  12. Java会出现假死状态,比如接口还在,请求在程序内却不能处理了。
  13. 应用提供Metrics接口

云原生AI

  • 云原生人工智能(CNAI):使用云原生技术构建和部署 AI 应用与工作负载,将 AI 与容器编排、弹性伸缩、自动化交付等能力结合。
  • 比较火的项目比如Kubeflow:把机器学习的每个阶段都独立成微服务,用K8s来做调度。
  • 大模型的部署很复杂,并且可观测性很差。部署到K8s上就可以利用K8s的可观测性,比如OpenLLMMetrics