一 了解调度器

  1.1  调度器是如何将一个pod调度到节点上的

    我们都已然知晓了,API服务器不会主动的去创建pod,只是拉起系统组件,这些组件订阅资源状态的通知,之后创建相应的资源,而负责调度pod的则是调度器,调度器也不会主动去创建pod,当它从API订阅得知自己需要调度pod的时候,会将pod以一些列调度策略,调度到最佳的节点上,并通过API服务器更新pod定义,API服务器再会告诉kubelte,相应节点上的kubelet则会去拉取镜像和创建容器

    可以在集群中运行多个调度器,之后在需要创建的pod上添加schedulerName字段属性指定调度器,所有pod里面默认的这个字段都是默认的调度器,那些pod设置了另外的schedulerName的时候,默认的调度器会忽略它,要么使用其他的调度器来进行调度,要么手动的去调度pod

    关于调度过程以及设计的算法绝对不止宏观上面的这些,里面的调度策略以及高度调度策略有很多很多,但是我们不需要特别的去关心这些

二 了解kubernetes集群里面的控制器的工作原理

  2.1  前面提到的,API服务器只做了存储资源到etcd以及通知客户端的工作,而调度器只是给pod分配了节点,所以需要有活跃的组件确保系统真实状态朝着API服务器的状态进行收敛,这个工作是由控制器来实现。

  2.2 控制器包括以下几种

    • Replication管理器
    • ReplicaSet,DaemonSet以及Job控制器
    • Deployment控制器
    • StatefulSet控制器
    • Node控制器
    • Service控制器
    • Endpoints控制器
    • Namespace控制器
    • PersistentVolume控制器
    • 其他

  2.3 了解控制器做了些什么以及如何做的

    控制器做了许多不同的事情,但是它们都通过API服务器监听资源的变更,并且不论是创建对象,更新对象以及删除已有的对象的操作,这些操作甚至涵盖了新建其他资源以及更新监听资源的本身(例如更新资源对象的status)

    简单一点来说就是,控制器执行一个调和的循环,将集群实际的资源状态调整为期望状态,然后将新的实际状态写入资源的status部分,控制器之间不会进行通信,它们甚至都不知道其他控制器的存在,每个控制器都连接API服务器,并且通过监听机制,请求订阅该控制器负责的一些列资源的变更

    我们来列举几个控制器的作用以及功能

    • RC/RS/DaemonSet/Job/statefulset的控制器

      • 我们知道RC控制器的作用就是用来保障集群中的pod数量符合资源mainifest定义并且随时相应资源mainifest里面的replicas的变化
      • 为实时达到以上要求,则必须不停的去对集群里面的pod进行轮询问,这是一个比较过时的办法,通过前面的学习,我们已然知晓在kubernetes集群里面这种场景一般都是通过监听对该类资源发生事情变化的通知,那么我们的RC控制器同样也是监听机制订阅集群内部可能影响replicas变化和符合条件的pod数量变化的事件,任何该类的变化都会触发控制器重新检测pod的期望值以及集群内部符合条件的实际pod数量,并且作出相应的增删操作
      • 当需要增加或者删除pod的数量的时候,调度器也不会去创建pod而是通过向API服务器提供pod清单之后API服务器创建pod的流程(鉴权,认证,准入,存储,调度等)

    • Deployment的控制器

      • deployment控制器负责使deployment的状态与API对象同步
      • 每次Deployment对象修改时,deployment都会创建一个RS并且滚动升级至新的版本
      • 同时收缩旧的版本,生成新的版本,并不会直接创建pod
    • Node控制器
      • node控制器第一个作用是来描述 集群节点信息
      • 使节点对象于集群中的实际运行的节点保持同步,并且同时监控各个节点的监控状态,删除不可达节点
      • 但是能够对node节点做更改的不止node控制器一个,kubelet可以,用户发起的RESTAPI调用同样可以
    • service控制器
      • 这个控制器的作用就是在当创建或者删除一个负载均衡器或者新建的时候,将基础服务里面的负载均衡器用于服务,或者删除服务的时候将资源里面的负载均衡器归还基础资源
    • Endpoint控制器
      • 这个控制器是用作管控服务的的后端列表,当修改service定义(修改与之关联的endpoints)或者修改与之关联pod的时候,该控制器会监听这类事件的订阅,当收到通知之后则会对维护的列表作出相应的修改
    • PersistentVolume控制器
      • 之前学习了持久卷以及持久卷声明,当创建了持久卷声明之后,集群就会有某种神秘的力量将其与相适应的持久卷相绑定,这种神秘的力量就是pv控制器,
      • 当客户端在创建一个持久卷的时候,PV控制器会维护一个当前系统里面已有的PV列表,找出最佳的卷并与之绑定
      • 在删除卷的时候,会根据mainifest里面的回收策略,对PV进行相关的回收或者删除操作

      小提示:以上这些说明所有控制器都不会去直接创建和修改资源都会通过API服务器继而kubelet去创建和修改集群的pod相关的资源

  2.4  kubelet的作用

    • kubelet的第一个作用就是在其所在的节点上注册到API服务器中
    • 第二个作用就是通过监听API服务器的订阅,发现有pod被调度到这个节点上的时候,将去拉取镜像启动容器,并且持续监控容器状态,向API服务器报告其运行状态,事件和资源消耗
    • kubelet也是运行存活探针的地方,当存活探针运行失败的时候,会去重新启动容器
    • 当pod在API服务器被删除的时候,kubectl终止容器,并汇报给API服务器

  2.5  kube-proxy的作用

    • kube-proxy的作用是将客户端的请求转发到相关的后端pod中
    • 同时也被称作为代理模式,其工作原理如下所示

  2.6  DNS服务器是如何工作

    • 集群中所有的pod默认配置使用集群的DNS,这使得内部服务的应用通过名称来查询服务
    • DNS服务通过kube-dns服务对外暴露,服务的IP地址会写入每个容器中的/etc/resolv.conf文件中的namerserver中
    • 之后通过监听API服务器的service以及endpoints的订阅
    • 某种层面来说,从endpoint更新到到DNSpod收到通知的这个极短时间内,DNS可能无法工作

  2.7  Ingress控制器如何工作

    • Ingress原理是在集群中运行一个反向代理服务器
    • 然后集群中的Ingress,service以及endpoint资源来配置该服务器
    • 因而需要订阅这些资源(通过监听机制)然后每次其中一个发生变化则更新代理服务器配置

kubernetes机理之调度器以及控制器的更多相关文章

  1. Kubernetes集群调度器原理剖析及思考

    简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...

  2. Kubernetes K8S之调度器kube-scheduler详解

    Kubernetes K8S之调度器kube-scheduler概述与详解 kube-scheduler调度概述 在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 节点上,然后 ...

  3. Kubernetes 学习20调度器,预选策略及优选函数

    一.概述 1.k8s集群中能运行pod资源的其实就是我们所谓的节点,也称为工作节点.master从本质上来讲,他其实是运行整个集群的控制平面组件的比如apiserver,scheal,controlm ...

  4. Kubernetes 调度器实现初探

    Kubernetes 调度器 Kubernetes 是一个基于容器的分布式调度器,实现了自己的调度模块.在Kubernetes集群中,调度器作为一个独立模块通过pod运行.从几个方面介绍Kuberne ...

  5. 图解kubernetes调度器预选设计实现学习

    Scheduler中在进行node选举的时候会首先进行一轮预选流程,即从当前集群中选择一批node节点,本文主要分析k8s在预选流程上一些优秀的筛选设计思想,欢迎大佬们指正 1. 基础设计 1.1 预 ...

  6. 图解kubernetes调度器SchedulerExtender扩展

    在kubernetes的scheduler调度器的设计中为用户预留了两种扩展机制SchdulerExtender与Framework,本文主要浅谈一下SchdulerExtender的实现, 因为还有 ...

  7. 第十四章 kubernetes 核心技术-调度器

    一.概述 一个容器平台的主要功能就是为容器分配运行时所需要的计算,存储和网络资源.容器调 度系统负责选择在最合适的主机上启动容器,并且将它们关联起来.它必须能够自动的处 理容器故障并且能够在更多的主机 ...

  8. kubernetes 调度器

    调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...

  9. Kubernetes增强型调度器Volcano算法分析

    [摘要] Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的.Volcano 方便 AI.大数据.基因.渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异 ...

随机推荐

  1. Java静态方法和非静态方法之间的关系

    非静态方法 public class Demo2 {    public static void main(String[] args) {        //实例化这个类 new       //对 ...

  2. 四、LoadRunner11安装和破解

    之前安装了LoadRunner12 社区版的,应为满足不了工作需求, 上网仔细查了教程下来LoadRunner11破解版 链接:https://pan.baidu.com/s/1dM8Lwf4p160 ...

  3. .net core WebAPI性能监控-MiniProfiler与Swagger集成

    ------------恢复内容开始------------ 安装Nuget Install-Package MiniProfiler.AspNetCore.Mvc Install-Package M ...

  4. 精尽Spring MVC源码分析 - HandlerMapping 组件(三)之 AbstractHandlerMethodMapping

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  5. 仵航说 Vue项目如何打包并发布到linux服务器 仵老大

    1,打包 1.1首先你会在本地编辑好你的代码, 1.2然后在控制台输入 npm run build npm run build 1.3稍等片刻就打包完毕 2,位置 2.1打包完毕之后会在项目中生成一个 ...

  6. [.NET] - 基础知识 - .NET Overview

    .NET Framework是有一个Framework Class Libray(FCL)和一个Common Language Runtim环境构成的,它 提供一个一致的面向对象的编程环境,而无论对象 ...

  7. Access 数据库容量问题

    1.单个表的最大容量  2G. 2.单个表的最大条数 3.自动编号的最大数 4.数据库的最大容量 5.text备注形式的字段的最大数据量 6.ole对象字段的最大数据量,图片的最大大小 7.文本字段的 ...

  8. MacOS下解决宿主机和docker容器之间网络互通

    docker在Mac下使用非常方便,官网提供了desktop版本的可视化软件,甚至还十分贴心地集成好了k8s套件.然而如果想同时部署和使用多个容器,每个容器不使用127.0.0.1地址,而是各自有ip ...

  9. Spring Boot使用Maven自定义打包方式

    前言:本文将告诉你如何将程序Jar与与依赖Jar及配置文件分离打包,以下列举了两种不同Maven打包方式,其打包效果一致! 一.第一种Maven打包方式,将jar及resources下全部配置文件,拷 ...

  10. eclips快捷键

    所谓"工欲善其事必先利其器",程序写多了,对于快捷键总有些特别的偏爱.在众多编辑器中,Eclipse算是用的比较多,也是最熟的. 最常用(也是最爱的:)) Ctrl+' :  自动 ...