Kubernetes采用Master/Node结构,Master为管理控制节点,Node为正在运行应用的节点;
Master可以有一台或多台(三台以上Master可以做HA用来高可用,效果与Keepalived雷同),Master节点被称为控制平面,Node为数据。
概念讲解
-
1.Master
Master 是集群的网关和中心,负责注入为用户和客户端暴露 API、跟踪其他服务器的健康状态、以最优方式调度工作负载,以及编排其它组件之间的通信等任务,它是用户或客户端之间的核心联络点,并负责Kubernetes系统的大多数集中式管控逻辑。单个 Master节点即可完成所有功能,但是出于负载均衡及高可用目的,生产环境通常需要部署多个此类主机。
-
2.Node
Node 是 Kubernetes 集群的工作节点,负责接收来自 Master 的工作指令并根据指令相应地创建和销毁 Pod 对象,以及调整网络规则以合理地路由和转发流量等。理论上讲,Node可以使任何形式的计算设备,不过 Master 会统一将其抽象为 Node 对象进行管理。
Kubernetes 将所有Node的资源集结于一处形成一台更加强大的 “服务器”,如下图所示,在用户将应用部署到 Node 上时,Master使用调度算法Scheduler
将其自动指派至某个特定的 Node 运行,在 Node加入集群或从集群中移除时,Master也会按需重新编排影响到Pod(容器)。于是,我们无需关心应用到底在哪个Node上。
术语讲解
-
1.Pod
Kubernetes并不直接运行容器,而是使用一个抽象的资源对象来封装一个或多个容器,这个抽象就被称为 Pod,它也是 Kubernetes 的最小调度单元,在Kubernetes中,容器不称为我们之前在Docker中所谓的容器,而是被称为 Pod。同一个 Pod 中可以有多个容器并且同一个Pod中的多个容器共享网络名称和存储资源,这些容器可通过本地回环接口 lo 直接通信,但彼此之间又在 Mount、User、PID等名称空间上保持了隔离。尽管 Pod 中可以包含多个容器,但是作为最小调度单元,它应该尽可能的保持 “小”,所以通常一个Pod中只有一个主容器和其它辅助容器,辅助容器指的是(Filebeats、zabbix_agent客户端等)。
我的理解为:“一个Node可以包含多个Pod,一个Pod可以包含多个容器,一个Node为一台主机(物理机/虚拟机/云主机。。。。),一个Pod基于Node之上,又可以在一个Pod中运行多个容器,但我们通常只运行一个主容器,其余为辅助容器”。 -
2.Label/资源标签
标签(Label)是将资源进行分类的标识符,表面意思可以与Docker中的tag一致,在Docker中我们给容器打标签tag,但是在Kubernetes中我们需要给 Pod 来打标签。资源标签是一个键值型 (Key/Values)格式的数据。添加标签的主要作用是为了增加辨识度,添加的标签对用户存在特定的意义。标签可以在 Pod 创建的时候指定,也可以在创建 Pod 后任意时间进行添加和修改。
一个 Pod 可以拥有多个标签Lable,一个标签也可以属于多个 Pod。通常用法如下图所示。
-
3.标签选择器
标签选择器(Selector),全称为 ”Label Selector“,标签选择器通过 Label来过滤符合条件的 Pod,例如附有标签 ”application:nginx“的所有 Pod 挑选出来归纳为一类,并为归纳出的这组标签的 Pod 创建为 Service的端点。
-
4.Pod控制器
尽管 Pod 是 Kubernetes的最小调度单元,但是我们也不会直接部署及管理 Pod 对象,而是借助另外一类抽象,这类抽象被称为——》控制器(Controller)对其进行管理。
用于工作负载的控制器是一种管理 Pod 生命周期的资源抽象,他们是 Kubernetes 上的一类对象,而非单个资源对象,,控制器包括以下
ReplicationController
ReplicaSet
Deployment
StatefulSet
Job
下图中以Deployment
控制器为例,我们在其中定义了 Pod 对象的副本数量(就是一个Pod的副本,可以作为高可用使用的副本)为3,就必须精确为3各 Pod,否则”多退少补“。使用控制器之后就不再需要手动管理Pod对象了,用户只需要声明应用的期望状态,控制器就会自动对其进行进程管理。
-
5.服务资源(Service)
Service 是建立在一组 Pod 对象之上的资源抽象,Kubernetes通过标签选择器
Label Selector
选择后的一组 Pod 对象,并为这组 Pod对象定义一个统一且固定的访问入口(通常是一个IP地址),若Kubernetes集群存在DNS附件
,它就会在Service创建时为其自动配置一个DNS名称以便客户端进行服务发现。到达Service IP的请求将被负载均衡至其后的端点——各个Pod对象之上,因此 Service从本质上来讲是一个四层代理服务。另外Service还可以将集群外部流量引入到集群中来。
扩展:
因为Pod是动态的,Pod IP地址也是非常不固定的,所以当外部资源直接访问Pod IP时,当Pod被销毁了之后那么将会出不可描述的问题,所以在相同功能的Pod前加入 Service 进行代理,Service 通过标签选择器Label Selector
来自动代理我们预定好的Pod。 -
6.存储卷
存储卷(Volume)是独立于容器文件系统之外的存储空间,常用于扩展容器的存储空间并为容器提供持久存储能力。Kubernetes集群上的存储卷大体可以分为
临时卷
、本地卷
和网络卷
。临时卷和本地卷都位于 Node 本地,一旦 Pod 被调度至其他 Node,此种类型的存储卷将无法访问到,因此临时卷和本地卷常用语数据缓存,持久化的数据则需要放置于持久卷(presistent volume)之上。 -
7.Name和NameSpace
名称(Name)是Kubernetes集群中资源对象的标识符,他们的作用于通常是名称空间(NameSpace),因此名称空间是名称的额外限定机制。在用一个名称空间中(同一名称空间一般为:
Node与Node之间名称
,Service与Service之间名称
,Pod与Pod之间名称
,同一Pod下容器名称
),同一类型资源对象的名称必须具备唯一性。名称空间常用于实现租户或项目的资源隔离,从而形成逻辑分组,如下图所示,创建的 Pod 和 Service 等资源对象都属于名称空间级别,未指定时,他们都属于默认名称空间 ”default“
下图中的三个 Pod ,分为为:默认 Pod 名称空间
,公开 Pod 名称空间
,系统 Pod 名称空间
。
-
8.Annotation
Annotation(注解)是一种附加在 Pod 对象之上的键值类型数据,但它拥有更大的数据容量。Annotation 常用于将各种非标识型元数据(matedata)附加到对象上,但它不能用于标识和选择对象。常规之意即为 ”注释“
-
9.Ingress
Kubernetes将Pod对象和外部网络环境进行了隔离,Pod 和 Service等对象间的通信都使用其内部专用地址进行,加入需要开放某些 Pod 对象提供给外部用户访问,则需要为其请求流量打开一个通往 Kubernetes集群内部的通道,除了 Service 之外,Ingress也是这类通道的实现方式之一。Ingrss被称为入口。