毕业论文
您现在的位置: 版本控制 >> 版本控制资源 >> 正文 >> 正文

技术分享Kubernetes核心概念

来源:版本控制 时间:2023/5/2

一、什么是Kubernetes

Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在一些常见的资料中也会看到“ks”这个词,也就是“k8s”,它是通过将8个字母“ubernete”替换为“8”而导致的一个缩写。Kubernetes为什么要用“舵手”来命名呢?大家可以看一下这张图:

这是一艘载着一堆集装箱的轮船,轮船在大海上运着集装箱奔波,把集装箱送到它们该去的地方。我们之前其实介绍过一个概念叫做container,container这个英文单词也有另外的一个意思就是“集装箱”。Kubernetes也就借着这个寓意,希望成为运送集装箱的一个轮船,来帮助我们管理这些集装箱,也就是管理这些容器。

深入剖析Kubernetes京东月销量好评率98%无理由退换京东配送官方店¥68.2购买

这个就是为什么会选用Kubernetes这个词来代表这个项目的原因。更具体一点地来说:Kubernetes是一个自动化的容器编排平台,它负责应用的部署、应用的弹性以及应用的管理,这些都是基于容器的。

二、Kubernetes有如下几个核心的功能:

服务的发现与负载的均衡;容器的自动装箱,我们也会把它叫做scheduling,就是“调度”,把一个容器放到一个集群的某一个机器上,Kubernetes会帮助我们去做存储的编排,让存储的生命周期与容器的生命周期能有一个连接;Kubernetes会帮助我们去做自动化的容器的恢复。在一个集群中,经常会出现宿主机的问题或者说是OS的问题,导致容器本身的不可用,Kubernetes会自动地对这些不可用的容器进行恢复;Kubernetes会帮助我们去做应用的自动发布与应用的回滚,以及与应用相关的配置密文的管理;对于job类型任务,Kubernetes可以去做批量的执行;为了让这个集群、这个应用更富有弹性,Kubernetes也支持水平的伸缩。下面,我们希望以三个例子跟大家更切实地介绍一下Kubernetes的能力

1、调度

Kubernetes可以把用户提交的容器放到Kubernetes管理的集群的某一台节点上去。Kubernetes的调度器是执行这项能力的组件,它会观察正在被调度的这个容器的大小、规格。

比如说它所需要的CPU以及它所需要的memory,然后在集群中找一台相对比较空闲的机器来进行一次placement,也就是一次放置的操作。在这个例子中,它可能会把红颜色的这个容器放置到第二个空闲的机器上,来完成一次调度的工作。

2、自动修复

Kubernetes有一个节点健康检查的功能,它会监测这个集群中所有的宿主机,当宿主机本身出现故障,或者软件出现故障的时候,这个节点健康检查会自动对它进行发现。下面Kubernetes会把运行在这些失败节点上的容器进行自动迁移,迁移到一个正在健康运行的宿主机上,来完成集群内容器的一个自动恢复。

3、水平伸缩

Kubernetes有业务负载检查的能力,它会监测业务上所承担的负载,如果这个业务本身的CPU利用率过高,或者响应时间过长,它可以对这个业务进行一次扩容。

比如说在下面的例子中,黄颜色的过度忙碌,Kubernetes就可以把黄颜色负载从一份变为三份。接下来,它就可以通过负载均衡把原来打到第一个黄颜色上的负载平均分到三个黄颜色的负载上去,以此来提高响应的时间。

以上就是Kubernetes三个核心能力的简单介绍。

三、Kubernetes的架构

Kubernetes架构是一个比较典型的二层架构和server-client架构。Master作为中央的管控节点,会去与Node进行一个连接。

所有UI的、clients、这些user侧的组件,只会和Master进行连接,把希望的状态或者想执行的命令下发给Master,Master会把这些命令或者状态下发给相应的节点,进行最终的执行。

Kubernetes的Master包含四个主要的组件:APIServer、Controller、Scheduler以及etcd。如下图所示:

APIServer:顾名思义是用来处理API操作的,Kubernetes中所有的组件都会和APIServer进行连接,组件与组件之间一般不进行独立的连接,都依赖于APIServer进行消息的传送;Controller:是控制器,它用来完成对集群状态的一些管理。比如刚刚我们提到的两个例子之中,第一个自动对容器进行修复、第二个自动进行水平扩张,都是由Kubernetes中的Controller来进行完成的;Scheduler:是调度器,“调度器”顾名思义就是完成调度的操作,就是我们刚才介绍的第一个例子中,把一个用户提交的Container,依据它对CPU、对memory请求大小,找一台合适的节点,进行放置;etcd:是一个分布式的一个存储系统,APIServer中所需要的这些原信息都被放置在etcd中,etcd本身是一个高可用系统,通过etcd保证整个Kubernetes的Master组件的高可用性。我们刚刚提到的APIServer,它本身在部署结构上是一个可以水平扩展的一个部署组件;Controller是一个可以进行热备的一个部署组件,它只有一个active,它的调度器也是相应的,虽然只有一个active,但是可以进行热备。

Kubernetes的架构:Node

Kubernetes的Node是真正运行业务负载的,每个业务负载会以Pod的形式运行。等一下我会介绍一下Pod的概念。一个Pod中运行的一个或者多个容器,真正去运行这些Pod的组件的是叫做kubelet,也就是Node上最为关键的组件,它通过APIServer接收到所需要Pod运行的状态,然后提交到我们下面画的这个ContainerRuntime组件中。

在OS上去创建容器所需要运行的环境,最终把容器或者Pod运行起来,也需要对存储跟网络进行管理。Kubernetes并不会直接进行网络存储的操作,他们会靠StoragePlugin或者是网络的Plugin来进行操作。用户自己或者云厂商都会去写相应的StoragePlugin或者NetworkPlugin,去完成存储操作或网络操作。

在Kubernetes自己的环境中,也会有Kubernetes的Network,它是为了提供Servicenetwork来进行搭网组网的。(等一下我们也会去介绍“service”这个概念。)真正完成service组网的组件的是Kube-proxy,它是利用了iptable的能力来进行组建Kubernetes的Network,就是clusternetwork,以上就是Node上面的四个组件。

Kubernetes的Node并不会直接和user进行interaction,它的interaction只会通过Master。而User是通过Master向节点下发这些信息的。Kubernetes每个Node上,都会运行我们刚才提到的这几个组件。

下面我们以一个例子再去看一下Kubernetes架构中的这些组件,是如何互相进行interaction的。

用户可以通过UI或者CLI提交一个Pod给Kubernetes进行部署,这个Pod请求首先会通过CLI或者UI提交给KubernetesAPIServer,下一步APIServer会把这个信息写入到它的存储系统etcd,之后Scheduler会通过APIServer的watch或者叫做notification机制得到这个信息:有一个Pod需要被调度。

这个时候Scheduler会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向APIServerreport说:“OK!这个Pod需要被调度到某一个节点上。”

这个时候APIServer接收到这次操作之后,会把这次的结果再次写到etcd中,然后APIServer会通知相应的节点进行这次Pod真正的执行启动。相应节点的kubelet会得到这个通知,kubelet就会去调Containerruntime来真正去启动配置这个容器和这个容器的运行环境,去调度StoragePlugin来去配置存储,networkPlugin去配置网络。

这个例子我们可以看到:这些组件之间是如何相互沟通相互通信,协调来完成一次Pod的调度执行操作的。

四、Kubernetes的核心概念与它的API

第一个概念:Pod

Pod是Kubernetes的一个最小调度以及资源单元。用户可以通过Kubernetes的PodAPI生产一个Pod,让Kubernetes对这个Pod进行调度,也就是把它放在某一个Kubernetes管理的节点上运行起来。一个Pod简单来说是对一组容器的抽象,它里面会包含一个或多个容器。

比如像下面的这幅图里面,它包含了两个容器,每个容器可以指定它所需要资源大小。比如说,一个核一个G,或者说0.5个核,0.5个G。

当然在这个Pod中也可以包含一些其他所需要的资源:比如说我们所看到的Volume卷这个存储资源;比如说我们需要个GB的存储或者20GB的另外一个存储。

在Pod里面,我们也可以去定义容器所需要运行的方式。比如说运行容器的Command,以及运行容器的环境变量等等。Pod这个抽象也给这些容器提供了一个共享的运行环境,它们会共享同一个网络环境,这些容器可以用localhost来进行直接的连接。而Pod与Pod之间,是互相有isolation隔离的。

第二个概念:Volume

Volume就是卷的概念,它是用来管理Kubernetes存储的,是用来声明在Pod中的容器可以访问文件目录的,一个卷可以被挂载在Pod中一个或者多个容器的指定路径下面。

而Volume本身是一个抽象的概念,一个Volume可以去支持多种的后端的存储。比如说Kubernetes的Volume就支持了很多存储插件,它可以支持本地的存储,可以支持分布式的存储,比如说像ceph,GlusterFS;它也可以支持云存储,比如说阿里云上的云盘、AWS上的云盘、Google上的云盘等等。

第三个概念:Deployment

Deployment是在Pod这个抽象上更为上层的一个抽象,它可以定义一组Pod的副本数目、以及这个Pod的版本。一般大家用Deployment这个抽象来做应用的真正的管理,而Pod是组成Deployment最小的单元。

Kubernetes是通过Controller,也就是我们刚才提到的控制器去维护Deployment中Pod的数目,它也会去帮助Deployment自动恢复失败的Pod。

比如说我可以定义一个Deployment,这个Deployment里面需要两个Pod,当一个Pod失败的时候,控制器就会监测到,它重新把Deployment中的Pod数目从一个恢复到两个,通过再去新生成一个Pod。通过控制器,我们也会帮助完成发布的策略。比如说进行滚动升级,进行重新生成的升级,或者进行版本的回滚。

第四个概念:Service

Service提供了一个或者多个Pod实例的稳定访问地址。

比如在上面的例子中,我们看到:一个Deployment可能有两个甚至更多个完全相同的Pod。对于一个外部的用户来讲,访问哪个Pod其实都是一样的,所以它希望做一次负载均衡,在做负载均衡的同时,我只想访问某一个固定的VIP,也就是VirtualIP地址,而不希望得知每一个具体的Pod的IP地址。

我们刚才提到,这个pod本身可能terminalgo(终止),如果一个Pod失败了,可能会换成另外一个新的。

对一个外部用户来讲,提供了多个具体的Pod地址,这个用户要不停地去更新Pod地址,当这个Pod再失败重启之后,我们希望有一个抽象,把所有Pod的访问能力抽象成一个第三方的一个IP地址,实现这个的Kubernetes的抽象就叫Service。

实现Service有多种方式,Kubernetes支持ClusterIP,上面我们讲过的kuber-proxy的组网,它也支持nodePort、LoadBalancer等其他的一些访问的能力。

第五个概念:Namespace

Namespace是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes的每个资源,比如刚才讲的Pod、Deployment、Service都属于一个Namespace,同一个Namespace中的资源需要命名的唯一性,不同的Namespace中的资源可以重名。

Namespace一个用例,比如像在阿里巴巴,内部会有很多个businessunits,在每一个businessunits之间,希望有一个视图上的隔离,并且在鉴权上也不一样,在cuda上面也不一样,我们就会用Namespace来去给每一个BU提供一个他所看到的这么一个看到的隔离的机制。

Kubernetes的API

下面我们介绍一下Kubernetes的API的基础知识。从high-level上看,KubernetesAPI是由HTTP+JSON组成的:用户访问的方式是HTTP,访问的API中content的内容是JSON格式的。

Kubernetes的kubectl也就是

转载请注明:http://www.0431gb208.com/sjslczl/4460.html