一 了解调度器

  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. K8S安装Kubesphere

    准备工作 安装Helm curl -L https://git.io/get_helm.sh | bash 创建账户 cat > heml-rbac.yaml << EOF apiV ...

  2. 基于XGBoost模型的幸福度预测——阿里天池学习赛

    加载数据 加载的是完整版的数据 happiness_train_complete.csv . import numpy as np import pandas as pd import matplot ...

  3. rocketMq 消息偏移量 Offset

    消息偏移量 Offset queue0 offset 0   0-20  offset 4  20-40 纠错:每条消息的tag对应的HashCode. queue1 offset 1  0-20   ...

  4. openstack高可用集群21-生产环境高可用openstack集群部署记录

    第一篇 集群概述 keepalived + haproxy +Rabbitmq集群+MariaDB Galera高可用集群   部署openstack时使用单个控制节点是非常危险的,这样就意味着单个节 ...

  5. c# 递归 yield关键字的用法

    1.yield实现的功能 yield return: 先看下面的代码,通过yield return实现了类似用foreach遍历数组的功能,说明yield return也是用来实现迭代器的功能的. u ...

  6. Git常用命令大全,迅速提升你的Git水平

    原博文 https://mp.weixin.qq.com/s/hYjGyIdLK3UCEVF0lRYRCg 示例 初始化本地git仓库(创建新仓库) git init                 ...

  7. Nginx 配置日志路径(nginx.conf没有写log路径,所以debug的时候找不到日志)

    缘由:nginx.conf没有写log路径,所以debug的时候找不到日志,遂在conf文件里写入了log路径 Setp1.nginx默认日志路径: /var/log/nginx Setp2.conf ...

  8. 在.NET Core 中收集数据的几种方式

    APM是一种应用性能监控工具,可以帮助理解系统行为, 用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题, 通过汇聚业务系统各处理环节的实时数据,分析业务系统各事务处理的交易路径和处理 ...

  9. java零基础之--【Lombok】简化类设计神器

    I1. 在类设计中我们必不可少的要进行属性定义,构造方法,setter/getter方法,toString方法定义,如果在设计项目中属性过多则会影响类的阅读性. Lombok作为第三方插件,很好的解决 ...

  10. 自动化运维工具-Ansible之3-playbook

    自动化运维工具-Ansible之3-playbook 目录 自动化运维工具-Ansible之3-playbook PlayBook初识 YAML语法 PlayBook部署httpd PlayBook实 ...