ARTICLE DETAIL

资讯详情

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

Headlamp 前端 DaemonSet 类深度解析:从 KubeObject 抽象到修订回滚的完整 API 参考

Headlamp 前端 DaemonSet 类深度解析:从 KubeObject 抽象到修订回滚的完整 API 参考 Headlamp 前端 DaemonSet 类深度解析从 KubeObject 抽象到修订回滚的完整 API 参考【免费下载链接】headlampA Kubernetes web UI that is fully-featured, user-friendly and extensible项目地址: https://gitcode.com/GitHub_Trending/he/headlamp本文以 Headlamp 前端 API 文档中的DaemonSet类参考页为核心结合 frontend/src/lib/k8s/daemonSet.ts 的当前源码与配套测试系统讲解该类的数据模型、构造与访问器、实例方法容器/节点选择器提取、ControllerRevision 历史、回滚以及从基类KubeObject继承的静态 API 方法。读完本文后你可以准确理解 Headlamp UI 中 DaemonSet 资源是如何被建模、查询并执行回滚操作的并能在插件开发或前端二次开发中正确复用这一类。类总览继承体系与静态元数据API 参考页 DaemonSet 类文档 记录该类位于模块 lib/k8s/daemonSet继承层级为any → DaemonSet并指出其构造器来自makeKubeObjectKubeDaemonSet(DaemonSet)。这里需要说明一点历史背景API 文档基于生成时的提交cluster.ts中由工厂函数动态派生类而从当前源码结构看所有 Kube 资源类已统一改为显式继承KubeObjectT泛型基类工厂函数makeKubeObject已被标记为deprecated保留于 KubeObject.ts 仅作向后兼容。当前源码中类的静态元数据定义如下daemonSet.tsclass DaemonSet extends KubeObjectKubeDaemonSet { static kind DaemonSet; // 对应 K8s 资源 Kind static apiName daemonsets; // API 路径中的复数形式 static apiVersion apps/v1; // API 组/版本 static isNamespaced true; // 命名空间级资源 private revisionHistoryCache?: { resourceVersion?: string; history: RevisionInfo[] };这几个静态字段是 Headlamp 前端所有资源类的“身份声明”KubeObject基类依赖它们完成API 端点构建KubeObject.apiEndpointgetterKubeObject.ts读取isNamespaced决定使用apiFactoryWithNamespace还是apiFactory并将apiVersion拆分为 group/version 生成apps/v1下的daemonsets客户端端点实例会被缓存到_internalApiEndpoint。类型守卫isClassOf通过比较 API 组名与 Kind 判断实例类型KubeObject.ts不依赖instanceof这在 UI 组件中识别“可回滚资源”时被直接使用。路由生成detailsRoute/listRoute默认取kind与apiName分别生成详情与列表页路径。关于 API 文档中apiEndpoint静态属性上出现的scale.get/patch/put子资源那是文档生成时点isScalable配置下的记录。从当前源码看DaemonSet类并未声明isScalable因此其端点对象不再包含 scale 子资源基类中通用的scale()方法KubeObject.ts若端点无scale会抛出This class has no scale API错误。这符合 Kubernetes 语义——DaemonSet 本身不支持 scale 子资源副本数由节点数决定。构造器与 KubeDaemonSet 数据模型构造器参考页记载构造器签名为new DaemonSet(json: KubeDaemonSet)。当前实现沿用基类构造器KubeObject.tsconstructor(json: T, cluster?: string) { this.jsonData json; this._clusterName cluster || getCluster() || ; }即接收一段完整的 DaemonSet JSON 对象作为唯一必填参数可选地绑定集群名默认取当前选中集群实例通过jsonData持有原始 JSON并以clustergetter/setter 暴露集群归属。KubeDaemonSet 接口配套的 KubeDaemonSet 接口文档 对应的源码定义在 daemonSet.tsexport interface KubeDaemonSet extends KubeObjectInterface { spec: { updateStrategy: { type: string; rollingUpdate: { maxUnavailable: number; }; }; selector: LabelSelector; template: { metadata?: KubeMetadata; spec: KubePodSpec; }; [otherProps: string]: any; }; status: { [otherProps: string]: any; }; }关键点说明spec.updateStrategy声明滚动更新策略当前类型仅支持RollingUpdaterollingUpdate.maxUnavailable控制滚动更新期间允许不可用的 DaemonSet Pod 数量。spec.selectorLabelSelector见 KubeMetadata.ts 所在模块导出的类型用于筛选本 DaemonSet 管理的 Pod也是后续查询 ControllerRevision 时构造labelSelector查询参数的来源。spec.template.specKubePodSpecpod.ts 中定义即 DaemonSet 期望在各节点上运行的 Pod 模板。spec与status均保留[otherProps: string]: any索引签名允许 API 返回的额外字段透传而不破坏类型安全。getBaseObject默认对象与创建表单的底座getBaseObject()是 Headlamp“创建资源”流程的基础——UI 用它预填一份合法的初始 YAML/JSON。DaemonSet覆写了基类版本daemonSet.ts在基类的apiVersion/kind/metadata.name之上补充metadata.namespace: 命名空间级资源必填字段spec.updateStrategy{ type: RollingUpdate, rollingUpdate: { maxUnavailable: 1 } }spec.selector.matchLabels: { app: headlamp }spec.template.spec包含一个name/image为空、imagePullPolicy: Always的容器以及nodeName: 。单测 daemonSet.test.ts 对上述默认值逐条断言包括容器模板长度为 1、imagePullPolicy为Always等。该默认对象被 CreateButton.tsx 等通用组件引用作为 DaemonSet 创建入口的初始载荷CreateDaemonSetForm.tsx 则直接导入KubeDaemonSet类型驱动表单。访问器与读取方法spec / status 访问器参考页中spec、status两个 getter 在当前源码中对应 daemonSet.tsget spec() { return this.jsonData.spec; } get status() { return this.jsonData.status; }二者直接透传jsonData中的原始对象供 UI 层以daemonSet.spec.selector、daemonSet.status.currentNumberScheduled等形式读取。例如列表页 List.tsx 就用daemonSet.status?.currentNumberScheduled || 0展示“已调度/期望/就绪”三列状态。getContainers / getNodeSelectorsgetContainers()daemonSet.ts返回spec.template.spec.containers即 Pod 模板中的所有容器定义spec或template缺失时返回空数组测试用例 daemonSet.test.ts 覆盖了缺失场景。getNodeSelectors()daemonSet.ts将spec.template.spec.nodeSelector对象展平为keyvalue字符串数组便于 UI 以标签样式展示调度约束例如{ disk: ssd, region: us-east-1 }→[diskssd, regionus-east-1]。getCurrentRevision面向回滚对话框的“当前版本”指示getCurrentRevision(): string { return (this.status?.observedGeneration ?? this.metadata.generation)?.toString() || ; }源码注释明确指出这是对象的observedGeneration回退到metadata.generation而不是ControllerRevision.revision仅作为回滚对话框中用户可见的“当前状态”指示。daemonSet.test.ts 验证了三条分支有observedGeneration、仅metadata.generation、两者皆无返回空串。ControllerRevision 历史与回滚核心差异化能力DaemonSet 类最独特的部分是围绕 ControllerRevision 实现的修订历史与回滚能力。参考页未列出这些方法文档生成早于该能力落地但它们是理解当前DaemonSet类完整面的关键故在此完整展开。getOwnedControllerRevisionsdaemonSet.ts调用ControllerRevision.apiList拉取本命名空间下的所有 ControllerRevision并做两层筛选查询参数层把spec.selector.matchLabels拼成kv,k2v2形式的labelSelector利用 DaemonSet 控制器为修订对象打controller-revision-hash相关标签的特性缩小返回集结果层仅保留metadata.ownerReferences中存在uid this.metadata.uid的对象确保只取“属于自己”的修订。请求通过request().then(c (cancel c))拿到底层CancelFunction在回调结束后调用避免监听泄漏。getRevisionHistorydaemonSet.ts返回按修订号降序排列的RevisionInfo[]每项包含类型定义见 rollback.ts字段含义revisionControllerRevision 的修订号createdAtmetadata.creationTimestampimages该修订 Pod 模板中各容器的镜像列表isCurrent是否为当前最大修订podTemplate原始模板用于 UI 做 diff 展示性能上引入了实例级缓存revisionHistoryCache以metadata.resourceVersion为键对象未被服务端更新时直接命中缓存避免重复列出全部 ControllerRevision。rollback对齐 kubectl rollout undo 的语义daemonSet.ts签名接受number | RollbackOptionsRollbackOptions含toRevision?省略时回退到“上一版”与dryRun?服务端干跑API Server 校验并处理补丁但不持久化。完整流程拉取并排序自有 ControllerRevisionrevision 0降序目标修订定位指定toRevision时精确匹配找不到返回Revision N not found in history目标是当前修订则拒绝Cannot rollback to current revision未指定时取排序第二位历史不足两条时返回No previous revision available to rollback to从targetRev.data.spec.template取出旧 Pod 模板深拷贝后删除metadata.labels[controller-revision-hash]防止控制器误判模板未变化而不滚动构造单个 JSON Patch 操作{ op: replace, path: /spec/template, value: cleanTemplate }经getApiRoot(apps, v1)拼出/namespaces/ns/daemonsets/nameURLdryRun时追加?dryRunAll通过jsonPatch提交非 dry-run 成功时清空revisionHistoryCache返回RollbackResultsuccess、message、previousRevisiondry-run 时附带dryRunResult完整资源体。源码注释声明该实现“mirrors the behavior ofkubectl rollout undo daemonset/name”与 kubectl 多态回滚辅助逻辑的思路一致。继承自 KubeObject 的静态 API 方法参考页列出的apiList、useApiList、useApiGet、useGet、useList、getAuthorization、getErrorMessage等静态方法当前均继承自 KubeObject.ts。逐一对照说明其签名与行为apiList(onList, onError?, opts?)KubeObject.ts返回一个无参函数调用后发起列表请求并解析为CancelFunction。对DaemonSet而言因isNamespaced为trueopts?.namespace || 会被插入参数首位——空字符串表示“所有命名空间”每条列表项经this.create(item)实例化为DaemonSet后再回调onListopts.queryParams支持labelSelector、fieldSelector、limit三个查询参数透传opts.cluster指定跨集群查询目标。DaemonSet内部查询 ControllerRevision 时正是复用了ControllerRevision.apiList并传入labelSelector见上文。useApiList / useApiGet / useGet / useList这一组是 React Hook 形态useApiList(onList, onError?, opts?)KubeObject.tsopts.namespace可为字符串或字符串数组未显式指定命名空间时自动应用集群的“允许命名空间”限制getAllowedNamespaces对每个命名空间各发一次apiList再合并结果最后经useConnectApi管理连接生命周期。useApiGet(onGet, name, namespace?, onError?)KubeObject.ts包装apiGet命名空间级资源会把namespace插入参数首位。useGet(name, namespace?)v2 API 风格返回四元组[item, error, refetch, resetError]形态的数据与错误。useList(opts?)KubeObject.ts面向多集群/多命名空间的通用列表 Hook支持cluster、clusters、namespace、精确组合requests、refetchInterval设置后关闭 watch 改为轮询等参数是 Headlamp 资源列表页数据层的主力。这些 Hook 使DaemonSet.useList({ namespace: default })这类调用能直接驱动 List.tsx、Details.tsx 等组件的数据渲染。getAuthorization 与 getErrorMessagegetAuthorization(verb, resourceAttrs?, cluster?)KubeObject.ts通过SelfSubjectAccessReview检查当前用户对verb如patch在资源daemonsets上是否有权未提供resource时默认取apiName组/版本不全时遍历apiEndpoint.apiInfo逐版本尝试。UI 层的 RollbackButton.tsx 正是用它决定回滚按钮是否可见捕获异常时仅打印日志不影响渲染。getErrorMessage(err?)KubeObject.ts把ApiError状态码映射为用户可读文案——404 →Error: Not found403 →Error: No permissions其余 →Error入参为空返回null。在 UI 中的消费方式从源码结构看DaemonSet类被前端多处消费形成“数据层 → 通用组件 → 专属页面”的链路通用资源按钮RollbackButton.tsx 中定义类型守卫isRollbackableResource(item)判定Deployment.isClassOf(item) || DaemonSet.isClassOf(item) || StatefulSet.isClassOf(item)后弹出修订选择对话框用户选定toRevision后调用item.rollback({ toRevision })并展示结果通知CreateButton.tsx、LogsButton.tsx、RestartButton.tsx 也均导入该类参与按钮的可用性判断。DaemonSet 专属页面List.tsx调度/期望/就绪状态列、Details.tsx详情页数据与故事驱动。Workloads 总览Workload.ts 将DaemonSet纳入Workload联合类型使其出现在工作负载概览图表中。测试覆盖与扩展建议daemonSet.test.ts 使用一份完整 mock 对象apps/v1、双容器、nodeSelector: { disk: ssd, region: us-east-1 }、observedGeneration: 3覆盖getBaseObject默认值、getContainers正常/缺spec/缺template三分支、getNodeSelectors展平与空值分支、getCurrentRevision的优先级回退链。若你希望在此基础上扩展例如为回滚流程补充测试或为插件注册 DaemonSet 专属视图建议优先复用KubeObject的静态 APIuseList/useGet/apiList而非手写请求以获得命名空间限制、多集群与取消语义修改 Pod 模板类操作时参考rollback中“先删controller-revision-hash再 JSON Patch/spec/template”的做法避免控制器跳过滚动需要识别资源类型时用isClassOf而非instanceof规避类定义重复实例化导致的判断失败。相关文档索引主题路径DaemonSet 类 API 参考docs/development/api/classes/lib_k8s_daemonSet.DaemonSet.mdKubeDaemonSet 接口参考docs/development/api/interfaces/lib_k8s_daemonSet.KubeDaemonSet.md模块索引docs/development/api/modules/lib_k8s_daemonSet.md类实现frontend/src/lib/k8s/daemonSet.ts基类 KubeObjectfrontend/src/lib/k8s/KubeObject.tsControllerRevisionfrontend/src/lib/k8s/controllerRevision.ts回滚类型定义frontend/src/lib/k8s/rollback.ts单元测试frontend/src/lib/k8s/daemonSet.test.ts【免费下载链接】headlampA Kubernetes web UI that is fully-featured, user-friendly and extensible项目地址: https://gitcode.com/GitHub_Trending/he/headlamp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表