kubernetes机理之调度器以及控制器
一 了解调度器
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的流程(鉴权,认证,准入,存储,调度等)
- RC/RS/DaemonSet/Job/statefulset的控制器
- 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进行相关的回收或者删除操作
- Deployment的控制器
小提示:以上这些说明所有控制器都不会去直接创建和修改资源都会通过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机理之调度器以及控制器的更多相关文章
- Kubernetes集群调度器原理剖析及思考
简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...
- Kubernetes K8S之调度器kube-scheduler详解
Kubernetes K8S之调度器kube-scheduler概述与详解 kube-scheduler调度概述 在 Kubernetes 中,调度是指将 Pod 放置到合适的 Node 节点上,然后 ...
- Kubernetes 学习20调度器,预选策略及优选函数
一.概述 1.k8s集群中能运行pod资源的其实就是我们所谓的节点,也称为工作节点.master从本质上来讲,他其实是运行整个集群的控制平面组件的比如apiserver,scheal,controlm ...
- Kubernetes 调度器实现初探
Kubernetes 调度器 Kubernetes 是一个基于容器的分布式调度器,实现了自己的调度模块.在Kubernetes集群中,调度器作为一个独立模块通过pod运行.从几个方面介绍Kuberne ...
- 图解kubernetes调度器预选设计实现学习
Scheduler中在进行node选举的时候会首先进行一轮预选流程,即从当前集群中选择一批node节点,本文主要分析k8s在预选流程上一些优秀的筛选设计思想,欢迎大佬们指正 1. 基础设计 1.1 预 ...
- 图解kubernetes调度器SchedulerExtender扩展
在kubernetes的scheduler调度器的设计中为用户预留了两种扩展机制SchdulerExtender与Framework,本文主要浅谈一下SchdulerExtender的实现, 因为还有 ...
- 第十四章 kubernetes 核心技术-调度器
一.概述 一个容器平台的主要功能就是为容器分配运行时所需要的计算,存储和网络资源.容器调 度系统负责选择在最合适的主机上启动容器,并且将它们关联起来.它必须能够自动的处 理容器故障并且能够在更多的主机 ...
- kubernetes 调度器
调度器 kube-scheduler 是 kubernetes 的核心组件之一,主要负责整个集群资源的调度功能,根据特定的调度算法和策略,将 Pod 调度到最优的工作节点上面去,从而更加合理.更加充分 ...
- Kubernetes增强型调度器Volcano算法分析
[摘要] Volcano 是基于 Kubernetes 的批处理系统,源自于华为云开源出来的.Volcano 方便 AI.大数据.基因.渲染等诸多行业通用计算框架接入,提供高性能任务调度引擎,高性能异 ...
随机推荐
- 加快Linux上yum下载安装包的速度(以CentOS 7,安装gcc为例)
今天在学习Linux的过程中,学到了关于包的安装问题:rpm包管理和yum在线管理两种方式:这里因为我在实验yum安装gcc出现了网速超级慢的问题,于是搜索解决方案,重新配置repo得以解决,记录整个 ...
- 大数据组件Kerberos安全访问关键代码
版本信息 <version.hbase>2.1.0-cdh6.2.1</version.hbase> <version.hadoop>3.0.0-cdh6.2.1& ...
- matplotlib的学习12-Subplot 多合一显示
import matplotlib.pyplot as plt # matplotlib 是可以组合许多的小图, 放在一张大图里面显示的. 使用到的方法叫作 subplot. plt.figure() ...
- GDB —— 优化STL容器变量的显示
步骤 wget http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt cp dbinit_stl_views-1.03.txt ...
- 从零到一快速搭建个人博客网站(域名自动跳转www,二级域名使用)(二)
前言 本篇文章是对上篇文章从零到一快速搭建个人博客网站(域名备案 + https免费证书)(一)的完善,比如域名自动跳转www.二级域名使用等. 域名自动跳转www 这里对上篇域名访问进行优化,首先支 ...
- 使用aspnet_compiler对web程序进行预编译
前言 本例使用的是asp.net中的webform项目,使用.net框架为.net3.5 操作步骤 正常的web项目发布步骤 发布方法:文件系统 目标位置:发布后的项目文件的路径,可自定义. 打开wi ...
- 基于frp的内网穿透实例1-通过SSH访问内网机器
原文地址:https://wuter.cn/1804.html/ 老母鸡终于到了,作为一个能运行linux系统的四核1G硬件,它还是比较小巧的. FRP 全名:Fast Reverse Proxy.F ...
- 实验3 C语言分支语句和循环语句编程应用(友好猜日期^_^)
实验任务一 #include <stdio.h> #include <math.h> int main(){ float a, b, c, x1, x2; float delt ...
- 拥抱 C/C++ : Android JNI 的使用
编译工具 CMake 以及 Android 上 JNI 的使用介绍. 编译工具 CMake 在Android Studio 2.2 之后,工具中增加了 CMake 的支持,于是我们有两种选择来编译 c ...
- React Native Android 环境搭建
因为工作需要,最近正在学习React Native Android.温故而知新,把学习的内容记录下来巩固一下知识,也给有需要的人一些帮助. 需要说明的是,我刚接触React Native也不久,对它的 ...