Kubernetes入门系列#01 分布式系统和Kubernetes简介

随着网络的发展,网络用户和数据流量不断增加,一台物理服务器已经越来越无法满足大量的网络请求,促进了分布式服务和负载均衡的诞生。Kubernetes是这些框架中的佼佼者之一。

在Kubernetes开发前,分布式服务有以下几种负载均衡的办法:

  • 使用一台负载均衡服务器(物理机),将网络入包分配给连接到它的设备。这台负载均衡服务器不需要解析和响应网络入包,只需要做简单的转发,因此负载比起后端机器来说小很多。有一些负载均衡服务器会读取协议头,并确保来自同一个客户端的请求总会被发到同一台后端机器上。
  • 使用基于地理位置的DNS。在不同地区请求同一个域名的DNS,得到的是不同的IP,使不同区域的客户端连接不同的服务器。不同区域的服务器之间如果需要共享数据的话,可以使用各种consensus算法进行数据的同步

例如,Apache Zookeeper 就是一个这类的框架,提供了一些分布式系统中常用的算法,比如选举算法,并且提供了一套。它需要比较繁琐的设置,灵活性较差,而且在有更大的需求时需要手动进行扩容。

Kubernetes 概念介绍

Kubernetes是一个分布式框架和管理系统。同传统的分布式系统不同,Kubernetes不以物理机为最小单位,而是以容器为最小的单位,同一台物理机可以运行多种容器、多个实例。容器可以通过多种方式构建,比如Docker镜像和LXC容器。但是最常用的还是Docker镜像。

用户配置的物理机称为节点(Node)。用户在各个节点上使用类似于 kubeadm 的工具安装Kubernetes运行时,并配置个物理机之间的连接,之后可以从任意终端连接到Kubernetes集群进行管理。Kubernetes集群的成员机并不需要在同一个数据中心内——各个节点可以处在不同地理位置的不同数据中心,只要它们之间有一个稳定的网络连接。从用户的角度来看,所有物理节点的资源是统一的。除非进行特殊的配置(比如进行taint和label的配置),用户不需要关心各项资源具体存在于哪个物理机上。然而,配置Kubernetes物理机仍然不是一个轻松的工作。所幸现在各大云服务商都提供了Kubernetes服务,可以为用户自动分配云端资源,并配置Kubernetes集群所需要的集群内网,DNS发现服务等。

Kubernetes的配置逻辑是 “state-of-intent”,即用户的配置文件告诉Kubernetes的是 “我想要这个集群最终达到的状态”,而并不需要关心具体的实现过程。Kubernetes会自动在各个物理节点之间分配资源或迁移容器,使得各个服务器的负载和剩余资源平衡。有一些Kubernetes提供商还支持动态扩容和动态缩减,在负载较高时自动分配新的物理机,而在负载低时关闭不需要的物理机,节省服务器资源。Kubernetes会根据用户的需求自动启动,迁移容器,检测各个容器的运行状况,收集容器的日志,重启失败的容器等。在容器内的应用程序需要更新时,Kubernetes还可以对整个集群进行动态更新,保证服务在更新期间仍然可用,不需要离线升级。

但是需要注意的一点是,所有容器对于Kubernetes来说,生存时间都是短暂的,可牺牲的(官方文档为ephemeral)。这就意味着,为了调度需要,一个容器可能随时被Kubernetes关闭。Kubernetes启动的新容器只会包含容器镜像中的内容,而不会包含之前关闭的容器写入到硬盘或内存的任何内容。这对于无状态的应用来说并不是问题,因为所有运行所需要的资源和代码可以提前打包至镜像中。而对于富状态,需要存储运行数据的应用,Kubernetes提供了富状态集(StatefulSet)和持久卷(PersistentVolume)。富状态集中的容器拥有编号且一一对应,容器在重启时可以从持久卷中读取上一个实例之前保存的数据。

同时,Kubernetes内的应用是基于容器的,并且提供了REST API和集群内DNS服务,供各个容器查询/更改集群状态或是连接到集群内的其他服务。也就是说用户并不受开发语言的束缚,可以使用任意语言开发自己的程序,只需要最后和运行时一起打包成容器就可以。Kubernetes也提供了各种语言的API套件,可以自动在容器中获取集群的访问令牌,让用户应用能够方便地查询集群的资源和状况。

总结:相较于其他分布式框架来说,Kubernetes的结构更为灵活,管理更为方便,对于stateless(无状态)应用(比如静态网页服务,机器学习计算单元,微服务)来说十分友好,而富状态(stateful)的应用(例如数据库)也可以在集群中通过富状态集和持久卷来实现。

结语

Kubernetes作为谷歌开发的一个分布式框架,首先在谷歌内部进行了大规模的部署和应用,之后成为了一个开源项目,由原生云计算基金会(CNCF)开发并维护。目前各大云服务提供商(如Azure(AKS, Azure Kubernetes Service), AWS(EKS, Elastic Kubernetes Service), Google Cloud (GKE, Google Kubernetes Engine) ,以及国内的腾讯云、阿里云等,均提供了Kubernetes服务。只要肯付出一点初始配置工作,在本地机器上配置Kubernetes也并不难。

Kubernetes因为上述的各种特性和优点,被一些人称为“分布式系统中的Linux”,即它在分布式系统中的地位和重要性相当于Linux在操作系统中的地位和重要性。虽然VirtualWorks目前并没有适合部署在Kubernetes上的服务,但是VirtualWorks成员的机器学习和分布式数据库项目中,Kubernetes正在被大量地使用着。

This article was written by MetricVoid and originally published on vworks.cc. Citations should include the source.

Leave A Comment