ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Headlamp 中 PersistentVolume 前端数据模型解析:KubePersistentVolume 接口与 PersistentVolume 类实战指南

Headlamp 中 PersistentVolume 前端数据模型解析:KubePersistentVolume 接口与 PersistentVolume 类实战指南 Headlamp 中 PersistentVolume 前端数据模型解析KubePersistentVolume 接口与 PersistentVolume 类实战指南【免费下载链接】headlampA Kubernetes web UI that is fully-featured, user-friendly and extensible项目地址: https://gitcode.com/GitHub_Trending/he/headlamp本篇文章围绕 HeadlampKubernetes 开源 Web UI前端中persistentVolume数据模型模块展开以 lib/k8s/persistentVolume API 文档 为骨架结合源码与 UI 组件讲解KubePersistentVolume类型接口如何刻画 Kubernetes PersistentVolumePV资源PersistentVolume类如何封装 API 端点与便捷访问器以及它们如何在存储列表、详情页等界面中落地。读完你将掌握在 Headlamp 前端/插件开发中读写 PV 数据、调用资源 API 及扩展存储相关视图的完整方法。模块概览一份 Kubernetes 资源的前端镜像frontend/src/lib/k8s/目录是 Headlamp 前端与 Kubernetes API 之间的数据模型层每种资源对应一个 TypeScript 模块。persistentVolume模块正是这一体系的成员其对外公开两样东西类ClassPersistentVolume —— 对应 Kubernetes 的PersistentVolume资源是操作 PV 的核心入口。接口InterfaceKubePersistentVolume —— 描述 PV 资源的 JSON 数据结构。两者在 frontend/src/lib/k8s/index.ts 中被统一导出第 99–100 行注册到资源对象集合第 370 行以export * as persistentVolume提供模块级命名空间访问并在 index.test.ts 中被断言为受支持的资源类型之一。KubePersistentVolume 接口PV 资源的数据契约接口直接继承自基础接口KubeObjectInterface定义见 frontend/src/lib/k8s/KubeObject.ts因此天然拥有所有 Kubernetes 对象共有的字段字段类型说明kindstringREST 资源类型值为PersistentVolumeCamelCase不可变更apiVersionstring可选API 版本PV 使用核心组的v1metadataKubeMetadata对象元数据name、namespace、labels 等在继承基础字段之上KubePersistentVolume定义了 PV 特有的spec与status。完整定义位于 frontend/src/lib/k8s/persistentVolume.tsexport interface KubePersistentVolume extends KubeObjectInterface { spec: { capacity: { storage: string; }; accessModes?: string[]; volumeMode?: string; persistentVolumeReclaimPolicy?: string; storageClassName?: string; claimRef?: KubeClaimRef; [other: string]: any; }; status: { message?: string; phase?: string; reason?: string; }; }spec声明 PV 的容量与特性capacity.storage必填PV 声明的总容量如10Gi。这是 Headlamp 存储列表中Capacity列直接读取的字段。accessModes可选访问模式数组如[ReadWriteOnce]、[ReadWriteMany, ReadOnlyMany]。volumeMode可选Filesystem默认或Block。persistentVolumeReclaimPolicy可选回收策略取值Retain/Recycle/Delete。storageClassName可选关联的 StorageClass 名称可用于跳转到 StorageClass 详情。claimRef可选绑定到的 PVC 引用类型为KubeClaimRef见下文。索引签名[other: string]: any为 CephFS、NFS、CSI 等各类卷源字段csi、nfs、hostPath等留出弹性空间这也是 Headlamp 能支持 20 余种卷源类型的结构基础。status观察 PV 生命周期phasePV 生命周期阶段如Available、Bound、Released、Failed。message/reason附加状态说明在界面中以 Tooltip 或详情条目展示。辅助类型 KubeClaimRef同文件还定义了描述 PV 与 PVC 绑定关系的KubeClaimRefpersistentVolume.tsexport interface KubeClaimRef { apiVersion?: string; kind?: string; name?: string; namespace?: string; uid?: string; }PersistentVolume 类静态资源声明与 API 端点类PersistentVolume extends KubeObjectKubePersistentVolumepersistentVolume.ts通过一组静态字段声明资源的 REST 属性Headlamp 据此自动生成 API 端点class PersistentVolume extends KubeObjectKubePersistentVolume { static kind PersistentVolume; static apiName persistentvolumes; static apiVersion v1; static isNamespaced false; ... }静态字段值含义kindPersistentVolume资源 KindapiNamepersistentvolumesREST 资源名复数决定 API 路径apiVersionv1核心组版本isNamespacedfalse非命名空间资源即集群级资源apiEndpoint 的生成原理apiEndpoint是 KubeObject 基类按isNamespaced选择工厂自动生成的KubeObject.ts命名空间资源走apiFactoryWithNamespace非命名空间资源如 PV走apiFactory并基于apiVersion/apiName拼接出 group、version、resource。PV 属于核心组v1因此端点对应GET /api/v1/persistentvolumes系列 REST 接口。生成的apiEndpoint对象提供list/get流式拉取资源列表 / 单个对象配合回调StreamResultsCb与StreamErrCbdelete/patch/post/put增删改操作isNamespaced布尔标记apiInfo{ group, version, resource }[]数组供鉴权请求使用。访问器与构造器constructor(json)接收KubePersistentVolume数据实例化对象。get spec()/get status()直接返回底层 JSON 中的spec/status是 UI 读取 PV 数据最常用的入口。getSourceType()返回 PV 的卷源类型如csi、nfs实现逻辑见下节。getSourceType 与 PV_SOURCE_TYPES 卷源枚举persistentVolume.ts 定义了按优先级排列的卷源键列表PV_SOURCE_TYPESexport const PV_SOURCE_TYPES [ csi, hostPath, nfs, local, iscsi, cephfs, rbd, glusterfs, awsElasticBlockStore, gcePersistentDisk, azureDisk, azureFile, fc, flexVolume, flocker, photonPersistentDisk, portworxVolume, scaleIO, storageos, vsphereVolume, ] as const;方法getSourceType()用find返回spec中第一个出现的卷源键persistentVolume.tsgetSourceType(): KubePersistentVolumeSourceKey | undefined { return PV_SOURCE_TYPES.find(key (this.spec as Recordstring, unknown)?.[key]); }说明一个 PV 的 spec 中通常只会设置一种卷源如nfs: {...}或csi: {...}。PV_SOURCE_TYPES的排序决定了同时出现多个卷源键这一异常情况下以哪个为准同时也为界面展示提供了稳定的类型次序。该枚举与 Kubernetes 官方 PV 卷源类型清单对应。getBaseObject构造默认 PV 骨架类覆写了getBaseObject()persistentVolume.ts返回带默认空值的可编辑对象metadata.namespace置空呼应集群级资源特性spec.capacity.storage为空字符串status.message/phase/reason均为空。它是新建/编辑 PV表单的初始数据来源。继承自 KubeObject 的静态 API列表、查询与鉴权PersistentVolume未覆写的静态方法均继承自KubeObject基类KubeObject.ts它们是 Headlamp 中所有资源通用的数据访问模式静态方法签名要点用途apiList(onList, onError?, opts?)ApiListSingleNamespaceOptions拉取资源列表返回可取消函数CancelFunctionuseApiList(onList, onError?, opts?)ApiListOptionsHook 版列表拉取自动订阅集群连接useList(opts?)返回[items, error, setItems, setError]声明式列表 Hook支持多集群与 namespace 过滤apiGet(onGet, name, namespace?, onError?)—拉取单个对象useApiGet(onGet, name, namespace?, onError?)—Hook 版单对象拉取useGet(name, namespace?)返回[item, error, setItem, setError]声明式单对象 HookgetAuthorization(arg, resourceAttrs?)AuthRequestResourceAttrs基于 SelfSubjectAccessReview 的权限检查getErrorMessage(err?)ApiError将错误码映射为Error: Not found/Error: No permissions等文案className—返回资源 Kind用作类型标识值得注意的实现细节KubeObject.tsapiList内部将每个列表项通过this.create(item)实例化为PersistentVolume对象并按isNamespaced决定是否前置 namespace 参数——PV 是非命名空间资源因此调用时不带 namespace直接走persistentvolumes端点。useListKubeObject.ts则支持clusters、namespace字符串或数组、requests精确的 clusternamespace 组合与refetchInterval轮询刷新启用后关闭 watch等高级选项。权限检查与错误处理getAuthorization通过 POST/apis/authorization.k8s.io/v1/selfsubjectaccessreviews发起 SelfSubjectAccessReviewKubeObject.ts资源默认取apiName即persistentvolumes前端据此决定是否渲染编辑/删除按钮。getErrorMessage则将 404/403 等状态码转换为面向用户的提示文案。在 Headlamp 界面中的落地VolumeList 与 VolumeDetails数据模型最终服务于用户界面。PersistentVolume类在存储相关页面中被直接引用存储列表页 VolumeListVolumeList.tsx 通过ResourceListView resourceClass{PersistentVolume} ...渲染Persistent Volumes列表其中noNamespaceFilter: true正是由isNamespaced false决定的——集群级资源不需要命名空间筛选。列表列直接消费模型字段Capacityvolume.spec.capacity.storageAccess Modesvolume.spec.accessModes.join(, )多选筛选Reclaim Policyvolume.spec.persistentVolumeReclaimPolicyClass Namevolume.spec.storageClassName可点击跳转storageClass路由Claimvolume.spec.claimRef.name可跳转persistentVolumeClaim详情Statusvolume.status.phase经makePVStatusLabel渲染为PhaseLabelReasonvolume.status.reason以 Tooltip 展示存储详情页 VolumeDetailsVolumeDetails.tsx 通过DetailsGrid resourceType{PersistentVolume} name{name} withEvents渲染单 PV 详情除基础信息外展示Status、Capacity、Access Modes、Volume Mode、Reclaim Policy、Storage Class可跳转、ClaimclaimRef指向 PVC 时渲染为可点击链接${namespace}/${name}、Source来自item.getSourceType()以及 Reason/Message。页面同时挂载了事件withEvents视图便于排查 PV 生命周期问题。状态标签的语义映射utils.tsx 中的StatusLabelByPhase基于通用PhaseLabel组件将 PV 阶段映射为彩色标签successPhaseBound绿色已绑定、warningPhases{[Available]}警示色可用未绑定其余阶段如Released、Failed按默认规则着色。这使得列表与详情页中一眼识别 PV 健康度成为可能。资源地图Resource Map在资源地图功能中PersistentVolumeClaim被注册为可绘制节点relations.tsx、sources.tsx因此 PV 与其 PVC 之间的绑定关系可在地图中可视化呈现。开发者实战在插件或视图中使用 PersistentVolume 模型Headlamp 插件可以像内置视图一样使用persistentVolume模块。基础用法如下import { PersistentVolume } from kinvolk/headlamp-plugin/lib/k8s; // 或按模块导入 // import PersistentVolume from kinvolk/headlamp-plugin/lib/k8s/persistentVolume; // 声明式列表返回 [items, error] const [volumes] PersistentVolume.useList(); // 声明式单对象查询返回 [item, error] const [pv] PersistentVolume.useGet(my-pv); // 命令式列表通过回调接收实例数组可返回取消函数 const cancel PersistentVolume.apiList(volumes { volumes.forEach(v console.log(v.getName(), v.spec.capacity.storage)); }); // 命令式单对象查询 PersistentVolume.apiGet(pv { console.log(phase:, pv.status?.phase); }, my-pv); // 权限检查能否删除该资源 const { status } await PersistentVolume.getAuthorization(delete); // 卷源类型识别 pv.getSourceType(); // 例如 csi关键约定PV 是集群级非命名空间资源所有查询均不需要也不接受 namespace 参数getNamespace()返回空字符串。静态useList/useGet/useApiList/apiList等均由KubeObject基类提供PersistentVolume通过继承获得与其它资源如 Pod、Deployment用法完全一致。需要删除、更新对象时实例方法delete(force?)、update(data)、patchUpdate(original, modified)直接可用patchUpdate采用 JSON PatchRFC 6902只发送差异可规避被控制器频繁更新的资源上的 409 冲突KubeObject.ts。若需访问底层 API 端点如批量 patch可使用PersistentVolume.apiEndpoint。小结Headlamp 的persistentVolume模块是一份紧凑而完整的 PV 资源前端镜像KubePersistentVolume接口精确刻画了 PV 的 spec/status 数据契约PersistentVolume类通过声明kind、apiName、apiVersion、isNamespaced自动获得完整的 REST 端点与声明式数据 Hook而getSourceType()与PV_SOURCE_TYPES则为识别 20 余种卷源类型提供了统一入口。理解该模块后无论是维护内置的 VolumeList/VolumeDetails 视图还是编写自定义存储插件你都能以一致的模式操作 PV 数据。【免费下载链接】headlampA Kubernetes web UI that is fully-featured, user-friendly and extensible项目地址: https://gitcode.com/GitHub_Trending/he/headlamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表