Attach detach controller manager 流程

2023-05-16

一:初始化

1.adc调用InitPlugins()初始化volumeplugins

1.1初始化dynamicplugins(Currentlyonly Flexvolume plugins are dynamicallydiscoverable.Flexvolume允许用户编写自己的驱动程序,并在Kubernetes中添加对其Volume的支持)

1.2初始化kubernetes已经含有的volumepluginsaws,gce,cinder等等

2.创建两个缓存desiredStateOfWorld(存放volume期望的状态)actualStateOfWorld

(存放volume当前的状态)

3.初始化对象attacherDetacher(用于挂载卸载volume)nodeStatusUpdater(更新node的状态)reconciler(循环进行attachdetach操作)desiredStateOfWorldPopulator(处理volume达到desiredStateOfWorld的状态)

二:启动

1.通过informer同步podnode pv pvc的状态到缓存

2.调用populateActualStateOfWorld()nodevolume当前的对应状态存入actualStateOfWorld

3.调用populateDesiredStateOfWorld()podvolume期望的对应状态存入desiredStateOfWorld

4.reconciler.Run()循环执行挂载卸载操作,处理desiredStateOfWorld达到actualStateOfWorld,并定期检查actualStateOfWorld的状态是真实挂载的,否则将volumeactualStateOfWorld删除。

5.desiredStateOfWorldPopulator.Run()循环获取新的pod的挂载信息,生成desiredStateOfWorld对应的状态

三:populateActualStateOfWorld


type actualStateOfWorld struct {
   所有已经挂载的volume信息,keyvolume unique name(volume plugin + volume id)用来记录volume的挂载状态
   attachedVolumes map[v1.UniqueVolumeName]attachedVolume
   volume挂载到某个node上的对应(node --> volume ) 用来跟踪volume的挂载状态(确认被标记为已被挂载到该节点的volume被挂载了)
   nodesToUpdateStatusFor map[types.NodeName]nodeToUpdateStatusFor
   volumePluginMgr *volume.VolumePluginMgr
   sync.RWMutex
}
type attachedVolume struct {
   // 唯一的volume
   volumeName v1.UniqueVolumeName
   volume的详细信息
   spec *volume.Spec
   volume的挂载信息,keynode名,nodeAttachedTo包含简单的node信息
   nodesAttachedTo map[types.NodeName]nodeAttachedTo
   volumenode上的挂载路径
   devicePath string
}
type nodeAttachedTo struct {
   nodeName types.NodeName
   是否被挂载,默认时挂载的状态,会轮询验证这个volume确实是被挂载的
   mountedByNode bool
   // number of times SetVolumeMountedByNode has been called to set the value
   // of mountedByNode to true. This is used to prevent mountedByNode from
   // being reset during the period between attach and mount when volumesInUse
   // status for the node may not be set.
   mountedByNodeSetCount uint
   // detachRequestedTime used to capture the desire to detach this volume
   detachRequestedTime time.Time
}

type nodeToUpdateStatusFor struct {
   nodeName types.NodeName
   volume的挂载状态有变化时,需及时更新nodestatus,当volumedetach了,需要删除nodeattachedvolume对应volume的值
   statusUpdateNeeded bool
   标记volumeattached
   volumesToReportAsAttached map[v1.UniqueVolumeName]v1.UniqueVolumeName
}
  

1.获取所有node,并根据node.Status.VolumesAttached(已经挂载的volume)volume标记为已被挂载。

1.1调用AddVolumeNode(uniqueName,volumeSpec, nodeName, devicePath)volume的挂载状态存起来

1.1.1存入attachedVolumes(volume--> detail)

1.1.2调用addVolumeToReportAsAttached()存入nodesToUpdateStatusFor(node--> volume)

1.2调用processVolumesInUse()处理in-use状态的volume

1.2.1调用GetAttachedVolumesForNode获取所有挂载到该node上的volume

1.2.2volume的确挂载到node上且状态是in-use时,调用SetVolumeMountedByNodemountedByNode设置为true

1.3调用addNodeToDswpnode存入desiredStateOfWorld,如果node含有“停止挂载volume”的标签,adc需要将node上的volume期望状态设置为detached,进而再根据volume性为去detachvolume



四:populateDesiredStateOfWorld ==nodesManaged


type desiredStateOfWorld struct {
   node -> pod -> volume
   nodesManaged map[k8stypes.NodeName]nodeManaged
   volumePluginMgr *volume.VolumePluginMgr
   sync.RWMutex
}
type nodeManaged struct {
   nodeName k8stypes.NodeName
 //volumesToAttach是一个map包含一系列volumekeyvolume valuevolumepod的信息
   volumesToAttach map[v1.UniqueVolumeName]volumeToAttach
 对于删除了的pod,是否需要删除pod对应的volume
   keepTerminatedPodVolumes bool
}
type volumeToAttach struct {
   //多节点挂载报错
   multiAttachErrorReported bool
   volumeName v1.UniqueVolumeName
   volume的详情
   spec *volume.Spec
   volume所挂载pod的详情
   scheduledPods map[types.UniquePodName]pod
}  



1.获取所有的pod,调用podAddpodvolume加入到desiredStateOfWorld

1.1如果pod所在的node不在desiredStateOfWorld中,就将这样的pod过滤过,不处理这样的podvolume

1.2假如podnode被标记“删除pod”,调用desiredStateOfWorld.DeletePoddesiredStateOfWorld中删除pod,没有就直接返回

1.3否则将pod添加到desiredStateOfWorld,等待挂载

1.4依次遍历podvolume,判断volume是否挂载了,如果挂载就将volumemarkattached,否则报错(这段代码有问题,不需要在这里遍历vlume进而去修改actualStateOfWorld



五:goadc.reconciler.Run(stopCh)循环执行挂载卸载操作

1.reconcile()

1.1(Ensurevolumes that should be detached aredetached.)遍历actualStateOfWorld中已经挂载的volume,假如该volume不在desiredStateOfWorld中并且挂载的时间超过maxWaitForUnmountDuration,将该volumeactualStateOfWorld删除,即markdetached,也调用UpdateNodeStatuses()更新volumenodedetach信息.最后调用attacherDetacher.DetachVolume()detachvolume,即调用volume插件去detach

1.2(Ensurevolumes that should be attached are attached)

1.2.1遍历desiredStateOfWorld中期望被挂载的volume,假如该volumeactualStateOfWorld中,则ResetDetachRequestTime重新设置detach时间(待续),否则挂载他

1.2.2调用isMultiAttachForbidden判断该volume是否禁止多点挂载,如果是,判断该volume挂载到多个节点了报错,

1.2.3调用attacherDetacher.AttachVolume挂载期望被挂载但还没挂载的volume

1.3调用rc.nodeStatusUpdater.UpdateNodeStatuses()更新nodevolume挂载状态



2.disableReconciliationSynctrue时,如果adc已经挂载过的volume被别人通过命令行detach了,adc不会去再次挂载。否则执行sync()去同步volume的挂载状态

2.1调用GetAttachedVolumesPerNodeactualStateOfWorld获取所有已经挂载的volumevlume所挂载的node信息,GetAttachedVolumesPerNodeattachedVolumes获取信息:map[types.NodeName][]operationexecutor.AttachedVolume

2.2调用VerifyVolumesAreAttached确保volume已经挂载到node上了

2.2.1将需要确保被挂载的volume及其node存入mapnode-->volume

2.2.2假如volumeplugin支持BulkVerifyVolumes(plugin含有获取volume真实挂载信息的函数,该函数能获取到集群中所有node上挂载的volume信息,node--> volume)

就调用BulkVerifyVolumes()获取到node上挂载的volume信息,根据2.2.1map,检测mapnode对应的volume是否确实被挂载了,假如mapvolume没有被真实挂载则调用MarkVolumeAsDetached标记actualStateOfWorld中该volumedetached的,即从actualStateOfWorld中将该volume删除

2.2.3否则调用VerifyVolumesAreAttachedPerNode依次检查node上的volume是否被真实挂载

2.2.3.1调用VolumesAreAttached去判断mapvolume是否被挂载到node(例如openstackcinder:如果volume被挂载到某个node上,volume的详情中能查到挂载的nodeid,如果nodeid是相同,则认为是被真实挂载到该node上了),假如mapvolume没有被真实挂载则调用MarkVolumeAsDetached标记actualStateOfWorld中该volumedetached的,即从actualStateOfWorld中将该volume删除



六:goadc.desiredStateOfWorldPopulator.Run(stopCh)

1调用findAndRemoveDeletedPodsnodesManaged中不再存在的pod删除

1.1调用GetPodToAddnodesManaged获取所有podpodvolume挂载信息

1.2判断pod是否存在podinformer缓存中,不存在就调用DeletePod将该podnodesManaged中删除

2调用findAndAddActivePods将新的activepodpod上的volume信息加入nodesManaged中。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Attach detach controller manager 流程 的相关文章

  • 服务层=应用层=GRASP控制器层[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我认为服务 应用程序层与 Larman 描述的 GRASP 控制器相同 是 GUI 层之外委托给域层的
  • 在控制器上声明 ViewBag

    我在控制器的方法中多次使用具有相同消息的 ViewBag Message 可以在类的顶部声明 ViewBag Message 这样就可以在整个控制器中使用而无需重复代码吗 假设 Razor 语法可以实现这一点 string pageMess
  • Java FX 更改前一阶段场景中的标签文本

    我有一个Main启动我的应用程序的类有其MainControllerfxml 中指定的类 当点击Connect按钮打开另一个具有不同场景和控制器的窗口 基于我想要改变的行动Label通过 my 的文本值MainController 但它没有
  • Ruby on Rails:使用控制器、操作和参数获取路线

    我对 RoR 很陌生 我正在寻找一种获取给定控制器 操作和参数的路线的方法 类似于 url for 但没有域和协议 可以说我有 params controller gt controller action gt edit project i
  • 如何在 Grails 集成测试中制作两个内容不同的帖子

    我正在测试一个控制器 我无法发表两个内容不同的帖子 下面是一个示例 其中我使用一些数据 post1 使用 json1 执行到 cardController 的发布 然后 我使用不同的数据执行另一篇文章 post2 和 json2 但我无法成
  • 我该如何解决这个问题?单元类型存在于两个dll文件中

    我目前正在学习使用 Visual Studio 11 beta 的教程 当尝试在我的一个类中设置字段值的最大长度时 MaxLength 50 public string LastName get set 它出错并且不会让我编译 因为MaxL
  • Spring 3 MVC Controller集成测试-将Principal注入到方法中

    作为 Spring 3 MVC 的一部分 可以将当前登录的用户 原理 对象注入到控制器方法中 E g Controller public class MyController RequestMapping value update meth
  • 当javaFX的控制器不足以显示内容时,它会在末尾显示“...”?

    我的问题是我可以捕获显示 的事件吗 我的意思是javaFX有API来判断内容结尾是否替换为 吗 事实上 我提出这个问题的原因是 现在我们的测试人员希望我们在一个控制器 如标签 上设置一个 TIP 如果它不足以显示 如果内容足以在控制器中显示
  • CodeIgniter 仅允许在登录时访问某些控制器

    我有一些 CodeIgniter 控制器 只能由已登录的用户访问 即 this gt session gt userdata username 不为空 如果未经身份验证的人尝试访问所述控制器 他们应该收到 header location a
  • Ruby on Rails - 创建用户时创建配置文件

    所以基本上我已经编写了自己的身份验证而不是使用 gem 因此我可以访问控制器 我的用户创建工作正常 但是当创建我的用户时 我还想在我的个人资料模型中为他们创建个人资料记录 我已经让它大部分工作了 我只是似乎无法将新用户的 ID 传递到新的
  • 不允许子操作执行重定向操作。 (使用部分视图)

    我正在尝试使用数据库中的一些数据加载部分视图 但在运行应用程序时遇到以下问题 不允许子操作执行重定向操作 我不知道为什么会发生这种情况 因为我对 MVC 技术还很陌生 这是我的PartialViewResult控制器中的方法 public
  • 将 .js 控制器请求渲染为 html

    我有一个before filter在我的 Rails 应用程序中 将用户发送到login url如果他们在提交请求 以 html 或 js 格式 时注销 我想要我的format js产生相同的结果format html 在以下情况下使用 通
  • asp.net mvc 按名称和区域查找控制器

    我的目标是从控制器的名称和区域中找到控制器 如果我当前的httpContext与待找到的控制器位于同一区域内 但是 我无法拨打电话ControllerFactory考虑面积 这是我的代码 public static ControllerBa
  • ASP.Net MVC 将特定路由重定向到外部站点

    我有一个功能良好的 ASP Net MVC 站点 使用简单的标准路由方案 routes MapRoute Default controller action id new controller Home action Index id 我的
  • 如何从 mvc 控制器中的 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable 获取值

    我知道标题有点复杂 但让我通过解释问题来澄清标题 As per image I want to filter product name in search textbox For ex In search textbox if I ente
  • Laravel 将数据传递给路由

    我是 Laravel 5 的新手 我需要一些帮助 因为我无法解决我的简单问题 我有一个数据列表http sample com partners http sample com partners如果我单击数据链接 我希望将其重定向到 http
  • 调用控制器 Post 方法时遇到问题

    这是我的方法 AcceptVerbs HttpVerbs Post public void SaveImage FormCollection formValues byte contents Convert FromBase64String
  • CodeIgniter:将参数从视图传递到控制器?

    编辑 现在使用下面的代码 我不确定如何正确打印书签和标签 我对 CI 完全陌生 最近遇到了障碍 我非常不确定如何将函数参数从视图文件传递到控制器 以便我可以在函数上使用它 我在视图上有一个 foreach 循环 遍历函数 get lates
  • 此集合实例 Laravel 关系中不存在属性 [X]

    我在 Laravel 5 6 中使用了很多 Realtions 当我添加 phonebooks 时 我看到所有关系都工作正常 一切都很好 但是当我尝试在视图中显示它们时 我得到了属性在此集合上不存在的错误 这是关系代码 public fun
  • 来自控制器的 Rails 验证

    有一个联系页面 可以输入姓名 电话 电子邮件和消息 然后发送到管理员的电子邮件 没有理由将消息存储在数据库中 问题 如何 在控制器中使用 Rails 验证 根本不使用模型 或者 在模型中使用验证 但没有任何数据库关系 UPD Model c

随机推荐

  • 结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程

    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程 一 xff0c 实验目标 以fork和execve系统调用为例分析中断上下文的切换分析execve系统调用中断上下文的特殊之处分析fork子进程启动执行时进程上下文的特殊之
  • SPI、UART、RS232、RS485、IIC 5种嵌入式经典通信总线协议

    文章目录 一 UART1 通信基础 并行和串行并行通信串行通信 2 通信基础 单工和双工3 通信基础 比特率4 通讯基础 异步和同步5 UART硬件连接6 UART控制器串口控制器工作原理介绍 xff1a FIFO模式及其作用 7 IO操作
  • 基于Modbus协议的C#串口工具开发

    xff08 Tips 本人纯萌新小白一枚 xff0c 文章只为记录自己的编程历史 xff0c 温故而知新 xff0c 能帮助到大家倍感荣幸 xff0c 有错误的地方劳烦指点 xff01 xff09 不多废话直接进入主题 xff01 本文旨在
  • MySQL中的mysqldump命令使用详解

    MySQL 有很多可以导入数据的方法 xff0c 然而这些只是数据传输中的一半 xff0c 另外的一般是从 MySQL 数据库中导出数据 有许多的原因我们需要导出数据 一个重要的原因是用于备份数据库 数据的造价常常是昂贵的 xff0c 需要
  • xrdp完美实现Windows远程访问Ubuntu 16.04【包括多人桌面与原生桌面】

    xrdp完美实现Windows远程访问Ubuntu 16 04 前言 xff1a 在很多场景下 xff0c 我们需要远程连接到Linux服务器 本文是Ubuntu xff0c 传统的连接主要分为两种 第一种 xff1a 通过SSH服务 xf
  • 蓝牙协议栈(Bluetooth stack)简介

    1 前言 本文只要对蓝牙协议栈做一个简单介绍 xff0c 包含hci层 acl链路 1 l2cap层 xff0c sdp服务及几个常见的profile xff0c 让初学蓝牙协议栈的人 对整个蓝牙协议栈有一个整体框架的了解 2 HCI层 H
  • 树莓派新手入门教程

    原文 xff1a http www ruanyifeng com blog 2017 06 raspberry pi tutorial html 作者 xff1a 阮一峰 日期 xff1a 2017年6月15日 树莓派 xff08 Rasp
  • 数据结构实训之学生信息管理系统

    Copyright c 2016 烟台大学计算机与控制工程学院 All rights reserved 文件名称 xff1a 项目1 cpp 作 者 xff1a 泮春宇 完成日期 xff1a 2016年1月1日 版 本 号 xff1a v1
  • echart图表之highcharts

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 HighCharts是什么 xff1f 二 使用步骤1 引入库2 前端代码3 展现结果4 后台自动截图 总结 前言 提示
  • web登陆退出测试点总结

    根据自己的测试经历 xff0c 又阅读了一些关于登陆测试的资料 xff0c 对web 登陆退出测试点做了一下总结 xff1a 界面测试 xff1a 1 登陆页面显示是否正常 xff1a 文字和图片能否正常显示 xff0c 相应的提示信息是否
  • 异常值检测算法

    闲话 xff1a 最近总是特别嗜睡 xff0c 不知为何床对我的引力总是让我死死的赖在上面 xff0c 大概是懒癌又犯了 要改 异常值分析是检验数据是否有录入错误以及含有不合常理的数据的过程 xff0c 忽视异常值的存在是十分危险的 xff
  • informer

    list watch机制 list watch有两部分组成 xff0c 分别是list和watch list非常好理解 xff0c 就是调用资源的list API罗列资源 xff0c 基于HTTP短链接实现 xff1b watch则是调用资
  • kubelet - container manager

    containerManager 负责 node 节点上运行的容器的配置信息 xff0c 如 cgroup cpu device xff1b pod的创建流程参考 xff1a http www tianfeiyu com p 61 2825
  • 理解TCP/IP网络通信原理

    为什么会有TCP IP协议 在世界上各地 xff0c 各种各样的电脑运行着各自不同的操作系统为大家服务 xff0c 这些电脑在表达同一种信息的时候所使用的方法是千差万别 就好像圣经中上帝打乱了各地人的口音 xff0c 让他们无法合作一样 计
  • 最新百度 阿里 华为 腾讯 谷歌面试笔试题及解析

    8月15日 xff0c 百度2道面试题 xff1a 1 来自 编程之美 的概率题 xff1a 一个桶里面有白球 黑球各100个 xff0c 现在按下述规则取球 xff1a 的 i 每次从通里面拿出来两个球 xff1b ii 如果取出的是两个
  • virsh的使用与实例步骤安装虚拟机

    Libvirt 有两种控制方式 xff0c 命令行和图形界面 图形界面 xff1a 通过执行名 virt manager xff0c 启动 libvirt 的图形界面 xff0c 在图形界面下可以一步一步的创建虚拟机 xff0c 管理虚拟机
  • Jboss低版本项目热部署到Jboss7

    Jboss低版本项目热部署到Jboss7 1 Jboss7 新特性 1 1 构建在 Modular Service Container上 xff0c 充分地利用了多核处理器的能力 xff0c 并发 按需启动服务 xff0c 启动速度更快 占
  • devstack安装openstack

    devstack是一套用来给开发人员快速部署Openstack开发环境的脚本 xff0c 其实对于整个安装过程没有什么好说的 xff0c 因为脚本写的很完善 xff0c 全程无脑式安装也没什么大问题 xff0c 但是因为公司里的网络环境不给
  • RBAC vs ABAC

    K8s在1 3版本中发布了alpha版的基于角色的访问控制 xff08 Role based Access Control xff0c RBAC xff09 的授权模式 相对于基于属性的访问控制 xff08 Attribute based
  • Attach detach controller manager 流程

    一 xff1a 初始化 1 adc 调用 InitPlugins 初始化 volumeplugins 1 1 初始化 dynamicplugins Currentlyonly Flexvolume plugins are dynamical