首先,Kubernetes是一个全新的基于容器技术的分布式架构领先方案。Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:
转存失败重新上传取消转存失败重新上传取消
Kubectl:Kubernetes的命令行工具,用于执行CRUD相关操作。
Kubelet:Kubelet负责管理pods和它们上面的容器,images镜像、volumes、etc。
Kube-proxy:每一个节点(node)也运行一个简单的网络代理和负载均衡,即Kube-proxy,正如Kubernetes API里面定义的这些服务也可以在各种终端中以轮询的方式做一些简单的TCP和UDP传输。服务端点目前是通过DNS或者环境变量。这些变量由服务代理所管理的端口来解析。
Kubernetes控制面板:Kubernetes控制面板可以分为多个部分。目前它们都运行在一个master 节点,然而为了达到高可用性,这需要改变。不同部分一起协作提供一个统一的关于集群的视图。
etcd:所有master节点的持续状态都存在etcd的一个实例中。这可以很好地存储配置数据。因为有watch(观察者)的支持,各部件协调中的改变可以很快被察觉。
Kubernetes API Server:API服务提供Kubernetes API的服务。这个服务试图通过把所有或者大部分的业务逻辑在单独的组件或插件中实现,从而使其具有CRUD特性。它主要处理REST操作,并在etcd中验证更新这些对象(最终存储)。
Scheduler:调度器把未调度的pod通过binding api绑定到节点上。调度器是可插拔的,并且我们期待支持多集群的调度,未来甚至希望可以支持用户自定义的调度器(已经支持)。
Kubernetes控制管理服务器:所有其它的集群级别的功能目前都是由控制管理器所负责。例如,端点对象是被端点控制器来创建和更新。这些最终可以被分隔成不同的部件来让它们独自的可插拔。
Replication Controller:它是建立于简单的 pod API之上的一种机制,可以维持集群环境中目标pod的副本数等。
如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。运用Kubernetes技术,我们可以实现:
传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。
Kubernetes采用容器化方式部署应用,容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势。使用容器可以在build或release 的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。
传统的应用部署流程主要是通过将应用打包(jar或war等)部署在tomcat等web应用容器中,通过启动一个进程来实现应用的运行。当应用越来越多,对于多个应用的管理显得力不从心,应用与应用之间的关系也变得甚为复杂,当一个服务出现问题,可能会引发整体服务的崩溃,却不知从何查起。
Kubernetes提供容器化部署的环境,将每个微服务都以容器化的方式部署在这个环境中,可以实时控制应用的副本数、管理应用的生命周期和资源分配、以及实现对应用的实时监控等。不仅能针对单个应用个体进行管理,还能从整体查看全部应用的运行状态以及单个应用对全部应用的影响。
针对于传统应用部署场景,如果我们需要实现应用的多实例和负载均衡,我们需要针对单个应用启动多个不同的进程,并为每个进程分配不同的端口,再结合Nginx等负载均衡软件进行特定化配置来实现。该部署过程不仅复杂,而且由于引入了第三方的负载均衡软件,给后期的运维工作带来了诸多不确定性和额外的工作量。
Kubernetes自带的服务发现功能和Replication Controller模块可以轻松的通过参数修改实时进行应用的实例数控制,多个实例共用一个端口号避免端口资源的浪费。Kubernetes的Scheduler模块根据集群内每个节点(node)的资源状态,将实例分配到不同的节点上运行,实现资源的合理使用;同时Api Server根据每个实例的负载情况和运行状态进行服务请求调用的最优分配。即使某一个应用实例由于某种原因宕机,Kubernetes也会立即运行一个新的实例进行替换,时刻保持应用的实例维持在用户设置的数目,保证高可用。
Kubernetes通过配置应用容器的启动文件(Kubernetes部署应用所需的主要文件),可以方便地手动实现该应用正常运行所能获得的最高和最低资源条件,包括CPU、内存、GPU等资源,也可以选择放弃手动配置让Kubernetes根据应用运行状态和资源情况自动为其分配合理的资源,并保证应用的正常运行。
传统应用的部署依赖所在主机的环境配置,对硬件或者软件有一定的要求,由于不同环境不同主机本身的差异化,导致传统应用的部署或者迁移经常出现意想不到的问题。而Kubernetes架构下,每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间的进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。
目前比较流行的微服务架构主要是Spring Cloud。
Spring Cloud和Kubernetes有很大的不同,并没有直接可比的特性,如果对照微服务架构的要点,可以得出如下的技术对比图表:
转存失败重新上传取消转存失败重新上传取消
从上表我们可以得知:
Spring Cloud有一套丰富且集成良好的JAVA库,作为应用栈的一部分解决所有运行时问题。因此,微服务本身可以通过库和运行时代理解决客户端服务发现、负载均衡、配置更新、统计跟踪等。工作模式就像单实例服务集群并且一批工作也是在JVM中被管理。
Kubernetes是多语言的,不仅仅针对Java平台,而是以通用的方式为所有语言解决分布式计算问题。Kubernetes提供了配置管理、服务发现、负载均衡、跟踪、统计、单实例、平台级和应用栈之外的调度工作。该应用不需要任何客户端逻辑的库或代理程序,可以用任何语言编写。
两个平台依靠相似的第三方工具,如ELK和EFK stacks, tracing libraries等。Hystrix和Spring Boot等库,在两个环境中都表现良好。很多情况下,Spring Cloud和Kubernetes可以形成互补,组建出更强大的解决方案(例如KubeFlix和Spring Cloud Kubernetes)。
有些需求,Spring Cloud表现更好,有些需求则是Kubernetes更优,也有些需求,两者可以用不同的方式满足。Spring Cloud和Kubernetes在使用上并不冲突。例如,Spring Cloud提供Maven插件来创建单独Jar应用程序包。结合Docker、Kubernetes的声明式部署和调度能力,轻松运行微服务。同样,Spring Cloud以应用程序内的包装库的形式来支持弹性伸缩,微服务容错使用Hystrix(bulkhead和断路器模式)与Ribbon(负载均衡)。但这些是不够的,当组合Kubernetes健康检查、程序重启和自动伸缩能力,微服务才真正变成一个强壮的系统。
Spring Cloud为开发者提供了快速构建分布式系统中的一些常见模式的工具,例如配置管理,服务发现,断路器,路由等。它是为Java开发人员使用,构建在Netflix OSS库之上的。
优点:
缺点:
Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。支持多种语言并且提供用于支持、运行、扩展和管理分布式系统的操作系统。
优点:
缺点:
Spring Cloud和Kubernetes在核心领域都很强,并且在其他领域正努力改进。Spring Cloud可以快速使用,对开发者比较友好;而Kubernetes是DevOps的绝配,虽然学起来可能有点难,但是覆盖了更广泛的微服务技术要点。
Spring Cloud和Kubernetes处理了不同范围内的微服务架构技术点,而且使用了不同的方法。Spring Cloud方法是试图解决在JVM中的微服务架构要点,而Kubernetes方法是试图让问题消失,为开发者在平台层解决。Spring Cloud在JVM中非常强大,Kubernetes管理那些JVM很强大。
各取所长,充分利用这两者的优势是当下及未来的趋势。结合使用Spring Cloud和Kubernetes,用Spring Cloud提供应用程序打包,Docker和Kubernetes负责部署和调度;Spring通过Hystrix线程池提供应用程序内隔离,Kubernetes通过资源、进程和命名空间隔离;Spring为每个微服务提供健康终端,Kubernetes执行健康检查并且为健康服务的通信提供路由等服务。
转存失败重新上传取消转存失败重新上传取消
缀的文件:一个是和服务发现和端口映射相关的service文件;一个是和所需资源、 副本数、文件挂载配置等相关的RS、DS或Deployment等类型文件。
排错。
基于Spring Boot开发的Java微服务为例:
registry.guoyuan.com/test-pressure:1.0。
test-pressure-service.yaml、test-pressure-deployment.yaml
二者之间通过selector字段进行关联。
test-pressure-service.yaml
|
test-pressure-deployment.yaml
|
注:(本文中图片均来自于网络)