设为首页 收藏本站
查看: 895|回复: 0

[经验分享] Docker系列(八)Kubernetes介绍

[复制链接]

尚未签到

发表于 2018-1-4 14:51:14 | 显示全部楼层 |阅读模式
  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之上将会导致,自己出现问题没有人监控,而且整个系统结构将不合理。
  关系图:

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431544-1-1.html 上篇帖子: Kubernetes 认证 下篇帖子: 基于Python+Django的Kubernetes集群管理平台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表