12 因素应用
12 因素应用
1. 基准代码
每个代码仓库(repo)都生成 docker image 保存到镜像仓库中,并使用唯一的 ID 管理,在 Jenkins 中使用编译时的 ID。
2. 依赖
显式的声明代码中的依赖,使用软件包管理工具声明,比如 Go 中的 Glide。
3. 配置
将配置与代码分离,应用部署到 Kubernetes 中可以使用容器的环境变量或 ConfigMap 挂载到容器中。
4. 后端服务
把后端服务当作附加资源,实质上是计算存储分离和降低服务耦合,分解单体应用。
5. 构建、发布、运行
严格分离构建和运行,每次修改代码生成新的镜像,重新发布,不能直接修改运行时的代码和配置。
6. 进程
应用程序进程应该是无状态的,这意味着再次重启后还可以计算出原先的状态。
7. 端口绑定
在 Kubernetes 中每个 Pod 都有独立的 IP,每个运行在 Pod 中的应用不必关心端口是否重复,只需在 service 中指定端口,集群内的 service 通过配置互相发现。
8. 并发
每个容器都是一个进程,通过增加容器的副本数实现并发。
9. 易处理
快速启动和优雅终止可最大化健壮性,Kuberentes 优秀的 Pod 生存周期控制。
10. 开发环境与线上环境等价
在 Kubernetes 中可以创建多个 namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像的使用可以很方便的部署一个后端服务。
11. 日志
把日志当作事件流,使用 stdout 输出并收集汇聚起来,例如到 ES 中统一查看。
12. 管理进程
后台管理任务当作一次性进程运行,kubectl exec
进入容器内部操作。
另外,Cloud Native Go 这本书的作者,CapitalOne 公司的 Kevin Hoffman 在 TalkingData T11 峰会上的 High Level Cloud Native 的演讲中讲述了云原生应用的 15 个因素,在原先的 12 因素应用的基础上又增加了如下三个因素:
API 优先
- 服务间的合约
- 团队协作的规约
- 文档化、规范化
- RESTful 或 RPC
监控
- 实时监控远程应用
- 应用性能监控(APM)
- 应用健康监控
- 系统日志
- 不建议在线 Debug
认证授权
- 不要等最后才去考虑应用的安全性
- 详细设计、明确声明、文档化
- Bearer token、OAuth、OIDC 认证
- 操作审计