Kubernetes学习之路(⼆⼗)之K8S组件运⾏原理详解总结⽬录
⼀、看图说K8S
先从⼀张⼤图来观看⼀下K8S是如何运作的,再具体去细化K8S的概念、组件以及⽹络模型。
从上图,我们可以看到K8S组件和逻辑及其复杂,但是这并不可怕,我们从宏观上先了解K8S是怎么⽤的,再进⾏庖丁解⽜。从上图我们可以看出:
Kubernetes集主要由Master和Node两类节点组成
Master的组件包括:apiserver、controller-manager、scheduler和etcd等⼏个组件,其中apiserver是整个集的⽹关。
Node主要由kubelet、kube-proxy、docker引擎等组件组成。kubelet是K8S集的⼯作与节点上的代理组件。
⼀个完整的K8S集,还包括CoreDNS、Prometheus(或HeapSter)、Dashboard、Ingress Controller等⼏个附加组件。其中cAdivsor组件作⽤于各个节点(master和node节点)之上,⽤于收集及收集容器及节点的CPU、内存以及磁盘资源的利⽤率指标数据,这些统计数据由Heapster聚合后,可以通过apiserver访问。
要了解K8S的所有组件,没去⾛⼀遍,永远不知道它是怎么跑起来的,那么下⾯就带着⼏个新⼿疑问来看K8S
1、K8S是如何对容器编排?
在K8S集中,容器并⾮最⼩的单位,K8S集中最⼩的调度单位是Pod,容器则被封装在Pod之中。由此可知,⼀个容器或多个容器可以同属于在⼀个Pod之中。
2、Pod是怎么创建出来的?
Pod并不是⽆缘⽆故跑出来的,它是⼀个抽象的l逻辑概念,那么Pod是如何创建的呢?Pod是由Pod控制器进⾏管理控制,其代表性的Pod控制器有Deployment、StatefulSet等。这⾥我们先有这样的⼀个概念,后⾯再详细解刨。
3、Pod资源组成的应⽤如何提供外部访问的?
Pod组成的应⽤是通过Service这类抽象资源提供内部和外部访问的,但是service的外部访问需要端⼝的映射,带来的是端⼝映射的⿇烦和操作的繁琐。为此还有⼀种提供外部访问的资源叫做Ingress。
4、Service⼜是怎么关联到Pod呢?
在上⾯说的Pod是由Pod控制器进⾏管理控制,对Pod资源对象的期望状态进⾏⾃动管理。⽽在Pod控制器是通过⼀个YAML的⽂件进⾏定义Pod资源对象的。在该⽂件中,还会对Pod资源对象进⾏打标签,⽤于Pod的辨识,⽽Servcie就是通过标签选择器,关联⾄同⼀标签类型的Pod资源对象。这样就实现了从service-->pod-->container的⼀个过程。
5、Pod的怎么创建逻辑流程是怎样的?
(1)客户端提交创建请求,可以通过API Server的Restful API,也可以使⽤kubectl命令⾏⼯具。⽀持的数据类型包括JSON和YAML。
(2)API Server处理⽤户请求,存储Pod数据到etcd。
(3)调度器通过API Server查看未绑定的Pod。尝试为Pod分配主机。
(4)过滤主机(调度预选):调度器⽤⼀组规则过滤掉不符合要求的主机。⽐如Pod指定了所需要的资源量,那么可⽤资源⽐Pod需要的资源量少的主机会被过滤掉。
(5)主机打分(调度优选):对第⼀步筛选出的符合要求的主机进⾏打分,在主机打分阶段,调度器会考虑⼀些整体优化策略,⽐如把容⼀个Replication Controller的副本分布到不同的主机上,使⽤最低负载的主机等。
(6)选择主机:选择打分最⾼的主机,进⾏binding操作,结果存储到etcd中。
(7)kubelet根据调度结果执⾏Pod创建操作:绑定成功后,scheduler会调⽤APIServer的API在etcd中创建⼀个boundpod对象,描述在⼀个⼯作节点上绑定运⾏的所有pod信息。运⾏在每个⼯作节点上的ku
belet也会定期与etcd同步boundpod信息,⼀旦发现应该在该⼯作节点上运⾏的boundpod对象没有更新,则调⽤Docker API创建并启动pod内的容器。
从上⾯的⼏个疑问,⼤致了解了K8S怎么⼯作的,那么现在再从三个⾯去了解Kubernetes,分别是Kubernetes概念和术语、集组件、⽹络模型。
⼆、K8S的概念和术语
Kubernetes是利⽤共享⽹络将多个物理机或者虚拟机组成⼀个集,在各个服务器之间进⾏通信,该集是配置Kubernetes的所有租⾦啊啊、功能和负载的物理平台。
⼀个Kubernetes集由master和node组成。如下图:
Master:是集的⽹关和中枢枢纽,主要作⽤:暴露API接⼝,跟踪其他服务器的健康状态、以最优⽅式调度负载,以及编排其他组件之间的通信。单个的Master节点可以完成所有的功能,但是考虑单点故障的痛点,⽣产环境中通常要部署多个Master 节点,组成Cluster。
Node:是Kubernetes的⼯作节点,负责接收来⾃Master的⼯作指令,并根据指令相应地创建和销毁Pod对象,以及调整⽹络规则进⾏合理路由和流量转发。⽣产环境中,Node节点可以有N个。
Kubernetes从宏观上看分为2个⾓⾊:Master和Node,但是在Master节点和Node节点上都存在着多个组件来⽀持内部的业务逻辑,其包括:运⾏应⽤、应⽤编排、服务暴露、应⽤恢复等等,在Kubernetes中这些概念被抽象为Pod、Service、Controller等资源类型。先来了解⼀下这些常⽤概念和术语:
(1)Pod
从上图,我们可以看到K8S并不直接地运⾏容器,⽽是被⼀个抽象的资源对象--Pod所封装,它是K8S最⼩的调度单位。这⾥要注意的是,Pod可以封装⼀个活多个容器!同⼀个Pod中共享⽹络名称空间和存储资源,⽽容器之间可以通过本地回环接⼝:lo 直接通信,但是彼此之间⼜在Mount、User和Pid等名称空间上保持了隔离。
(2)资源标签(Label)
标签(Label)是将资源进⾏分类的标识符,就好像超市的商品分类⼀般。资源标签具体化的就是⼀个键值型(key/values)数据,相信了解redis的友友应该知道什么是键值数据。使⽤标签是为了对指定对象进⾏辨识,⽐如Pod对象。标签可以在对象创建时进⾏附加,也可以创建后进⾏添加或修改。要知道的是⼀个对象可以有多个标签,⼀个标签页可以附加到多个对象。如图:
(3)标签选择器(Selector)
有标签,当然就有标签选择器,它是根据Label进⾏过滤符合条件的资源对象的⼀种机制。⽐如将含有标签role: backend的所有Pod对象挑选出来归并为⼀组。通常在使⽤过程中,会通过标签对资源对象进⾏分类,然后再通过标签选择器进⾏筛选,最常见的应⽤就是讲⼀组这样的Pod资源对象创建为某个Service的端点。如图:
负载均衡器的作用(4)Pod控制器(Controller)
虽然Pod是K8S的最⼩调度单位,但是K8S并不会直接地部署和管理Pod对象,⽽是要借助于另外⼀个抽象资源--Controller进⾏管理。其实⼀种管理Pod⽣命周期的资源抽象,并且它是⼀类对象,并⾮单个的资源对象,其中包括:
ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等。
以Deployment为例,它负责确保定义的Pod对象的副本数量符合预期的设置,这样⽤户只需要声明应⽤的期望状态,控制器就会⾃动地对其进⾏管理。如图:
(5)服务资源(Service)
Service是建⽴在⼀组Pod对象之上的资源对象,在前⾯提过,它是通过标签选择器选择⼀组Pod对象,并为这组Pod对象定义⼀个统⼀的固定访问⼊⼝(通常是⼀个IP地址),如果K8S存在DNS附件(如coredns)它就会在Service创建时为它⾃动配置⼀个DNS 名称,⽤于客户端进⾏服务发现。
通常我们直接请求Service IP,该请求就会被负载均衡到后端的端点,即各个Pod对象,从这点上,是不是有点像负载均衡器呢,因此Service本质上是⼀个4层的代理服务,另外Service还可以将集外部流量引⼊⾄集,这就需要节点对Service的端⼝进⾏映射了。
(6)存储卷(Volume)
在使⽤容器时,我们知道,当数据存放于容器之中,容器销毁后,数据也会随之丢失。这就是需要⼀个外部存储,以保证数据的持久化存储。⽽存储卷就是这样的⼀个东西。
存储卷(Volume)是独⽴于容器⽂件系统之外的存储空间,常⽤于扩展容器的存储空间并为其提供持久存储能⼒。存储卷在K8S中的分类为:临时卷、本地卷和⽹络卷。临时卷和本地卷都位于Node本地,⼀旦Pod被调度⾄其他Node节点,此类型的存储卷将⽆法被访问,因为临时卷和本地卷通常⽤于数据缓存,持久化的数据通常放置于持久卷(persistent volume)之中。
(7)Name和Namespace
名称(Name)是K8S集中资源对象的标识符,通常作⽤于名称空间(Namespace),因此名称空间是名称的额外的限定机制。在同⼀个名称空间中,同⼀类型资源对象的名称必须具有唯⼀性。
名称空间通常⽤于实现租户或项⽬的资源隔离,从⽽形成逻辑分组。关于此概念可以参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论