Kubernetes控制平面组件:Controller-Manager控制器管理

news/2024/3/29 17:10:41/文章来源:https://blog.csdn.net/weixin_44571270/article/details/126692433

文章目录

  • 一、工作流程
    • 1、code-generator
    • 2、流程
        • (1)为什么放到队列里的不是对象的完整数据
        • (2)控制器协同工作原理
        • (3)Garbage Collector(级联删除)
        • (4)deployment controller中的命名规则
  • 二、informer工作机制
  • 三、各种Controller
    • 1、Cloud Controller Manager
    • 2、确保 scheduler 和 controller 的高可用

前文介绍的kube-scheduler,要watch pod nodeName变化,若没有nodeName的pod,则需要调度,然后获取node list,根据predicate plugin、priority plugin的筛选得到最后的候选node列表,然后选择list index为0的分数最高的node,reserve这个node相关资源,然后 pod bind node(写nodeName字段),最后把pod yaml回写到apiserver中。这是一个controller loop, kube-scheduler其实也是一个特殊的kube-controller-manager

apiserver是一个声明式的系统,就是你给我一个应用的期望状态,我根据这个期望去做一些配置,让这个应用最终达到你的期望状态,这个就是kube-controller-manager实现的。是k8s的大脑。

一、工作流程

控制器=控制器定义 + 被控制对象的模版(podTemplate)
控制器定义: 是为了reconcil loop实现达到期望状态(控制器核心原理)

1、code-generator

针对任何的api对象,都可以通过code-generator来生成。它可以生成Deepcopy,Conversion,Clientset等。Clientset用来定义我如何访问这个api对象,比如create,delete,get,list,watch等。
code-generate官方文档

2、流程

流程图:
在这里插入图片描述

针对kube-controller-manager,code-generator生成了Informer和Lister。这两个统称为Controller Interface
去apiserver获取任何一个对象的时候,有两种方式,一种是get,一种是watch。针对这两种方式,Controller Interface就分为了:

  • informer:有新的事件推送给用户,是一个消息通知接口。它有三种event。
    🔥 addFunc:一个对象第一次出现的时候
    🔥 deleteFunc:删除对象
    🔥 updateFunc:对象存在要变更属性
  • lister:获取当前的状态

三种event要去注册EventHandler,event是一个完整的对象,大部分的控制器会去拿到这个对象的KeyFunc(对象的namespace+name),然后把这个key通过RateLimitinglnterface放到队列里面。

(1)为什么放到队列里的不是对象的完整数据

如果有一个对象频繁变更,如果把对象的完整信息放到队列里,首先队列需要的内存空间会很大,其次假如对象要变更10次,那么worker也要变更10次。而使用对象的key(例如:pod的key就是namespace_podname string),不管有多少次变更event,推送到队列里的只有一个key,worker线程通过lister接口获取这个对象的最终状态,worker只需要根据这个最终状态变更1次即可。

(2)控制器协同工作原理

k8s是一个微服务管理系统,不同的组件负责不同的职责。
以下图的deployment为例,用户创建一个deployment。
在这里插入图片描述

  • deployment是一种部署策略,定义了需要什么样的pod,副本数是多少。
  • deployment controller watch到deployment,创建一个replicaset副本集。
  • replicaset controller watch到replicaset,创建pod副本集。
  • 调度器发现pod还没有调度,开始调度pod,把pod和node绑定。
  • kubelet监听所有pod的变更,如果pod的nodeName所调度的节点和本节点的Hostname一致,就会继续检查当前pod是否已经在此节点上存在,若存在,则删除原有pod相关容器,再重新创建pod;若不存在,则调用CRI创建pod相关容器、调用CSI为容器配置存储、调用CNI为容器配置网络

(3)Garbage Collector(级联删除)

Garbage Collector:通过ownerReferences处理级联删除,它的内部会有一个Graph Builder,构建一个父子关系图。比如删除 deployment 时它会去扫描自己的GraphBuilder,看有没有对象的ownerReferences是这个deployment,所以也会删除对应的 replicaset 以及Pod。

deployment是利用rs做版本控制的,其中的revisionHistoryLimit是指定了rs保留版本数。其他控制器都是通过ControllerRevision做版本管理的,但是无法指定版本保留个数

k get deploy -o yaml

在这里插入图片描述

k get rs -o yaml

可以看到metadata有一个ownerReferences属性,代表着它的父辈是谁。这里就是nginx的deployment。uid也是deployment的uid。
在这里插入图片描述

k get po -o yaml

可以看到pod的ownerReferences中,指向的是nginx的rs。
在这里插入图片描述
我们可以清楚的发现各个对象都会记录自己的父对象是谁,这样其实就形成了一张对象相互级联的拓扑图。假如自己现在执行下面:

# delete默认是级联删除的
kubectl delete deployment xxxx 

因为我创建的时候就是创建的deployment,那么对用户来说并不知道其他级联对象比如rs的存在,那么用户删除dp,应该将其他级联的也删除了。假如我们不需要级联删除的话就执行

# old kubelet reversion
kubectl delete deployment xxxx --cascade=false
# new kubelet reversion
kubectl delete deployment xxxx --cascade=orphan

(4)deployment controller中的命名规则

注:deployment需要有Template是为了创建RS,RS要有template是为了根据template创建pod。RS的pod-template-hash label和deployment pod-template有命名上的弱绑定.

nginx pod名字是nginx-6cc88c7947-vh4rq,pod是由rs创建的,因此rs控制器名nginx-6cc88c7947+随机字符串就是pod名,这样就保证了pod名的独一无二。其他控制器因为没有两层关系。不需要pod-template-hash 命名弱绑定,因此控制器的名字都没有hash值,podname就是控制器名+随机字符串

[root@localhost ~]# kubectl get ds
NAME    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
lxcfs   57        57        57      57           57          <none>          179d
[root@localhost ~]# kubectl get pods|grep lxcfs
lxcfs-2xgrp                                           1/1     Running   0          155d

二、informer工作机制

  • informer会和apiserver有一个长连接,通过list和watch。
  • apiserver的rest调用返回给客户端的是序列化的json字符串。reflector通过反射机制解析json tag,这样就能知道这个json对应的是哪个对象。简而言之就是reflector把json的字符串转换成了go语言的对象。
  • informer内部维护了一个delta fifo 先进先出的队列,reflector把对象放进队列中。
  • 取出来的对象放到indexer中,存储对象和key到一个线程安全的store中。
  • 在添加对象的同时,event会触发事件,注册event的handler。
  • handler把对象的key放到workqueue队列中。
  • worker的线程去获取key。
  • worker从indexer中根据key获取对象的完整数据。
  • 根据对象的完整数据做一些配置管理。
    在这里插入图片描述

三、各种Controller

  • Job Controller: 处理 job。
  • Pod AutoScaler:处理 Pod 的自动缩容/扩容。
  • RelicaSet:依据 Replicaset Spec 创建 Pod。
  • Service Controller: 为 LoadBalancer type 的 service 创建 LB VIP。
  • ServiceAccount Controller: 确保 serviceaccount 在当前 namespace 存在。
  • StatefulSet Controller:处理 statefulset 中的 Pod。
  • Volume Controller: 依据 PV spec 创建 volume。
  • Resource quota Controller:在用户使用资源之后,更新状态。
  • Namespace Controller:保证 namespace 删除前该 namespace 下的所有资源都先被删除。
  • Replication Controller:创建RC 后,负责创建 Pod。
  • Node Controller:维护 node 状态,处理 evict 请求等。
  • Daemon Controller:依据 damonset 创建 Pod。
  • Deployment Controller:依据 deployment spec 创建 replicaset。
  • Endpoint Controller:依据 service spec 创建 endpoint,依据 podip 更新 endpoint。
  • Garbage Collector:通过ownerReferences处理级联删除,它的内部会有一个Graph Builder,构建一个父子关系图。比如删除 deployment 时它会去扫描自己的GraphBuilder,看有没有对象的ownerReferences是这个deployment,所以也会删除对应的 replicaset 以及Pod。
  • CronJob Controller:处理 cronjob。

1、Cloud Controller Manager

Cloud Controller Manager 是从老版本的 API Server 分离出来的。

  • kube-apiserver 和 kube-controller-manager 中一定不能指定 cloud-provider,否则会加载内置的 cloud controller manager。
  • kubelet 要配置 --cloud-provider=external。

(1)Cloud Controller Manager 主要支持:

  • Node controller:访问 cloud APl,来更新 node 状态;在 cloud 删除该节点以后,从Kubernetes 删除 node;
  • service controller: 负责配置为 loadbalancer 类型的服务配置 LB VIP;
  • Route Controller:在 cloud 环境配置路由;
  • 可以自定义任何需要的 Cloud Controller。

(2)需要定制的 Cloud Controller:

  • Ingress controller;
  • Service Controller;
  • RBAC controller;
  • Account controller。

(3)建议:
保护好 controller manager 的 kubeconfig:

  • 此 kubeconfig 拥有所有资源的所有操作权限,防止普通用户通过 kubectl execkube-controller-manager cat 获取该文件。

2、确保 scheduler 和 controller 的高可用

(1)Leader Election:

  • k8s提供基于 configmap 和 endpoint 的 leader election 类库。
  • k8s采用leader election 模式启动应用组件后,会创建对应 endpoint,并把当前的leader 信息 annotate到 endponit 上。

(2)流程:

  • 假如集群有3个master,每个master上都跑了控制器。控制器在启动前都会去尝试获取一把锁。这个锁就是k8s对象(cm或者ep)。
  • 下面的ep配置中,所有的scheduler实例都会以kube-scheduler的名字获取这把锁,看这个ep是否存在,如果存在,就把自己的身份信息更新进去。
  • 当要调度的时候,首先要看ep中的holderldentity是否和当前节点名字一致,如果一样才能进行调度。同时leader也要不停的renew,leaseDurationSeconds如果在15秒内没有来续约,就会认为leader失效,其他standby就会去获取锁。
  • 不一致节点就会一直watch这把锁,直到租约失效,然后抢占锁成为master。
apiversion: v1
kind: Endpoints
metadata:annotations:control-plane.alpha.kubernetes.io/leader:
"{"holderldentity" "master","leaseDurationSeconds":15,"acquireTime":"2022-03-
05T17:31:29Z","renewTime":"2022-03-07T07:18:39Z","leaderTransitions":0""
creationTimestamp: 2022-03-05T17:31:29Z
name: kube-scheduler
namespace: kube-System
resourceVersion: "138930"
selfLink: /api/v1/namespaces/kube-system/endpoints/kube-scheduler
uid: 2d12578d-38f7-11e8-8df0-0800275259e5
subsets: null

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_5579.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无线传感器网络数据压缩与融合及安全机制的matlab仿真

目录 一、理论基础 二、案例背景 三、MATLAB程序 四、仿真结论分析 一、理论基础 整个网络有一个汇聚节点&#xff08;Sink节点&#xff09;&#xff0c;能量足够大&#xff0c;相当于基站&#xff0c;其功率足以发送信息至全网节点&#xff0c;Sink节点和簇头信息交换&…

如何成为一名数据工程师:完整的路线图

如何成为一名数据工程师:完整的路线图 关于如何学习数据工程的完整路线图。Photo by 这是工程RAEng on 不飞溅 什么是数据工程? 数据工程是设计和构建用于大规模收集、存储和分析数据的系统的实践。组织可以收集大量数据,但为了确保数据在到达数据科学家和分析师时处于高度…

mysql备份还原

一、环境配置 操作系统版本:Rocky Linux release 8.6 (Green Obsidian) 系统内核:Linux mysql 4.18.0-372.9.1.el8.x86_64 #1 SMP Tue May 10 14:48:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux mysql版本:mysql-server-8.0.26-1.module+el8.4.0+652+6de068a7.x86_64 二、安…

大模型系统和应用——Transformer预训练语言模型

引言 最近在公众号中了解到了刘知远团队退出的视频课程《大模型交叉研讨课》&#xff0c;看了目录觉得不错&#xff0c;因此拜读一下。 观看地址&#xff1a; https://www.bilibili.com/video/BV1UG411p7zv 目录&#xff1a; 自然语言处理&大模型基础神经网络基础Transf…

实现一个简单的 ctrl+ f 搜索

前言 浏览器可以通过ctrl f 来实现&#xff0c;这个功能真的很不错&#xff0c;但是如何实现类似的功能呢&#xff1f;想了很久&#xff0c;感觉可以基于文本选中来实现 复制时的效果是这样的 搜索时的效果 是不是除了颜色不一样&#xff0c;其他都一样呢 文本选中样式设…

F1C100S rt-smart 内核移植(二)

前言 本篇的内容进入了rt-smart内核的C语言世界,因此会同时涉及到较多的.c文件,需要读者对rt-smart内核有基本的认识,至少需要大致了解内核的文件结构。 在上一章节中,我们从启动汇编start_gcc.S进入了内核入口rtthread_startup,该内核入口函数位于./kernel/src/component…

linux 增加swap分区容量 --文件方式

背景:用笔记本做openstack测试时,由于需要同时开启多台虚拟机且每台内存要求8G以上,笔记本硬件已无法满足,故通过增加swap的方式处理操作 一、查看扩容前swap分区容量free -h 二、扩容 由于原来系统有3.9G,所以增加4.1G即可 1、创建swap扩容文件cd /tmp dd if=/dev/zero o…

【web-渗透测试方法】(15.6)测试基于输入的漏洞

目录 一、测试基于输入的漏洞 1.1、模糊测试所有清求参数 1.2、测试SQL注入 1.3、测试XSS和其他响应注入 确定反射型请求参数 测试反射型XSS 测试HTTP消息头注入 测试任意重定向 测试存储型攻击 1.4、测试OS命令注入 1.5、测试路径遍历 1.6、测试脚本注入 1.7、测…

windows系统 python3.6(Anaconda3)安装对应版本 torch、torchvision

一、官网下载 .whl 文件 https://download.pytorch.org/whl/torch_stable.html二、使用pip命令安装 打开你的anaconda,选择对应虚拟环境终端,进入刚才下载 .whl 文件的目录下,输入以下命令: install 后面的就是你的文件名,出现successful就是成功了。 pip install torch-1…

VUE3实战一之项目搭建

VUE3实战一之项目搭建1. 项目初始化1.1. 环境要求1.2. 创建VUE项目-基于vite1.3. 项目初始化2. 项目配置2.1. 基本配置修改iconTitle配置jsconfig.json2.2. 项目目录结构划分删除自带的项目按照常用的目录划分2.3. css样式重置reset.csscommon.cssindex.css3. 路由配置3.1. rou…

Pycharm生成allure报告报错--allure不是内部或外部命令,也不是可运行的程序 或批处理文件

问题: allure报错:‘allure’ 不是内部或外部命令,也不是可运行的程序 或批处理文件截图: 解决方法: 1.安装JDK(版本1.8+),配置环境变量 此处不展示过程,成功的后进入cmd java-version验证 2.下载Allure 下载网址: https://repo.maven.apache.org/mav…

20201330马榕辰第一,二章学习笔记

第一章:一.知识点归纳: 第一章前半部分重在介绍课程和书本的基本情况,包括Unix / Linux的历史,其各种发行版,我了解到了一些基本情况。 后半部分主要是 Linux的使用,Linux的启动过程,Unix/Linux文件系统组织、文件类型和常用的Unix/Linux命令,Linux系统的一些系统管理…

20201306吴龙灿学习笔记

一、知识点归纳: 第一章:引言 主要内容: 第一章是本书的引子,因为本书意在让我们学会Unix以及Linux相关只是,在高级语言的基础上进一步学习创造编程平台的基本语言,让我们学会硬件设备怎么样跟我们所熟知的软件设备取得联系。第一章讲述了我们如何利用本书学好系统编程,…

第二章 操作系统基本原理(操作系统知识)

一:操作系统概述 二:进程管理 PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。 三:存储管理四:文件管理五:作业管理六:设备管理

opencv入门四

目录鼠标操作与响应图像像素归一化类型转换图像放缩插值鼠标操作与响应 static void on_draw(int event, int x, int y, int flags, void* userobj) {Mat image *(Mat*)userobj;if (event EVENT_LBUTTONDOWN) {//鼠标点击时 sp.x x;sp.y y;std::cout << "star…

预科知识1-MarkDown语法

MarkDown语法的基本操作markdown 标题 方法:#(几个)+空格+内容 三级标题 四级标题 字体 方法:加粗(2个星号 内容 2个星号) 斜体(1个星号 内容 1个星号) 加粗斜体(3个星号 内容 3个星号) 删除线(2个波浪 内容 2个波浪) hello world hello world …

在线教育项目【前端路由和Ajax实现分析与后端连接分析】

目录 1&#xff0c;前端路由实现分析 1.1&#xff1a;入口文件中调用路由 1.2&#xff1a;定义路由模块 1.3&#xff1a;编写路由模块文件 1.3.1&#xff1a;配置一个或者多个子路由 1.3.2&#xff1a;编写教师路由对应的文件 2&#xff0c;后端接口分析&#xff08;与后…

查询数字的最邻近

这道题目要用二分+桶排的方式解决 函数: l~r找v c:靠左/右(‘l’/‘r’) 靠左和靠右用STL函数二分就行,这里讲一下思路,二分出最靠左/右的v值(but二维,在but[v][0~len]区间二分)再判断是否在区间内在区间内输出but[v][a](a为二分的答案)否则输出-1。 最后再考虑一下需要…

注解Annotation

注解是一种引用数据类型,重点掌握Deprecated(表示已过时),Override(表示重写)。 元注解是用来标注注解类型的注解如Target(用来标注注解可以出现在哪些位置)、Retention(用来标注最终保存到哪里)。 package com.javastudy.example13;import java.lang.annotation.Ann…

计算机毕业设计php+vue基于微信小程序的员工宿舍报修系统

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…