当前位置: 首页 > news >正文

vps怎么搭建网站滕州网站建设制作

vps怎么搭建网站,滕州网站建设制作,phpcms适合做什么网站,搜索引擎优化的定义是什么Attach 和 Mount 一、核心概念对比操作Attach#xff08;挂载设备#xff09;Mount#xff08;挂载文件系统#xff09;定义将存储卷#xff08;如 EBS、NFS 等#xff09;连接到宿主机将已 Attach 的存储设备映射为宿主机上的文件系统路径执行者云提供商驱动#xff08…Attach 和 Mount 一、核心概念对比操作Attach挂载设备Mount挂载文件系统定义将存储卷如 EBS、NFS 等连接到宿主机将已 Attach 的存储设备映射为宿主机上的文件系统路径执行者云提供商驱动AWS EBS CSI Driver或存储系统插件容器运行时containerd、Docker或 kubelet操作对象存储卷Volume文件系统FilesystemKubernetes 资源VolumeAttachment 对象Pod.spec.volumes 定义操作结果宿主机可识别存储设备如 /dev/xvdf容器可访问文件路径如 /data二、工作流程与协作关系 1. Attach 流程图源https://www.lixueduan.com/posts/kubernetes/14-pv-dynamic-provision-process/#1-attach 1. 核心组件与职责 Kubernetes 的存储 Attach 流程由两个核心组件协作完成 AD Controller (AttachDetach Controller) 位于 kube-controller-manager 中负责计算节点上需要 Attach/Detach 的卷并创建 VolumeAttachment 资源。external-attacher 独立运行的 CSI 插件监听 VolumeAttachment 资源变化调用 CSI Driver 的接口执行实际 Attach 操作。 2. Attach 触发条件 AD Controller 通过以下逻辑触发 Attach 操作 监听 Pod 调度当 Pod 被调度到特定节点时AD Controller 获取该节点上所有 Pod 的 Volume 列表。计算待 Attach 卷对比当前节点的 status.volumesAttached 与 Pod 需要的卷找出未 Attach 的 PV。多节点挂载检查对 ReadWriteOnce (RWO) 类型的卷检查是否已被其他节点挂载若已挂载则报错。 3. VolumeAttachment 资源 AD Controller 创建的 VolumeAttachment 对象包含三个关键信息 apiVersion: storage.k8s.io/v1 kind: VolumeAttachment spec:attacher: nfs.csi.k8s.io # CSI Driver 名称nodeName: ee # 目标节点source:persistentVolumeName: pvc-047acd58-... # 待挂载的 PV status:attached: false # 挂载状态由 external-attacher 更新4. 详细执行流程 #mermaid-svg-VK4oe6ag8CHX9WoZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ .error-icon{fill:#552222;}#mermaid-svg-VK4oe6ag8CHX9WoZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VK4oe6ag8CHX9WoZ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VK4oe6ag8CHX9WoZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VK4oe6ag8CHX9WoZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VK4oe6ag8CHX9WoZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VK4oe6ag8CHX9WoZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VK4oe6ag8CHX9WoZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VK4oe6ag8CHX9WoZ .marker.cross{stroke:#333333;}#mermaid-svg-VK4oe6ag8CHX9WoZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VK4oe6ag8CHX9WoZ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VK4oe6ag8CHX9WoZ text.actortspan{fill:black;stroke:none;}#mermaid-svg-VK4oe6ag8CHX9WoZ .actor-line{stroke:grey;}#mermaid-svg-VK4oe6ag8CHX9WoZ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ .sequenceNumber{fill:white;}#mermaid-svg-VK4oe6ag8CHX9WoZ #sequencenumber{fill:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ .messageText{fill:#333;stroke:#333;}#mermaid-svg-VK4oe6ag8CHX9WoZ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VK4oe6ag8CHX9WoZ .labelText,#mermaid-svg-VK4oe6ag8CHX9WoZ .labelTexttspan{fill:black;stroke:none;}#mermaid-svg-VK4oe6ag8CHX9WoZ .loopText,#mermaid-svg-VK4oe6ag8CHX9WoZ .loopTexttspan{fill:black;stroke:none;}#mermaid-svg-VK4oe6ag8CHX9WoZ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VK4oe6ag8CHX9WoZ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VK4oe6ag8CHX9WoZ .noteText,#mermaid-svg-VK4oe6ag8CHX9WoZ .noteTexttspan{fill:black;stroke:none;}#mermaid-svg-VK4oe6ag8CHX9WoZ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VK4oe6ag8CHX9WoZ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VK4oe6ag8CHX9WoZ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VK4oe6ag8CHX9WoZ .actorPopupMenu{position:absolute;}#mermaid-svg-VK4oe6ag8CHX9WoZ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-VK4oe6ag8CHX9WoZ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VK4oe6ag8CHX9WoZ .actor-man circle,#mermaid-svg-VK4oe6ag8CHX9WoZ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-VK4oe6ag8CHX9WoZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}ADControllerVolumeAttachmentExternalAttacherCSIDriverCloudProviderNode创建 VolumeAttachment 资源监听资源变化调用 ControllerPublishVolume(PV, Node)调用云 API如 AWS EBS Attach返回设备 ID如 /dev/xvdf返回成功更新 status.attachedtrue更新 status.volumesAttachedADControllerVolumeAttachmentExternalAttacherCSIDriverCloudProviderNode 2. Mount 流程 2.1 核心组件与数据结构 Kubernetes 的 Mount 流程由 kubelet 的 volumeManager 组件管理主要包含以下核心元素 type volumeManager struct {desiredStateOfWorld cache.DesiredStateOfWorld // 期望状态缓存actualStateOfWorld cache.ActualStateOfWorld // 实际状态缓存reconciler reconciler.Reconciler // 状态协调器desiredStateOfWorldPopulator populator.DesiredStateOfWorldPopulator // 状态填充器// ...其他组件 }desiredStateOfWorld保存当前节点上所有 Volume 期望的状态actualStateOfWorld保存当前节点上所有 Volume 实际的状态reconciler周期性比较两个状态执行挂载/卸载操作desiredStateOfWorldPopulator处理节点上的 Pod更新期望状态 2.2 状态同步机制 reconciler 通过周期性对比状态执行挂载/卸载操作 func (rc *reconciler) reconcile() {if rc.readyToUnmount() {rc.unmountVolumes() // 卸载不再需要的卷}rc.mountOrAttachVolumes() // 挂载新卷或处理已挂载卷if rc.readyToUnmount() {rc.unmountDetachDevices() // 卸载设备rc.cleanOrphanVolumes() // 清理孤立卷}// 更新状态同步时间if len(rc.volumesNeedUpdateFromNodeStatus) ! 0 {rc.updateReconstructedFromNodeStatus()}if len(rc.volumesNeedUpdateFromNodeStatus) 0 {rc.updateLastSyncTime()} }2.3 卸载流程 遍历 actualStateOfWorld卸载不再需要的卷 func (rc *reconciler) unmountVolumes() {for _, mountedVolume : range rc.actualStateOfWorld.GetAllMountedVolumes() {// 检查是否有未完成的操作if rc.operationExecutor.IsOperationPending(mountedVolume.VolumeName, mountedVolume.PodName, nestedpendingoperations.EmptyNodeName) {continue}// 如果卷不在期望状态中执行卸载if !rc.desiredStateOfWorld.PodExistsInVolume(mountedVolume.PodName, mountedVolume.VolumeName, mountedVolume.SELinuxMountContext) {err : rc.operationExecutor.UnmountVolume(mountedVolume.MountedVolume, rc.actualStateOfWorld, rc.kubeletPodsDir)if err ! nil {klog.ErrorS(err, UnmountVolume failed)}}} }2.4 挂载流程 遍历 desiredStateOfWorld挂载新卷或处理需要更新的卷 func (rc *reconciler) mountOrAttachVolumes() {for _, volumeToMount : range rc.desiredStateOfWorld.GetVolumesToMount() {// 检查是否有未完成的操作if rc.operationExecutor.IsOperationPending(volumeToMount.VolumeName, nestedpendingoperations.EmptyUniquePodName, nestedpendingoperations.EmptyNodeName) {continue}// 检查卷状态volMounted, devicePath, err : rc.actualStateOfWorld.PodExistsInVolume(volumeToMount.PodName, volumeToMount.VolumeName, volumeToMount.DesiredPersistentVolumeSize, volumeToMount.SELinuxLabel)volumeToMount.DevicePath devicePath// 根据不同错误类型执行不同操作switch {case cache.IsSELinuxMountMismatchError(err):// SELinux 上下文不匹配标记错误case cache.IsVolumeNotAttachedError(err):// 卷未挂载等待 Attachrc.waitForVolumeAttach(volumeToMount)case !volMounted || cache.IsRemountRequiredError(err):// 卷未挂载或需要重新挂载rc.mountAttachedVolumes(volumeToMount, err)case cache.IsFSResizeRequiredError(err):// 文件系统需要扩容rc.expandVolume(volumeToMount, err.CurrentSize)}} }2.5 实际挂载操作 通过 operationGenerator 执行实际挂载并更新状态 func (og *operationGenerator) GenerateMountVolumeFunc(...) volumetypes.GeneratedOperations {mountVolumeFunc : func() {// 获取卷插件volumePlugin, err : og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec)if err ! nil {return volumetypes.NewOperationContext(err, nil, migrated)}// 创建挂载器volumeMounter, err : volumePlugin.NewMounter(volumeToMount.VolumeSpec, volumeToMount.Pod)if err ! nil {return volumetypes.NewOperationContext(err, nil, migrated)}// 等待设备挂载如果需要devicePath, err : volumeAttacher.WaitForAttach(volumeToMount.VolumeSpec, devicePath, volumeToMount.Pod, waitForAttachTimeout)if err ! nil {return volumetypes.NewOperationContext(err, nil, migrated)}// 执行挂载mountErr : volumeMounter.SetUp(volume.MounterArgs{...})if mountErr ! nil {return volumetypes.NewOperationContext(mountErr, nil, migrated)}// 扩容文件系统如果需要if resizeNeeded {err og.expandVolumeDuringMount(volumeToMount, actualStateOfWorld, resizeOptions)if err ! nil {return volumetypes.NewOperationContext(err, nil, migrated)}}// 更新实际状态markVolMountedErr : actualStateOfWorld.MarkVolumeAsMounted(markOpts)if markVolMountedErr ! nil {return volumetypes.NewOperationContext(markVolMountedErr, nil, migrated)}return volumetypes.NewOperationContext(nil, nil, migrated)}return volumetypes.GeneratedOperations{OperationFunc: mountVolumeFunc,// ...其他回调函数} }2.6 实际卸载操作 通过 operationGenerator 执行卸载并更新状态 func (og *operationGenerator) GenerateUnmountVolumeFunc(...) {unmountVolumeFunc : func() {// 获取卸载器volumeUnmounter, err : volumePlugin.NewUnmounter(volumeToUnmount.InnerVolumeSpecName, volumeToUnmount.PodUID)if err ! nil {return volumetypes.NewOperationContext(err, nil, migrated)}// 清理子路径挂载点if err : subpather.CleanSubPaths(podDir, volumeToUnmount.InnerVolumeSpecName); err ! nil {return volumetypes.NewOperationContext(err, nil, migrated)}// 执行卸载unmountErr : volumeUnmounter.TearDown()if unmountErr ! nil {// 标记卷状态为不确定actualStateOfWorld.MarkVolumeMountAsUncertain(opts)return volumetypes.NewOperationContext(unmountErr, nil, migrated)}// 更新实际状态actualStateOfWorld.MarkVolumeAsUnmounted(volumeToUnmount.PodName, volumeToUnmount.VolumeName)return volumetypes.NewOperationContext(nil, nil, migrated)}return volumetypes.GeneratedOperations{OperationFunc: unmountVolumeFunc,// ...其他回调函数} }2.7 期望状态更新机制 desiredStateOfWorldPopulator 周期性处理 Pod更新期望状态 func (dswp *desiredStateOfWorldPopulator) Run(ctx context.Context, sourcesReady config.SourcesReady) {// 周期性执行状态填充wait.UntilWithContext(ctx, dswp.populatorLoop, dswp.loopSleepDuration) }func (dswp *desiredStateOfWorldPopulator) processPodVolumes(ctx context.Context, pod *v1.Pod) {for _, podVolume : range pod.Spec.Volumes {// 将 Pod 的卷添加到期望状态uniqueVolumeName, err : dswp.desiredStateOfWorld.AddPodToVolume(uniquePodName, pod, volumeSpec, podVolume.Name, volumeGIDValue, seLinuxContainerContexts[podVolume.Name])if err ! nil {klog.ErrorS(err, Failed to add pod to volume)}} }2.8 关键数据结构 volumesToMount记录需要挂载的卷type volumeToMount struct {volumeName v1.UniqueVolumeNamepodsToMount map[types.UniquePodName]podToMountpluginIsAttachable boolpluginIsDeviceMountable boolvolumeGIDValue stringdesiredSizeLimit *resource.QuantityeffectiveSELinuxMountFileLabel string// ...其他属性 }Mount 流程总结 状态初始化desiredStateOfWorldPopulator 从 Pod 中收集卷信息更新期望状态状态对比reconciler 周期性比较期望状态和实际状态卸载操作对不再需要的卷执行卸载挂载操作对新增卷或需要更新的卷执行挂载状态更新挂载/卸载成功后更新实际状态错误处理处理挂载/卸载过程中的各种异常情况 通过这种双缓存、周期性同步的机制Kubernetes 确保了节点上卷的状态始终与期望状态一致。 3. 协作关系 存储卷生命周期 创建PV/PVC → Attach设备挂载到宿主机 → Mount文件系统挂载到容器 → Unmount从容器卸载 → Detach从宿主机卸载 → 删除PV/PVC三、常见存储类型的 Attach/Mount 差异存储类型Attach 操作Mount 操作EBS块存储将 EBS 卷挂载到 EC2 实例在实例上格式化并挂载文件系统如 ext4NFS网络存储建立网络连接无需显式 Attach通过 NFS 客户端挂载远程文件系统HostPath宿主机路径无已在宿主机上直接将宿主机路径挂载到容器Ceph RBD将 RBD 设备映射到宿主机在宿主机上挂载 RBD 设备为文件系统
http://www.pierceye.com/news/118041/

相关文章:

  • 新闻单位建设网站的意义怎么和其它网站做友情链接
  • 做哪类网站没有版权问题帮忙做公司网站
  • 商城式网站具备哪些功能吗郑州网站设
  • 潍坊市做网站沈阳专业网站制作团队
  • 婚恋网站女孩子都是做美容西安做网站南通公司
  • 网站制作培训中心想做网站建设
  • 免费模板素材网站ppth5开源网站模板
  • 建筑型专业网站有哪些网站想做个链接怎么做的
  • 公司建站文案给网站公司看的wordpress打赏
  • 卡密网站怎么做交易所网站建设教程
  • 响应式网站建设代理wordpress程序在ftp中上传到空间 网页怎么打不开
  • 做网站中网页的大小赤峰建筑人才网
  • 4s店网站建设美的集团网站建设方案书
  • 专业做商铺的网站哪些网站有二维码
  • 房屋备案查询系统官网盐城网站优化公司
  • 江苏网站设计页面设计文献
  • 快排做网站排名泰安哪个做网站
  • 淄博做网站的公司都有哪些网站开发职业环境分析
  • 网站性能视频 怎么做网站
  • 惠安建设局网站做基础销量的网站
  • 网页制作与网站建设自考制作ppt的软件免费下载
  • 会员类网站模板wordpress写主题
  • wordpress网站分享朋友圈缩略图wordpress 密码爆破
  • 总结网站推广策划思路的内容佛山做外贸网站哪家好
  • 阿里云服务器如何做两个网站网站建站对象
  • 做网站毕业实训报告网站架构企业收费标准
  • 高端品牌网站建设公司哪家好网页设计与制作个人总结
  • 自己电脑建设网站哈尔滨专业网站建设哪个好
  • 福建设计招标网站移动端网站和app开发
  • 山东网站制作团队门户网站内容管理建设方案