Kubernetes组件功能图算法
各组件说明:docker
节点在Kubernetes由虚拟机或者实体机表示,常称为Minion,即从属主机。当一个节点加入到Kubernetes系统中时,它将会建立一个数据结构来记录节点信息(元数据),且不是全部节点都可以加入到Kubernetes系统中,只有经过验证后的节点才可以成为Kubernetes阶段。目前管理节点有两种方式分别为:节点管理器(Node Controller)和经过命令手动管理。后端
在Kubernetes中,Pod是最小的可建立、调度和管理的部署单元,它是容器化环境中的“逻辑主机”,能够包含一个或多个有关联的容器,而且容器间能够共享数据卷。api
容器存在于Pod之中,而Pod又存在于节点中。缓存
Pod主要功能:同一Pod中的容器资源共享和通讯。网络
pod的路由代理抽象,用于解决pod之间的服务发现问题。由于pod的运行状态可动态变化(好比切换机器了、缩容过程当中被终止了等),因此访问端不能以写死IP的方式去访问该pod提供的服务。service的引入旨在保证pod的动态变化对访问端透明,访问端只须要知道service的地址,由service来提供代理。数据结构
pod的复制抽象,用于解决pod的扩容缩容问题。一般,分布式应用为了性能或高可用性的考虑,须要复制多份资源,而且根据负载状况动态伸缩。经过replicationController,咱们能够指定一个应用须要几份复制,Kubernetes将为每份复制建立一个pod,而且保证明际运行pod数量老是与该复制数量相等(例如,当前某个pod宕机时,自动建立新的pod来替换)。负载均衡
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不但解决了同一主宿机相同服务端口冲突的问题,还提供了Service转发服务端口对外提供服务的能力,Proxy后端使用了随机、轮循负载均衡算法。函数
用来监管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
调度流程:
一、从缓存待调度pod对象的队列PodQueue中弹出一个pod对象。
二、该pod和存储全部minion对象的链表MinionLister做为调度算法的输入,运行调度算法选择一个minion做为pod的调度目的地dest。若是没法选择一个可用的minion则输出一个event信息,说明pod调度失败。若是成功选择一个可用的minion,则使用该pod的namespace、pod名、选择的minion这三个属性新建一个Binding对象。
三、将pod分派到指定的minion上运行,这个动做也叫绑定(bind),bind就是向apiserver返回一个Binding对象,该Binding对象最终由apiserver调用etcd接口进行持久化存储。若是绑定失败,则输出绑定被拒绝的event信息,反之输出调度成功的event信息。
调度规则
调度策略分为两大类:Predicates和Priorities,其中Predicates回答"能不能"的问题,即可否将pod调度到特定minion上运行,而Priorities则是在Predicates的答案基础上回答"到底有多适合"的问题,即给特定minion打分评价优先级。
Predicates类
一、PodFitsPorts对应的实现函数是PodFitsPorts,他的评估依据就是端口是否冲突,即检测待调度的pod中全部容器要用到的端口集对应的HostPort集与minion上已使用的端口是否冲突。
二、PodFitsResources对应的实现函数是PodFitsResources,他的评估依据就是资源是否够用,即检测minion上已经运行的全部pod对资源的需求总量与待调度pod对资源的需求量之和是否超出minion的资源容量。
三、NoDiskConflict对应的实现函数是NoDiskConflict,他的评估依据就是挂载的磁盘(volume)是否冲突。
四、MatchNodeSelector对应的实现函数是PodSelectorMatches,他的评估依据就是minion是否被pod的NodeSelector选中。
五、HostNamer对应的实现函数是PodFitsHost,他的评估依据就是pod的hostname。
Priorities类
一、LeastRequestedPriority对应的实现函数是LeastRequestedPriority,他的计算原则是尽可能将pod调度到资源占用比较小的minion上。
二、ServiceSpreadingPriority对应的实现函数是CalculateSpreadPriority,他的计算原则是使同一个minion上属于相同service的pod数量尽量少,这样调度的pod可以尽量地实现service的高可用性和流量负载均衡。
三、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之上将会致使,本身出现问题没有人监控,并且整个系统结构将不合理。
关系图: