正文
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进入容器内部操作。
另外,Cloud Native Go这本书的作者,CapitalOne 公司的Kevin Hoffman 在TalkingData T11 峰会上的High Level Cloud Native的演讲中讲述了云原生应用的 15 个因素,在原先的 12 因素应用的基础上又增加了如下三个因素:
API 优先
-
服务间的合约
-
团队协作的规约
-
文档化、规范化
-
RESTful 或 RPC
监控
-
实时监控远程应用
-
应用性能监控(APM)
-
应用健康监控
-
系统日志
-
不建议在线 Debug
认证授权
Kubernetes 通过声明式配置,真正让开发人员能够理解应用的状态,并通过同一份配置可以立马启动一个一模一样的环境,大大提高了应用开发和部署的效率,其中 kubernetes 设计的多种资源类型可以帮助我们定义应用的运行状态,并使用资源配置来细粒度得明确限制应用的资源使用。
Kubernetes 提供了多种资源对象,用户可以根据自己应用的特性加以选择。这些对象有:
在 Kubernetes 系统中,Kubernetes 对象 是持久化的条目。Kubernetes 使用这些条目去表示整个集群的状态。特别地,它们描述了如下信息:
Kubernetes 对象是 “目标性记录” —— 一旦创建对象,Kubernetes 系统将持续工作以确保对象存在。通过创建对象,可以有效地告知 Kubernetes 系统,所需要的集群工作负载看起来是什么样子的,这就是 Kubernetes 集群的
期望状态
。
两层的资源限制与配置:
手工部署 Kubernetes 是一个很艰巨的活,你需要了解网络配置、docker 的安装与使用、镜像仓库的构建、角色证书的创建、kubernetes 的基本原理和构成、kubernetes 应用程序的 yaml 文件编写等。
我编写了一本kubernetes-handbook(https://jimmysong.io/kubernetes-handbook/)可供大家免费阅读,该书记录了本人从零开始学习和使用 Kubernetes 的心路历程,着重于经验分享和总结,同时也会有相关的概念解析,希望能够帮助大家少踩坑,少走弯路。