news 2026/9/14 11:15:07

KubeSphere 扩展管理实战:基于 InstallPlan 的扩展安装、升级与卸载全流程指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
KubeSphere 扩展管理实战:基于 InstallPlan 的扩展安装、升级与卸载全流程指南

KubeSphere 扩展管理实战:基于 InstallPlan 的扩展安装、升级与卸载全流程指南

【免费下载链接】kubesphereThe container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ 🖥 ☁️项目地址: https://gitcode.com/GitHub_Trending/ku/kubesphere

导读

本文围绕 KubeSphere 扩展管理(Extension Management)体系展开,系统讲解 Extension、ExtensionVersion 与 InstallPlan 三类核心自定义资源(CRD)的职责与字段,并以kubectl命令为主线,完整演示如何发现扩展、创建 InstallPlan 完成安装、跟踪部署进度、执行升级与卸载,以及定位安装失败和状态停滞两类高频故障。读完本文,你将掌握 KubeSphere 多集群场景下扩展生命周期管理的完整命令流,并能对照仓库中的 CRD 定义与控制器源码理解每一步背后的实现机制。


架构总览:扩展如何被安装到集群

KubeSphere 的扩展管理采用"仓库同步 → 资源抽象 → 控制器驱动 Helm 执行"的层级设计。整体调用链如下:

┌──────────────────────┐ ┌─────────────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ │ Extension Museum │ │ Extension │ │ InstallPlan │ │ Deployed Extension │ │ (Local Chart Repo) │───────▶│ - description │───────▶│ - extension │───────▶│ │ │ │ (sync) │ - status │ │ - config │ │ Namespace: <target> │ └──────────────────────┘ │ ExtensionVersion │ │ - clusterScheduling │ │ └── Pods, Services │ │ - version │ └──────────────────────┘ └──────────────────────┘ │ - chartURL │ │ (reconcile) │ - externalDependencies │ | │ - installationMode │ | └─────────────────────────────┘ ▼ ┌──────────────────────┐ │ Job │ │ helm-upgrade-<name> │ │ - helm install/ │ │ upgrade/uninstall │ └──────────┬───────────┘ │ ▼ ┌──────────────────────┐ │ Pod │ │ (Helm execution) │ └──────────────────────┘

流程可以拆解为四段:

  1. 同步阶段:扩展博物馆(Extension Museum,即本地 Chart 仓库)中的 Helm Chart 被同步为ExtensionVersion资源,同一扩展的多个版本聚合为一个Extension资源。
  2. 声明阶段:用户提交InstallPlan,声明要安装的扩展名称、精确版本、是否启用以及自定义配置。
  3. 协调阶段InstallPlanReconciler控制器监听 InstallPlan 变化,依据spec.extension.name找到对应 ExtensionVersion,解析出chartURL与目标命名空间,然后创建一个名为helm-upgrade-<name>的 Kubernetes Job。
  4. 执行阶段:Job 内的 Pod 以 Helm 执行器身份运行helm install / upgrade / uninstall,将 Chart 部署到目标命名空间,最终形成 Pod、Service 等业务资源。

在仓库源码中,上述协调逻辑位于 InstallPlan 控制器:控制器会为扩展创建helm-executor角色(kubesphere:<name>:helm-executor)、ServiceAccount 与 RoleBinding(见 installplan_controller.go 中的角色命名常量),并在多集群模式下为每个集群生成helm-upgrade-<name>-agent风格的 Job(agentReleaseFormat = "%s-agent"),将InstallPlan状态回写到status.clusterSchedulingStatuses

一个值得注意的实现细节:InstallPlan 在协调时会读取spec.extension.version对应的 Chart,通过helm.SetLabels给 Job 打上kubesphere.io/extension-ref=<name>标签,用于后续资源归属追踪;卸载时则通过helm executor.Uninstall删除 Helm Release,并借助kubesphere.io/installplan-protectionfinalizer(见 installplan_controller.go)保证清理顺序。


核心概念:三类自定义资源

Extension(扩展聚合)

Extension描述一个扩展的元数据与当前状态,一个 Extension 下可挂多个版本。它由Repository同步而来,本身只承载最新版本的基础信息。对应 CRD 定义见 kubesphere.io_extensions.yaml。

FieldDescriptionExample
metadata.nameExtension namewhizard-monitoring
spec.versions[]Available versions[1.2.0, 1.2.1]
status.stateCurrent stateInstalled/Upgrading/Failed
status.enabledEnabled statustrue/false
status.installedVersionInstalled version1.2.1

从 CRD schema 可以看到,status还包含versions(版本列表及创建时间戳)、recommendedVersion(推荐版本)、plannedInstallVersion(计划安装版本)以及多集群场景下的clusterSchedulingStatuses,这些字段会在安装/升级过程中被控制器持续更新。

ExtensionVersion(版本明细)

ExtensionVersion描述某一个具体版本的全部信息:Helm Chart 位置、依赖关系、运行要求与安装模式。CRD 定义见 kubesphere.io_extensionversions.yaml。

FieldDescriptionExample
metadata.nameVersion resource namewhizard-monitoring-1.2.1
spec.versionVersion number1.2.1
spec.chartURLHelm chart URLhttps://extensions-museum.../whizard-monitoring-1.2.1.tgz
spec.namespaceTarget namespacekubesphere-monitoring-system
spec.installationModeInstall modeMulticluster/HostOnly
spec.ksVersionRequired KS version>=4.2.0-0
spec.externalDependencies[]Required extensions[name: whizard-telemetry]

CRD 中还有几个值得留意的字段,它们在安装决策时起关键作用:

  • spec.installationMode:枚举HostOnlyMulticluster默认值为HostOnly。只有Multicluster模式的扩展才需要在 InstallPlan 中配置clusterScheduling
  • spec.namespace:目标安装命名空间;留空时扩展会被安装到extension-{name}命名空间(见 CRD 注释说明)。
  • spec.ksVersion/spec.kubeVersion:SemVer 约束字符串,分别声明所需 KubeSphere 与 Kubernetes 版本下限,例如>= 1.2.0
  • spec.externalDependencies[]:外部依赖扩展列表,每个依赖项含namerequiredversion(SemVer)与可选的type(默认extension)。
  • spec.chartDataRef:指向存放原始 Chart 数据的 ConfigMap;spec.digest用于校验 Chart 内容完整性。

InstallPlan(安装触发器)

InstallPlan是安装、升级、卸载的统一入口,控制器通过它创建 Helm Job 来部署组件。CRD 定义见 kubesphere.io_installplans.yaml,其additionalPrinterColumns直接把status.state暴露为终端里的State列,方便kubectl get installplan直接观察状态。

Spec(spec 必填字段为enabledextension):

FieldTypeRequiredDescription
metadata.namestringMust matchspec.extension.name
spec.extension.namestringExtension name
spec.extension.versionstringExact version to install
spec.enabledboolEnable extension
spec.upgradeStrategystringUseManualfor production
spec.configstringCustom YAML config
spec.clusterSchedulingobjectMulti-cluster config (Multicluster mode only)

补充:CRD 中upgradeStrategy的 schema 默认值即为Manual,也就是说即使不显式声明,控制器也会按手动升级策略处理,生产环境建议始终显式写为Manual

Status:

FieldDescription
status.stateInstalled/Installing/Upgrading/Failed
status.jobNameHelm upgrade Job name
status.targetNamespaceTarget namespace
status.conditions[]Status conditions with messages

CRD 还定义了status.configHash(配置哈希,用于判断 config 是否变更)、status.releaseName(Helm Release 名)、status.versionstatus.stateHistory(状态变更历史)以及多集群部署时按集群细分的status.clusterSchedulingStatuses(每个集群含statejobNamereleaseNametargetNamespaceconfigHashconditions)。

⚠️ CRITICAL(三条硬性约束):

  • metadata.name=spec.extension.name
  • 使用用户请求中的精确版本号
  • 设置enabled: trueupgradeStrategy: Manual

这三条约束在仓库配套的 Skill 评估用例中也被固化为断言:见 skills/kubesphere-extension-management/evals/evals.json,其中用例 1~4 分别验证了"默认配置安装""自定义配置安装""多集群调度安装""升级安装"场景下metadata.namespec.extension.name必须一致、必须携带精确版本、必须enabled: trueupgradeStrategy: Manual


实战一:发现与检查扩展

在创建任何 InstallPlan 之前,先通过 kubectl 摸清扩展清单、分类、可用版本与详细信息。

# 列出所有扩展 kubectl get extensions # 按分类列出扩展 for c in $(kubectl get categories.kubesphere.io -o jsonpath='{.items[*].metadata.name}'); do exts=$(kubectl get extensions.kubesphere.io -l kubesphere.io/category="$c" -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}') [ -n "$exts" ] && echo -e "$c:\n$exts" done # 列出扩展的可用版本(按扩展引用标签过滤) kubectl get extensionversions.kubesphere.io -l kubesphere.io/extension-ref=<extension-name> # 查看扩展详情 kubectl describe extension <extension-name> kubectl describe extensionversion.kubesphere.io <extension-name>-<version>

理解两个字段的用途:

  • kubesphere.io/extension-ref是连接 Extension 与 ExtensionVersion 的标签键,控制器正是通过它把版本事件关联回扩展(见 extension_controller.go 中ExtensionReferenceLabel的使用)。kubectl get extensions输出的State列来自status.state
  • 分类查询依赖categories.kubesphere.io资源,扩展通过kubesphere.io/category标签归属分类,对应的 CRD 位于 kubesphere.io_categories.yaml。

describe extension时重点看status.versions(可用版本)、status.recommendedVersion(推荐版本)、status.installedVersion(当前已装版本)与spec.installationMode(决定是否需要多集群调度)。


实战二:安装扩展

⚠️ CRITICAL:

  • InstallPlan 的metadata.name必须spec.extension.name完全一致;
  • 使用用户请求中的精确版本(不要用recommendedVersionlatest之类的通配写法)。

2.1 安装前验证版本存在

# 确认扩展与目标版本都存在 kubectl get extension <extension-name> kubectl get extensionversion <extension-name>-<version> # 获取版本详情(重点核对 installationMode、namespace、dependencies 等) kubectl describe extension <extension-name> kubectl describe extensionversion <extension-name>-<version>

核对要点:

  • spec.installationMode是否为Multicluster(决定后续是否要写clusterScheduling);
  • spec.namespace目标命名空间是否与预期一致;
  • spec.externalDependencies依赖的扩展是否已经安装;
  • spec.ksVersion/spec.kubeVersion约束是否满足当前环境。

2.2 创建 InstallPlan

根据上面的版本详情决定 YAML 内容:

  • config:仅当用户明确要求自定义配置时才填写;否则整个字段省略,使用扩展默认配置。
  • clusterScheduling:仅当installationMode=Multicluster时才填写,在placement.clusters中指定目标集群列表;overrides可对单个集群做覆盖配置(优先级高于全局配置)。
apiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: <extension-name> spec: # clusterScheduling: # 仅适用于 Multicluster 模式的扩展。 # placement: # clusters: # - <cluster-name> # overrides: # host: |- # # 扩展 Agent 配置:当前集群内扩展 Agent 的自定义设置,优先级高于全局扩展配置。 # # custom: # key: override-value # config: | ## 用户未要求自定义配置时省略 # # 扩展的自定义配置,作为全局扩展配置,可覆盖默认设置。 # # custom: # key: override-value enabled: true extension: name: <extension-name> # CRITICAL: 必须与 metadata.name 一致 version: <version> # CRITICAL: 使用用户请求的精确版本 upgradeStrategy: Manual
kubectl apply -f installplan-<extension-name>.yaml

补充说明两点实现细节:

  • spec.config字符串类型,实际内容是一段 YAML。控制器在部署时会将这段配置与全局扩展配置合并,并通过global.imageRegistryglobal.clusterInfo.nameglobal.clusterInfo.roleglobal.portal.url等全局值注入 Helm values(见 installplan_controller.go 中的全局扩展常量)。config 变更后,status.configHash会随之更新,作为配置漂移的判定依据。
  • 多集群模式下,控制器会为每个被调度集群分别创建 Job:主集群的 Helm Release 名为扩展名本身,成员集群的 Release 名则形如<name>-agent(对应agentReleaseFormat = "%s-agent"),Agent 侧配置通过overrides.<clusterName>单独下发。

实战三:跟踪与验证安装

# 实时跟踪状态 kubectl get installplan <extension-name> -w # 查看详情(含 conditions 消息) kubectl describe installplan <extension-name> # 验证扩展状态 kubectl describe extension <extension-name> # 检查已部署资源 NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}') kubectl get pods,svc -n $NAMESPACE

状态流转参考:InstallPlan 的status.state会经历InstallingInstalled(或失败时进入Failed);升级时出现Upgrading。控制器内部使用InstallSuccessful/InstallFailed/UpgradeSuccessful/UpgradeFailed/UninstallFailed/Initialized等条件常量(见 installplan_controller.go)驱动状态机推进。

status.targetNamespace由控制器从对应 ExtensionVersion 的spec.namespace解析而来,安装完成后即成为该扩展业务资源所在命名空间。


实战四:更新与升级扩展

⚠️ CRITICAL:InstallPlan 的metadata.name必须与spec.extension.name一致。

  • 更新(Update):版本不变,仅修改spec.configspec.clusterScheduling
  • 升级(Upgrade):将spec.extension.version改为目标新版本。
# 以当前 InstallPlan 为模板导出 kubectl get installplan <extension-name> -o yaml > installplan-<extension-name>.yaml # 编辑后重新应用: # - 更新:修改 spec.config 或 spec.clusterScheduling # - 升级:将 spec.extension.version 改为目标版本 kubectl apply -f installplan-<extension-name>.yaml kubectl get installplan <extension-name> -w

从实现角度理解升级:控制器比较status.plannedInstallVersion与请求版本,若版本变化则重新触发helm upgrade,Job 命名保持helm-upgrade-<name>不变,通过新的 Job 实例承载升级动作;若仅是 config 变化而版本不变,则基于configHash的变化判定是否需要重新协调,从而避免无意义的 Helm 操作。多集群扩展升级时,主集群与各成员集群的 Agent 会分别升级各自的 Helm Release。


实战五:卸载扩展

kubectl delete installplan <extension-name>

卸载触发控制器走删除路径:先移除 finalizer 前置的清理逻辑,通过helm uninstall删除对应 Helm Release,再清理扩展关联的 JSBundle、APIService、ReverseProxy、ExtensionEntry 等扩展面资源(相关代码路径见 installplan_controller.go 中对上述资源按kubesphere.io/extension-ref标签的批量清理)。若删除后资源未消失,说明清理未完成或存在依赖,可结合kubectl describe installplan与控制器日志排查。


最佳实践

  • 默认配置优先:除非确实需要覆盖默认值,否则省略spec.config,降低配置漂移与人为出错概率。
  • 生产环境一律使用upgradeStrategy: Manual,由人工掌控升级窗口。
  • 始终使用精确版本号(而非recommendedVersionlatest),保证可复现、可回滚。
  • 上线前先在预发(staging)环境完整演练一遍安装/升级/卸载。
  • 升级前先阅读扩展的 Changelog,确认破坏性变更与依赖要求。
  • 把自定义配置文档化,记录configHash与对应版本,便于后续审计与问题定位。
  • 多集群扩展在配置clusterScheduling时,明确区分全局配置(config)与单集群覆盖(overrides.<cluster>),避免优先级理解偏差。

故障排查

问题一:InstallPlan 安装失败(Job 执行失败)

症状:InstallPlan 长时间停留在Installing/Upgrading,对应 Job Pod 状态为 Error/Failed。

诊断:

# 第 1 步:查看 InstallPlan 状态 kubectl describe installplan <extension-name> # 重点检查 status.state 与 status.conditions 中的 message # 第 2 步:查看 Job Pod 日志 NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}') JOB_NAME=$(kubectl get installplan <extension-name> -o jsonpath='{.status.jobName}') kubectl logs -n $NAMESPACE -l job-name=$JOB_NAME --tail=100 # 第 3 步:多集群场景下检查各集群调度状态 kubectl get installplan <extension-name> -o jsonpath='{.status.clusterSchedulingStatuses}' | jq . # 逐个集群查看 state 与 conditions,再取 jobName 抓取对应日志

解决方向:

  • 确认扩展版本确实存在(kubectl get extensionversion <name>-<version>);
  • 确认依赖扩展已安装且满足externalDependencies的版本约束;
  • 检查spec.config的 YAML 语法与 values 结构是否正确;
  • 检查目标命名空间是否存在、helm-executor权限是否被破坏。

问题二:Job 已完成但 InstallPlan 状态不更新

症状:Job Pod 已成功完成(Completed),但 InstallPlan 仍停留在Installing/Upgrading

诊断:

# 确认 Job 是否真的完成 NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}') JOB_NAME=$(kubectl get installplan <extension-name> -o jsonpath='{.status.jobName}') kubectl get pods -n $NAMESPACE -l job-name=$JOB_NAME # 对比 Job 完成时间与当前时间 kubectl get job $JOB_NAME -n $NAMESPACE -o jsonpath='{.status.completionTime}'

根因:集群节点间时钟偏移(NTP 未同步),导致控制器基于时间戳的状态判定失真。

解决方案:检查并同步所有集群节点的 NTP 时间,确保节点时钟一致后再观察 InstallPlan 状态是否收敛。


快速参考

ActionCommand
列出所有扩展kubectl get extensions
列出扩展版本kubectl get extensionversions.kubesphere.io -l kubesphere.io/extension-ref=<name>
查看扩展详情kubectl describe extension <name>
查看版本详情kubectl describe extensionversion <name>-<version>
安装扩展kubectl apply -f installplan-<name>.yaml
跟踪安装kubectl get installplan <name> -w
升级扩展修改 InstallPlan 中的 version 后kubectl apply
卸载扩展kubectl delete installplan <name>

深入阅读

  • Skill 本体定义:skills/kubesphere-extension-management/SKILL.md
  • Skill 配套评估用例(含 5 组安装/配置/多集群/升级/排障断言):skills/kubesphere-extension-management/evals/evals.json
  • InstallPlan CRD 定义:kubesphere.io_installplans.yaml
  • Extension CRD 定义:kubesphere.io_extensions.yaml
  • ExtensionVersion CRD 定义:kubesphere.io_extensionversions.yaml
  • InstallPlan 控制器实现:pkg/controller/core/installplan_controller.go
  • Extension 控制器实现:pkg/controller/core/extension_controller.go
  • 相关技能:
    • kubesphere-core- 核心平台架构(skills/kubesphere-core/SKILL.md)
    • kubesphere-cluster-management- 集群运维(skills/kubesphere-cluster-management/SKILL.md)

【免费下载链接】kubesphereThe container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ 🖥 ☁️项目地址: https://gitcode.com/GitHub_Trending/ku/kubesphere

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 11:14:57

树莓派 5 官方外壳 散热测试 Raspberry Pi Case for Raspberry Pi 5

1. 硬件 树莓派 5 外壳 2. 软件 stress 是一个简单且有效的压力测试工具&#xff0c;用于测试计算机系统在高负载下的稳定性。它可以对 CPU、内存、I/O 等系统资源施加压力&#xff0c;以帮助你评估系统的性能和稳定性。 sudo apt update sudo apt install stress3. 对 4 个…

作者头像 李华
网站建设 2026/9/14 11:12:14

串口服务器是什么?工业物联网设备联网与远程调试入门

一听到“串口服务器”这名字&#xff0c;我第一反应也是&#xff1a;这得是多高端的机架式设备&#xff0c;双电源冗余、万兆网口起步那种&#xff1f;结果第一次在产线机柜里见到实物&#xff0c;就一个巴掌大的小铁盒子&#xff0c;两根线一进一出&#xff0c;连个显示屏都没…

作者头像 李华