Docker系列(八)Kubernetes介绍
Kubernetes组件功能图
各组件说明:
节点
节点在Kubernetes由虚拟机或者实体机表示,常称为Minion,即从属主机。当一个节点加入到Kubernetes系统中时,它将会创建一个数据结构来记录节点信息(元数据),且不是所有节点都能够加入到Kubernetes系统中,只有通过验证后的节点才能够成为Kubernetes阶段。目前管理节点有两种方式分别为:节点管理器(Node Controller)和通过命令手动管理。
Pod
在Kubernetes中,Pod是最小的可创建、调度和管理的部署单元,它是容器化环境中的“逻辑主机”,可以包含一个或多个有关联的容器,并且容器间可以共享数据卷。
容器存在于Pod之中,而Pod又存在于节点中。
Pod主要功能:同一Pod中的容器资源共享和通信。
Service
pod的路由代理抽象,用于解决pod之间的服务发现问题。因为pod的运行状态可动态变化(比如切换机器了、缩容过程中被终止了等),所以访问端不能以写死IP的方式去访问该pod提供的服务。service的引入旨在保证pod的动态变化对访问端透明,访问端只需要知道service的地址,由service来提供代理。
replicationController
pod的复制抽象,用于解决pod的扩容缩容问题。通常,分布式应用为了性能或高可用性的考虑,需要复制多份资源,并且根据负载情况动态伸缩。通过replicationController,我们可以指定一个应用需要几份复制,Kubernetes将为每份复制创建一个pod,并且保证实际运行pod数量总是与该复制数量相等(例如,当前某个pod宕机时,自动创建新的pod来替换)。
Label
Labe是一组附加在对象上的键值对,用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller可以有多个label,但是每个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。
Proxy
Proxy不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。
Kubelet
用来监管Pod里面容器运行情况的。一旦某个Pod里面的容器发生意外挂掉了,就由Kubelet来完成对其的重建。
apiserver
作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
Scheduler
负责集群的资源调度,为新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
controller-manager
负责执行各种控制器,目前有两类:
endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
slave(称作minion)运行两个组件:
kubelet
负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
Proxy
负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
Kubernetes调度说明 Scheduler负责Pods在各个节点上的分配。Scheduler是插件式的,Kubernetes将来可以支持用户自定义的scheduler
调度流程:
1、从缓存待调度pod对象的队列PodQueue中弹出一个pod对象。
2、该pod和存储所有minion对象的链表MinionLister作为调度算法的输入,运行调度算法选择一个minion作为pod的调度目的地dest。如果无法选择一个可用的minion则输出一个event信息,说明pod调度失败。如果成功选择一个可用的minion,则使用该pod的namespace、pod名、选择的minion这三个属性新建一个Binding对象。
3、将pod分派到指定的minion上运行,这个动作也叫绑定(bind),bind就是向apiserver返回一个Binding对象,该Binding对象最终由apiserver调用etcd接口进行持久化存储。如果绑定失败,则输出绑定被拒绝的event信息,反之输出调度成功的event信息。
调度规则
调度策略分为两大类:Predicates和Priorities,其中Predicates回答"能不能"的问题,即能否将pod调度到特定minion上运行,而Priorities则是在Predicates的答案基础上回答"到底有多适合"的问题,即给特定minion打分评价优先级。
Predicates类
1、PodFitsPorts对应的实现函数是PodFitsPorts,他的评估依据就是端口是否冲突,即检测待调度的pod中所有容器要用到的端口集对应的HostPort集与minion上已使用的端口是否冲突。
2、PodFitsResources对应的实现函数是PodFitsResources,他的评估依据就是资源是否够用,即检测minion上已经运行的所有pod对资源的需求总量与待调度pod对资源的需求量之和是否超出minion的资源容量。
3、NoDiskConflict对应的实现函数是NoDiskConflict,他的评估依据就是挂载的磁盘(volume)是否冲突。
4、MatchNodeSelector对应的实现函数是PodSelectorMatches,他的评估依据就是minion是否被pod的NodeSelector选中。
5、HostNamer对应的实现函数是PodFitsHost,他的评估依据就是pod的hostname。
Priorities类
1、LeastRequestedPriority对应的实现函数是LeastRequestedPriority,他的计算原则是尽量将pod调度到资源占用比较小的minion上。
2、ServiceSpreadingPriority对应的实现函数是CalculateSpreadPriority,他的计算原则是使同一个minion上属于相同service的pod数量尽可能少,这样调度的pod能够尽可能地实现service的高可用性和流量负载均衡。
3、EqualPriority对应的实现函数是EqualPriority,他的计算原则是平等对待MinionLister中的每一个minion。
Pod、RC、Service之间的关系
Replication Controller
Pod副本控制器,限定某种Pod的当前实例的个数,提供服务的滚动升级功能。通过标签选择器选择目标Pod.
Service
无状态的为服务,一容器的方式进行隔离,拥有一个唯一的名字和、虚拟访问地址IP地址(ClusterIP)+Port、外部系统访问的映射端口NodePort
Pod
一组容器的一个 单一集合体,k8s最小调度单元且Pod里的所有容器共享资源(网络、Volumes),拥有名称、IP、状态、Label、一组容器进程等。
关系说明:
Service运行在Pod之上,Pod运行在容器之上,RC用于管理Pod实例,控制实例个数及保障正在运行实例个数。
RC不是定义在Service之上原因:
根据以上说明:Service由Pod提供的服务功能,而RC用于管理Pod实例,如果RC定义在Service之上将会导致,自己出现问题没有人监控,而且整个系统结构将不合理。
关系图: