什么是云原生
文章目录
基本概念
- 公有云、私有云、混合云
- 构建可弹性扩展的应用
- 代表技术:容器、服务网格、微服务、不可变基础设施、声明式 API
- 容错性好、易于管理、便于观察的松耦合系统
- 可靠的自动化手段
- 工程师能够轻松地对系统做出频繁和可预测的重大变更
- 厂商中立的开源生态系统
12 factor
- I.基准代码
- 一份基准代码,多份部署
- II.依赖显式声明依赖关系
- III.配置在环境中存储配置
- 环境类(如 prod,dev,staging)的配置,使用环境变量管理
- 配置分组 (按环境分组也可以)
- IV.后端服务把后端服务当作附加资源
- 后端服务统一抽象成外部资源
- 外部资源切换时,只需修改一行代码/配置
- V.构建,发布,运行严格分离构建和运行
- 构建阶段:是指将代码仓库转化为可执行包的过程。构建时会使用指 定版本的代码,获取和打包 依赖项,编译成二进制文件和资源文件。
- 发布阶段:会将构建的结果和当前部署所需 配置 相结合,并能够立刻 在运行环境中投入使用。
- 运行阶段:(或者说“运行时”)是指针对选定的发布版本,在执行环境 中启动一系列应用程序 进程。
- VI.进程以一个或多个无状态进程运行应用
- 一个或多个进程运行
- 无状态无共享,持久化数据在数据库中
- 反对 sticky session
- VII.端口绑定
- 通过端口绑定提供服务
- VIII.并发通过进程模型进行扩展
- 通过进程模型进行扩展
- 需要提高服务能力,只要增加无状态的进程数就可以
- 借助 systemd 之类的工具管理 stdin, stdout 和崩溃输出
- IX.易处理快速启动和优雅终止可最大化健壮性
- 进程可以快速起动停止
- 处理 sigterm 优雅中止
- 客户端丢失连接后主动重连
- 底层设施崩溃时进程仍然要保持健壮(不能一崩不起)
- X.开发环境与线上环境等价尽可能的保持开发,预发布,线上环境相同
- 尽可能保持开发、预发布、线上环境一致(不能线下依赖 mysql,线上 依赖 oracle,不能线下 Go 1.17,线上 1.14)
- 持续部署
- 更广义的环境一致是很难做的
- XI.日志把日志当作事件流
- 把日志当成事件流
- 日志收集、分析系统
- 计算图形化,系统化
- 根据事件流报警
- XII.管理进程后台管理任务当作一次性进程运行
- 一次性管理进程:如数据库的 migration,应该与线上服务使用相同的 环境
- 所有类型的进程依赖管理环境应该一致(比如 py 用 pyenv,其它语言 没法用)
设计理念
- 面向分布式设计(Distribution):容器、微服务、API 驱动的开发;
- 面向配置设计(Configuration):一个镜像,多个环境配置;
- 面向韧性设计(Resistancy):故障容忍和自愈;
- 面向弹性设计(Elasticity):弹性扩展和对环境变化(负载)做出响应;
- 面向交付设计(Delivery):自动拉起,缩短交付时间;
- 面向性能设计(Performance):响应式,并发和资源高效利用;
- 面向自动化设计(Automation):自动化的 DevOps;
- 面向诊断性设计(Diagnosability):集群级别的日志、metric 和追踪;
- 面向安全性设计(Security):安全端点、API Gateway、端到端加密;
弹性设计
- ASGAverageCPUUtilization—平均 CPU 使用率
- ASGAverageNetworkIn—网卡平均接收字节数
- ASGAverageNetworkOut—网卡平均发送字节数
- ALBRequestCountPerTarget—每个实例完成的平均请求数
AutoScaling:
- 超过阈值自动扩容
- 低于阈值自动缩容
- 最小可用实例
- 最大扩容实例数
安全性设计
- Service Mesh 数据面,如 envoy,mosn:TLS 双向加密。
- Service Mesh 控制面,如 istio:证书管理,证书下发,服务认证。
- 身份管理服务,比如 Google Cloud 上的 Anthos ID Service:二进制文件验证,部署时安全检查
- 配置规则验证:按照安全,业务性质,合法性对配置变更进行校验
- 云节点加固:系统软件签名认证(secure boot),完整性验证(integrity verification)
- 安全容器,Sandbox 技术:工作负载隔离(典型项目,如 katacontainer, gvisor)
文章作者 Forz
上次更新 2021-09-18