云计算包含的内容十分繁杂,也有很多技术和公司牵强附会说自己是云计算公司,说自己是做云的,实际上可能风马牛不相及。说白了,云计算就是一种配置资源的方式,根据资源配置方式的不同我们可以把云计算从宏观上分为以下三种类型:
IaaS:这是为了想要建立自己的商业模式并进行自定义的客户,例如亚马逊的EC2、S3存储、Rackspace虚拟机等都是IaaS。
PaaS:工具和服务的集合,对于想用它来构建自己的应用程序或者想快速得将应用程序部署到生产环境而不必关心底层硬件的用户和开发者来说是特别有用的,比如Cloud Foundry、Google App Engine、Heroku等。
SaaS:终端用户可以直接使用的应用程序。这个就太多,我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务,有的服务是免费的,比如Google Docs,还有更多的是根据我们购买的Plan和使用量付费,比如GitHub、各种云存储。
1.基准代码
每个代码仓库(repo)都生成docker image保存到镜像仓库中,并使用唯一的ID管理,在Jenkins中使用编译时的ID。
2.依赖
显式得声明代码中的依赖,使用软件包管理工具声明,比如Go中的Glide。
3.配置
将配置与代码分离,应用部署到kubernete中可以使用容器的环境变量或ConfigMap挂载到容器中。
4.后端服务
把后端服务当作附加资源,实质上是计算存储分离和降低服务耦合,分解单体应用。
5.构建、发布、运行
严格分离构建和运行,每次修改代码生成新的镜像,重新发布,不能直接修改运行时的代码和配置。
6.进程
应用程序进程应该是无状态的,这意味着再次重启后还可以计算出原先的状态。
7.端口绑定
在kubernetes中每个Pod都有独立的IP,每个运行在Pod中的应用不必关心端口是否重复,只需在service中指定端口,集群内的service通过配置互相发现。
8.并发
每个容器都是一个进程,通过增加容器的副本数实现并发。
9.易处理
快速启动和优雅终止可最大化健壮性,kuberentes优秀的Pod生存周期控制。
10.开发环境与线上环境等价
在kubernetes中可以创建多个namespace,使用相同的镜像可以很方便的复制一套环境出来,镜像的使用可以很方便的部署一个后端服务。
11.日志
把日志当作事件流,使用stdout输出并收集汇聚起来,例如到ES中统一查看。
12.管理进程
后台管理任务当作一次性进程运行,kubectl exec进入容器内部操作。
API优先
服务间的合约
团队协作的规约
文档化、规范化
RESTful或RPC
监控
实时监控远程应用
应用性能监控(APM)
应用健康监控
系统日志
不建议在线Debug
认证授权
不要等最后才去考虑应用的安全性
详细设计、明确声明、文档化
Bearer token、OAuth、OIDC认证
操作审计