云原生
虚拟化 -> 标准化 -> 自动化 -> 云计算 -> 云原生
现代应用的十二范式
- 基准代码:一份基准代码,多份部署。基准代码和应用之间总是保持对应的关系。所有部署的基准代码相同,但每份部署可以使用其不同的版本
- 依赖:显式声明依赖关系。应用程序一定通过依赖清单确切地声明所有依赖项
- 配置:在环境中存储配置。将应用的配置存储于环境变量中。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码
- 后端服务:把后端服务当作附加资源。应用不会区别对待本地或第三方服务。对应用程序而言,两种都是附加资源
- 构建,发布,运行:严格区分构建,发布,运行这三个步骤
- 进程:以一个或多个无状态进程运行应用。应用的进程必须无状态且无共享
- 端口绑定:通过端口绑定提供服务。应用完全自我加载而不依赖任何网络服务器就可以创建一个面向网络的服务
- 并发:通过进程模型进行扩展。开发人员可以运用这个型去设计应用架构,将不同工作分配给不同的进程类型。
- 易处理:快速启动和优雅终止可最大化健壮性。应用的进程是可支配的,意思是说它们可以瞬间开启或停止
- 开发环境与线上环境等价:尽可能保持开发、预发布、线上环境相同。应用想要做到特续部署就必须缩小本地与线上差异
- 日志:把日志当作事件流。应用本身考虑存储自己的输出流。不应该试图去写或者管理日志文件
- 管理进程:后台管理任务当作一次性进程运行。一次性管理进程应该和正常的常驻进程使用同样的环境
这些范式反映了现代应用程序开发的一些重要趋势,如微服务架构、持续集成和持续交付、容器化、云原生开发等
云原生应用
原则
CICD
- 一个应用一份代码多次发布
- 代码不可变 使用配置驱动应用
- 开发、测试环境一致性
弹性
- 无状态进程
- 同步并发
- 快速启动优雅关闭
解耦
- 依赖明示
- 配置和密码分离
- 使用外部服务
- 动态端口绑定
中台
- 日志流
- 直接到输出流 使用日志平台
- 作业管理
- 分布式任务调度
- 暴露接口 给外部触发
- 监控遥测
- API经济
- 每个系统都要有对外提供API的能力
代表技术
- [容器化](/操作系统/容器化.html)
- [微服务](/软件工程/微服务/微服务.html)
- [服务网格](/软件工程/微服务/ServiceMesh/ServiceMesh.html)
- [不可变基础设施](/运维/K8s.html)
- 声明式设计
- [DevOps](/软件工程/DevOps.html)
基础架构
IaC
基础设施即代码(Infrastructure as code)是一种自动化基础设施管理的方法,其可以通过声明式或者过程式的方式来对基础设施资源进行管理,其有不可变、可追踪、可重复、自动化等特点。
mindmap Iac 面向主机 Puppet/Saltstack Ansible 面向云 Terraform/Pulumi AWS Cloudformation Google Cloud Deployment Manager 面向应用 k8s
# terraform example# Create an EC2 instanceresource "aws_instance" "example" { ami = "ami-785db401" instance_type = "t2.micro" tags { Name = "terraform-example" }}