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 流程 的相关文章

  • C++ 中多线程的 join() 和 detach() 有什么不同?

    之间有什么不同join and detach 在C 中的多线程中 做join 杀死线程 A C thread对象通常 但不总是 代表一个执行线程 这是一个操作系统或平台概念 When thread join 被调用时 调用线程将阻塞 直到执
  • 测试“创建”控制器操作的正确方法是什么?

    我正在使用 Ruby on Rails 3 2 2 Rspec 2 9 0 和 RspecRails 2 9 0 我想测试一下create控制器操作 但我不知道如何使其成为 正确 正确 的方式 我 搭建 了模型 控制器 视图 文件 因此在这
  • Angular:ng-init 不在负载上运行

    我已经看到了一些有关 ng init 问题的堆栈溢出示例 尽管我似乎找不到使用控制器引用它的示例 我通过在 html 文件中包含以下内容来调用控制器中的函数 div class tab container 在控制器中 scope init
  • 视图应该依赖于它的控制器吗? (ASP.NET MVC)

    这里有一个关于 ASP NET MVC 的设计 使用的问题 在html帮助器类中 您可以通过Html ViewContext Controller获取当前控制器 此外 您可以从 html 帮助器类获取请求 路由集合等 这不违背MVC的规则吗
  • php Laravel ~ 属性 [controller] 不存在

    我正在尝试在 Laravel 项目中设置一个路线控制器 并且我已经设置了控制器和路线 但是 当我将路线加载到web php然后当我尝试在浏览器中导航到该页面时它会产生错误Attribute controller does not exist
  • 如何在 ASP.net 控制器操作中访问整个查询字符串

    我知道如果我有一个像 XController Action id 1 这样的 url 和一个操作方法 void Action int id id 参数将自动从查询字符串中读取 但是 当我事先不知道所有参数的名称时 如何访问整个查询字符串 例
  • 服务层=应用层=GRASP控制器层[关闭]

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

    我在控制器的方法中多次使用具有相同消息的 ViewBag Message 可以在类的顶部声明 ViewBag Message 这样就可以在整个控制器中使用而无需重复代码吗 假设 Razor 语法可以实现这一点 string pageMess
  • 如何拦截并翻译USB事件

    我想使用飞利浦 LFH 2330 查看图像 使用 Windows Image Viewer 或其他查看器 如 IrfanView 等 LFH 2330 是一款带有四个踏板的脚踏控制器 参见here http www aaaaudio net
  • Java FX 更改前一阶段场景中的标签文本

    我有一个Main启动我的应用程序的类有其MainControllerfxml 中指定的类 当点击Connect按钮打开另一个具有不同场景和控制器的窗口 基于我想要改变的行动Label通过 my 的文本值MainController 但它没有
  • yii2 在 gridview 中更改控制器操作

    我有 ItemController 并在 actionView 中放置了 Itempicture 的 gridview 我希望当我单击图标视图时 更新和删除 然后转到 ItempictureController 那么如何使用不同的控制器更改
  • 当javaFX的控制器不足以显示内容时,它会在末尾显示“...”?

    我的问题是我可以捕获显示 的事件吗 我的意思是javaFX有API来判断内容结尾是否替换为 吗 事实上 我提出这个问题的原因是 现在我们的测试人员希望我们在一个控制器 如标签 上设置一个 TIP 如果它不足以显示 如果内容足以在控制器中显示
  • Ruby on Rails - 创建用户时创建配置文件

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

    In this http docs oracle com javafx 2 api javafx fxml doc files introduction to fxml html nested controllers教程中 有一个示例说明如
  • Java FX 中的嵌套控制器问题

    我试图包括控制器 SelectedIssueController 在我的主要布局 main fxml 但我收到以下错误 Can not set lt mypackage controllers SelectedIssueController
  • 反转博客条目和评论的显示顺序,Ruby on Rails

    我是 Rails 新手 所以可以在这里使用一些帮助 我已经按照几个教程创建了一个博客 其中包含评论 甚至还有一些 AJAX 花哨的内容 但我仍然坚持一些我希望很简单的事情 博客和评论的默认显示是首先列出最旧的 我如何反转它以在顶部显示最新条
  • Rails 3 限制访问,以便用户只能更新他们的数据

    这看起来应该是相当简单的事情 因为它会被很多需要 我检查用户是否正常登录 但一旦用户登录 他们可能会更改其他人的帐户 例如 假设 ID 为 1 的用户已登录 并且他们将 users 2 edit 作为 url 这将向他们显示用户 2 的数据
  • 在 spring3 控制器上返回“ModelAndView”或“String”哪个更好

    ModelAndView的返回方式 RequestMapping value list method RequestMethod GET public ModelAndView list UserAuth UserAuth user Mod
  • GEF + EMF:为什么当调用refreshChildren() 时,我的编辑器不删除已删除对象的图形?

    我已经为类似图形的 EMF 模型实现了 GEF 编辑器 并为图形中的某种类型的节点提供了删除命令 我想我已经完成了所有必要的步骤以使此设置正常工作 vainolo https stackoverflow com users 817399 v
  • 调用控制器 Post 方法时遇到问题

    这是我的方法 AcceptVerbs HttpVerbs Post public void SaveImage FormCollection formValues byte contents Convert FromBase64String

随机推荐

  • 学习Oracle 最好的5本书

    转自 xff1a http www goodu info gc node 88 经过精心搜集和统计 xff0c 这里列出了学习Oracle最好的5本书 xff0c 从入门到精通从简单理解到高级技巧 xff0c 涵盖了历年来最佳学习实践经验
  • java-HttpURLConnection 发送POST请求 传递参数或JSON数据

    java HttpURLConnection 发送POST请求 传递参数或JSON数据 需求 三方接口 restful请求 POST方式 参数JSON 接收数据JSON HttpURLConnection发送POST请求 span clas
  • 一次DPDK-L3FWD-ACL的问题排查

    其实说起来不是什么大问题 xff0c 所有的配置按照下面这个来的 包括写入arp和配置默认路由 xff0c 不过我用的单文件那个l3fwd acl https blog csdn net sinat 20184565 article det
  • Centos7关机和重启前执行自定义脚本

    0 前言 如果你在linux系统上启动了很多自己的服务 xff0c 如果直接执行系统的reboot或者shutdown命令 xff0c 可能会发生一些异常的现象 xff0c 所以我们在重启和关机前 xff0c 应该按照我们的意愿去自定义清理
  • Ubuntu20.04系统WineHQ7.0安装微信

    提供3种Ubuntu系统安装微信的方法 xff0c 在Ubuntu20 04上验证都ok 1 WineHQ7 0安装微信 xff1a ubuntu20 04安装最新版微信 可以支持微信最新版 xff0c 但是适配的不是特别好 xff1b 比
  • 0402 0603 0805 1206焊盘封装尺寸

  • Ubuntu 上使用hexo+github打造个人blog

    最近一段时间想要搭建个人的blog xff0c 然后好好写博客 在网上大致看了下 xff0c 一致的推荐hexo来搭建个人blog xff0c 而且可以通过github挂载在公网上去 xff0c 由于个人使用的Ubuntu 16 04 xf
  • 简单使用Python爬虫爬取淘宝网页商品信息

    最近在学习爬虫 xff0c 本人还是入门级的小白 xff0c 自己跟着老师写了一些代码 xff0c 算是自己的总结 xff0c 还有一些心得 xff0c 跟大家分享一下 xff0c 如果不当 xff0c 还请各位前辈斧正 这是代码 xff1
  • 非常详细的范式讲解(1NF/2NF/3NF/BCNF)

    范式 范式在计算机方面运用广泛 xff0c 在计算机二级三级均有涉及到 xff0c 今天就来讲讲范式 要是能够认真的看完 xff0c 相信一定能够理解的 在讲范式之前 xff0c 我们先来了解有关范式的基本概念 xff0c 听懂了有利于后面
  • ubuntu18.04无法安装libesd0-dev完美解决办法

    ubuntu18 04无法安装libesd0 dev 解决办法 解决办法 span class token comment 在行尾添加如下一行的内容 span span class token function sudo span vim
  • SystemUI学习记录

    OS android 7 1 由于项目需要需要对SystemUI进行定制化 xff0c 需求比较紧急 xff0c 没有很深入的去了解其整体代码 xff0c 仅仅记录下我的用到修改记录如下 xff1a 目录中有 或者 由于在不同的系统环境拷贝
  • 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 让他们无法合作一样 计
  • python 正则表达式点号与'\n'符号的问题

    匹配除了制表符和换行符之外的所有字符 前面的元字符出现任意次 xff0c 含0 43 前面的元字符出现一次或多次 xff1f 非贪婪模式 re S可以匹配多行 S s 匹配所有字符 所以 可以使用 s S 取代 在Python中可以使用方法
  • 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