云原生:
将应用程序构建为微服务,并将其运行在完全动态地利用云计算模型优势的容器编排平台上的方法。云原生主要关注的是如何创建和部署程序,而不是运行在哪里。
设计云原生应用可以从如下考虑:
- 松耦合的微服务:按照业务功能设计成微服务,之间通过轻量级协议通信(例如HTTP)
- 无状态且可规模化部署
- 故障的容忍性和弹性:跨数据中心、跨云厂商部署时,单个服务部分实例异常不影响整体服务的质量
1.1、云计算的变革
物理机–虚拟机–容器化
1.1.2、虚拟化时代
1.基础架构即服务(Infrastructure as a service 即 IaaS)
是对计算、网络、存储资源的抽象,提供这些资源的访问和监控服务。
IaaS 的用户在向云平台发出请求后,云平台只负责为用户提供基础资源,例如一个虚拟机。
在虚拟机上的应用的部署还是用户自己操作。
2.平台即服务(Platform as a Service,即PaaS)
PaaS解决问题的目标是面向应用的,一旦通过PaaS 创建应用实例,则网络拓扑已经搭建完毕,中间件和文件分发系统已经构建在操作系统中,用户只需要部署代码就可以访问应用。
平台即服务是在IaaS 的基础上,除提供基本的基础架构服务外,云平台会依据应用部署的目标环境分配存储,构建应用接入网络。解决如何访问应用等问题。还提供一些辅助的应用部署和运行的软件,如tomcat、nodejs等中间件。
就是发布、部署、访问等用户在使用的一些功能,例如使用阿里云。
3.软件即服务(software as a service,即SaaS)
云用户是软件用户,无需管理软件本身。例如开淘宝店铺。
1.1.3、容器化时代
- 1、容器的运行基于进程而非虚拟机,无须模拟操作系统。启动快,占用资源少。
- 2、容器基于Linux Namespace 技术隔离进程,Namespace 技术使用户进程拥有独立的网络配置、文件系统、用户空间、进程空间等。容器只是一个应用进程。
- 3、基于Linux Control Group 技术对应用户进程进行资源限定,为每一个容器实例分配CPU、Memory、磁盘I/O等资源,隔离同一个主机上的多个用户进程之间的干扰。
- 4、容器镜像是面向应用而不是操作系统的,可以像管理代码一样管理容器镜像源文件如Dockerfile,在其中编辑自己需要的软件代码,和操作步骤等。
- 5、容器支持分层的文件结构,当构建容器镜像时,Docker会将Dockerfile 中定义的每一行命令定义成一个文件层级,一个Docker 镜像就是多个文件层的集合。容器运行时,会按照镜像层级由下到上按层加载。
- 6、每个文件层都有基于其内容计算出来的Digest,在文件分发时,如果某个文件层未发生变化时,则无需重新拉取,由此解决增量文件部署的问题,只拉取变更的部分,减少带宽消耗。
- 7、容器镜像可以上传到镜像仓库,在任何其他计算节点上都可以从镜像仓库上拉取和运行镜像。
kubernetes 在容器化时代扮演了什么样的角色呢?
1、集群管理
以计算节点为核心,成规模的计算节点组成一个彼此网络互通的集群。监控和管理这些节点的健康状态和可用资源。
2、作业调度和作业管理
- 支持多种存储方式:本地的,公有云的
- 自动可控的升级和回退:容器更新时,可以有策略先创建新的,再删除老的
- 高利用率的调度机制:根据CPU、内存使用情况调度节点来运行容器,避免单个节点负载过高
- 自愈机制:容器退出或者服务不健康,能删除并且重建容器,并把它从服务端点移除,直到新的容器做好服务。
- 密码和配置管理:提供存储和管理敏感信息,例如密码口令,也可以管理配置信息,随时可以更新配置信息而不用重新编译容器镜像
3、服务发现和服务治理
容器能够利用DNS和集群IP 向集群内外提供服务,负载均衡到后端多个容器节点。
kubernetes核心竞争力是什么?
1、声明式系统
命令式系统:比如操作系统命令行或者同步API 调用,执行了命令等待响应并返回。命令式的请求不会被保存,命令执行结束以后,执行的命令会被丢弃。场景来越来复杂的时候,需要参数越来越多,就比较难以维护。
声明式系统:对业务的抽象,请求可以通过源码的形式保存,历史版本也可以保存和溯源。声明式追求最终一致性,系统一直尝试,并使实际状态一致,整个系统使用异步调用。
2、控制器模式
kubernetes 每种抽象出来的对象,都有对应的控制器组件。每个控制器监听其所关注的对象的变更,然后按照对象中最新的期望状态进行系统配置,配置完成后,更新该对象的实际状态,这些控制器通力合作,负责让整个服务与用户的期望一致。
3、插件化
kubernetes 提供了插件化框架,提供了容器运行接口,容器存储接口,容器网络接口,使得不同的企业可按需订制方案。可以适合多种不同的企业,不同的底层服务和方案等。
4、标准化推动
kubernetes 社区提供了标准化的解决方案,例如Istio解决流量管理标准化,Knative 解决无服务架构。
这些项目组成一个完整的生态,解决各种问题。