k8s入门(kubernetes)--持续学习更新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35559756/article/details/81836814

为什么需要k8s

k8s像什么

​ 像管理牲畜一样管理你的服务(运行实例),而不是像宠物一样,同时提高资源的利用率,让开发者关注在应用开发本身,高可用的事情就交给Kubernetes。

what's_k8s_like

what's_k8s_like/files/what’s_k8s_like.jpg)

​ 不需要在应用层去实现服务治理、服务发现、服务管理、服务的扩缩容,将应用放到k8s集群中,使得可以通过k8s的一些api更加直观方便的管理应用实例,可量产、高一致性。

k8s有哪些同类产品

对比Apache Mesos& Mesosphere Marathon

​ Mesos 的目标则是资源共享,可以让企业把已经存在的业务负载,比如 Hadoop、Spark,放到一个共同管理的环境。(打个比方,就像做蛋糕,Mesos关注于怎么作出更好的奶油、巧克力等原料,K8S关注怎么做出一个用户喜欢的蛋糕)

​ Kubernetes的目标是业务层的调度,容器服务编排,服务发现等。

​ 所以说,如果只是用于容器集群管理,Kubernetes 更加合适,如果定制需求比较多,或者要搭建大数据平台,架构相对松耦合的 Mesos 显然更加合适。当然,Kubernetes也可以运行在Mesos上,这样两者可以结合。

业务模型对比

​ Mesos类似是零散的积木,需要自己组装实现自己的业务模型,Kubernetes就是组装好的积木,直接拿来用就好了。(Mesos自身定义为一个分布式内核,也就是最核心的资源管理它帮你实现了,如果自己实现业务调度,那么就需要公司有一定的开发能力,当然了,一般的需求使用Mesos的框架Marathon和Aurora等也能满足了)

业务类型对比

​ k8s 几乎支持了所有的容器业务类型,包含长期伺服型(long-running)、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用型(stateful application);

​ mesos 这边设计思路就完全不同,它实际上将这个问题丢给不同的调度器来完成,不同的任务类型需要使用不同的调度器,比如上面提到的 marathon 就是长期伺服型(long-running)。

稳定性对比

​ k8s 从代码提交结果来看和 docker 一样,选择的是快速迭代来完成自身的进化,这样随之带来的问题就是可能会牺牲一些稳定性。

​ mesos 的迭代周期相对比较慢,这样带来了更大的稳定性。而各调度器迭代速度并不一致,有快有慢,需要特定去看,但如果就 marathon 而言,还是相当稳定的。

功能对比

​ k8s 因为推出的比较晚,并吸纳量大量google和其他产品经验,所以从整体设计上相对比较完整,比如网络层推出了自己的整合方案。(虽然不好用)

​ mesos 系统的设计思路则定义了任务调度和功能上整体依赖于调度器的设计。所以可以把 mesos 看成一个大乐高底层的基础板。

调度大小对比

​ 开源的Kubernetes 目前还局限于数千,万级节点还需要定制化,而 Apache Mesos 可以轻量级地调度万级节点。

​ 随着数量级的改变,如何选择容器化技术栈:

​ 千节点集群,少定制:使用开源 Kubernetes (细粒度设计,契合微服务思想)

​ 万节点集群,多定制:使用 Mesos + Marathon (双层调度好犀利)

​ 万节点集群,IT 能力强:深度定制 Kubernetes (如网易云)

​ 万节点集群,IT 能力强:深入掌握使用 DC/OS (DC/OS 在最基础的 Marathon 和 Mesos 之上添加了很多的组件)

​ 大数据集群:Spark on Mesos (建议只基于容器部署计算部分,数据部分另行部署)

实际上

​ 其实,两个系统根本就不在一个维度。更谈不上什么可比性。也可以说明为什么mesos圈里,有人研究在 mesos 系统上发布 k8s 作为 mesos 的调度器解决方案。那么为什么这么多人都要用这两种系统进行比较呢。那是因为单独的 mesos 本身是无法独立进行使用的,通常需要使用任务调度器来使用,比如现在流行的 marathon。 又因为 marathon 提供了容器任务的管理能力,所以很容易让不熟悉的人误认为 mesos 和 k8s 是一类系统。

对比OpenStack

​ Kubernetes是把OpenStack里面的VM换成了容器,但是实现地更漂亮,更精简,更抽象和本质化,用起来也更容易。

对比Docker Swarm

k8s解决了什么问题

k8s是什么

什么是调度(scheduling)?

​ 为了使得集群的资源被高效利用,支持用户提供的配置约束(placement constraint),能够迅速调度应用以此保证它们不会处于待定状态(pending state),有一定程度的“公平”(fairness),具有一定的鲁棒性和可用性。通常包含以下三种:

what's_scheduling

what's_scheduling/files/what’s_scheduling.png)

分别是:

​ 一体式调度(Monolithic scheduling):

​ 由单一的调度代理(scheduling agent)组成,它负责处理所有的请求,这种框架通常应用于高性能计算。一体式框架通常实现了一个单一的算法来处理所有的作业(job),因此根据作业的类型来运行不同的调度逻辑是困难的。

​ Apache Hadoop YARN是一个非常流行的架构,尽管它将许多调度功能都分发到每一个应用模块中,但它依然是一体式的调度架构,因为,实际上,所有的资源请求都会被发送到一个单一的全局调度模块。

​ 两级调度(Two-level scheduling):

​ 利用一个中央协调器(central coordinator)来动态地决定各个调度模块可以调用多少资源。这项技术被应用于Mesos和Hadoop-on-Demand(现在被YARN取代了)。

​ 在这类架构里,分配器会将给定的资源一次性分配一个框架,因此避免了资源使用的冲突,并且通过控制资源分配的顺序和大小来实现一种相对的资源公平分配。然而,一个资源每次只能被一个框架使用,因此并发控制被称之为悲观的(pessimistic),这种控制策略是不易于出错的(less error-prone),但是相对于将一个资源同时分配个多个框架的乐观并发式控制来说,速度是更慢的。

​ 共享状态调度(Shared-state scheduling) :

​ Omega 赋予了每一个调度器(scheduler)对整个集群的全部访问权限,也就是说调度器们可以自由地竞争。因为所有的资源分配都发生在各个调度器中,所以也就没有了中央资源分配器。也就是说,没有了中央策略引擎,每一个调度器能够自己做决定。

​ 通过支持独立的调度器实现和公布整个资源分配的状况,Omega不仅支持扩展多个调度器,还能够支持它们自己的调度策略。

什么是容器(container)?

​ 容器是虚拟机的一种替代品,它能够帮助开发者构建、迁移、部署和实例化应用。一个容器是进程的集合,这些进程独立于包含有进程依赖的机器。

​ 各个容器尽管共享了一个操作系统实例,但是它们独立运行,互不影响。容器并不需要一个完整的操作系统,这个特性使得它们比虚拟机更加轻量。

​ 因为容器能够在数秒内启动(比虚拟机快多了),因此容器仅分配了少量的资源(少于2GB的RAM)并且能通过扩展来满足应用的需求。容器经常被应用于微服务(microservices),每一容器代表一个服务,这些服务通过网络来进行互联。这种架构使得每一个模块都能够被独立地部署和扩展。

​ 资源的数量和所期望的容器生命周期是普通调度器和容器调度器的主要区别。传统集群设计,比如说Hadoop,更关注于运行大规模作业,然而容器集群则会运行几十个小的实例来解决问题,这些实例需要被组织化和网络化,以此来优化共享数据和计算的能力。

​ 典型代表:Docker

​ Docker是一个主流容器管理工具,它是第一个基于Linux容器(LXC)的,但是现在被runC所取代了(runC是是一个由Open Containers Initiative开发的CLI工具,它能够创建和运行容器)。Docker容器支持分层的文件系统,因此它能够和宿主机共享系统内核。这个特性意味着即便一个Docker镜像基于一个1GB的操作系统,在同一个主机上运行10个容器实例并不需要消耗10GB的空间,相比之下,每一台虚拟机都需要一个完整的1GB操作系统。

what's_docker

what's_docker/files/what’s_docker.png)

​ Docker的镜像可以理解为一个操作系统的快照。如果你想要创建一个新的镜像,你需要启动一个基础镜像,然后做一些修改,最后提交修改,形成新的镜像。这些镜像能够发布在私有或者公有的库上供其他开发者使用,开发者只需要将镜像pull下来即可。

​ 使用镜像可以非常方便的创建操作系统的快照,并且使用它们来创建新的容器,这些功能非常的轻量和易用,这些都是Docer CLI和商业模式的核心。

​ 容器包含了所有运行所需要的东西(代码,运行时,系统工具,库),因此Docker给予开发者一个轻量的,稳定的环境来快速地进行创建和运行作业。

什么是容器调度(Description of container schedulers)?

​ 容器调度工具的主要任务就是负责在最合适的主机上启动容器,并且将它们关联起来。它必须能够通过自动的故障转移(fail-overs)来处理错误,并且当一个实例不足以处理/计算数据时,它能够扩展容器来解决问题。

组成部门

核心原理

k8s怎么搭建

手动搭建(适合新手学习原理、离线环境搭建)

自动搭建(适合有经验者大规模搭建、初学者跳过原理进行体验)

参考文档

文档标题 链接(url)
Kubernetes 架构浅析 https://www.jianshu.com/p/a72f00d790fc
Kubernetes和Mesos有啥区别,我该使用哪个好? https://www.zhihu.com/question/53751176
巅峰对决之Swarm、Kubernetes、Mesos http://dockone.io/article/1138

猜你喜欢

转载自blog.csdn.net/qq_35559756/article/details/81836814