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) │ └──────────────────────┘流程可以拆解为四段:
- 同步阶段:扩展博物馆(Extension Museum,即本地 Chart 仓库)中的 Helm Chart 被同步为
ExtensionVersion资源,同一扩展的多个版本聚合为一个Extension资源。 - 声明阶段:用户提交
InstallPlan,声明要安装的扩展名称、精确版本、是否启用以及自定义配置。 - 协调阶段:
InstallPlanReconciler控制器监听 InstallPlan 变化,依据spec.extension.name找到对应 ExtensionVersion,解析出chartURL与目标命名空间,然后创建一个名为helm-upgrade-<name>的 Kubernetes Job。 - 执行阶段: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。
| Field | Description | Example |
|---|---|---|
metadata.name | Extension name | whizard-monitoring |
spec.versions[] | Available versions | [1.2.0, 1.2.1] |
status.state | Current state | Installed/Upgrading/Failed |
status.enabled | Enabled status | true/false |
status.installedVersion | Installed version | 1.2.1 |
从 CRD schema 可以看到,status还包含versions(版本列表及创建时间戳)、recommendedVersion(推荐版本)、plannedInstallVersion(计划安装版本)以及多集群场景下的clusterSchedulingStatuses,这些字段会在安装/升级过程中被控制器持续更新。
ExtensionVersion(版本明细)
ExtensionVersion描述某一个具体版本的全部信息:Helm Chart 位置、依赖关系、运行要求与安装模式。CRD 定义见 kubesphere.io_extensionversions.yaml。
| Field | Description | Example |
|---|---|---|
metadata.name | Version resource name | whizard-monitoring-1.2.1 |
spec.version | Version number | 1.2.1 |
spec.chartURL | Helm chart URL | https://extensions-museum.../whizard-monitoring-1.2.1.tgz |
spec.namespace | Target namespace | kubesphere-monitoring-system |
spec.installationMode | Install mode | Multicluster/HostOnly |
spec.ksVersion | Required KS version | >=4.2.0-0 |
spec.externalDependencies[] | Required extensions | [name: whizard-telemetry] |
CRD 中还有几个值得留意的字段,它们在安装决策时起关键作用:
spec.installationMode:枚举HostOnly与Multicluster,默认值为HostOnly。只有Multicluster模式的扩展才需要在 InstallPlan 中配置clusterScheduling。spec.namespace:目标安装命名空间;留空时扩展会被安装到extension-{name}命名空间(见 CRD 注释说明)。spec.ksVersion/spec.kubeVersion:SemVer 约束字符串,分别声明所需 KubeSphere 与 Kubernetes 版本下限,例如>= 1.2.0。spec.externalDependencies[]:外部依赖扩展列表,每个依赖项含name、required、version(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 必填字段为enabled与extension):
| Field | Type | Required | Description |
|---|---|---|---|
metadata.name | string | ✅ | Must matchspec.extension.name |
spec.extension.name | string | ✅ | Extension name |
spec.extension.version | string | ✅ | Exact version to install |
spec.enabled | bool | ✅ | Enable extension |
spec.upgradeStrategy | string | ✅ | UseManualfor production |
spec.config | string | ❌ | Custom YAML config |
spec.clusterScheduling | object | ❌ | Multi-cluster config (Multicluster mode only) |
补充:CRD 中
upgradeStrategy的 schema 默认值即为Manual,也就是说即使不显式声明,控制器也会按手动升级策略处理,生产环境建议始终显式写为Manual。
Status:
| Field | Description |
|---|---|
status.state | Installed/Installing/Upgrading/Failed |
status.jobName | Helm upgrade Job name |
status.targetNamespace | Target namespace |
status.conditions[] | Status conditions with messages |
CRD 还定义了status.configHash(配置哈希,用于判断 config 是否变更)、status.releaseName(Helm Release 名)、status.version、status.stateHistory(状态变更历史)以及多集群部署时按集群细分的status.clusterSchedulingStatuses(每个集群含state、jobName、releaseName、targetNamespace、configHash与conditions)。
⚠️ CRITICAL(三条硬性约束):
metadata.name=spec.extension.name- 使用用户请求中的精确版本号
- 设置
enabled: true且upgradeStrategy: Manual
这三条约束在仓库配套的 Skill 评估用例中也被固化为断言:见 skills/kubesphere-extension-management/evals/evals.json,其中用例 1~4 分别验证了"默认配置安装""自定义配置安装""多集群调度安装""升级安装"场景下metadata.name与spec.extension.name必须一致、必须携带精确版本、必须enabled: true且upgradeStrategy: 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完全一致; - 使用用户请求中的精确版本(不要用
recommendedVersion或latest之类的通配写法)。
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: Manualkubectl apply -f installplan-<extension-name>.yaml补充说明两点实现细节:
spec.config是字符串类型,实际内容是一段 YAML。控制器在部署时会将这段配置与全局扩展配置合并,并通过global.imageRegistry、global.clusterInfo.name、global.clusterInfo.role、global.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会经历Installing→Installed(或失败时进入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.config或spec.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,由人工掌控升级窗口。 - 始终使用精确版本号(而非
recommendedVersion或latest),保证可复现、可回滚。 - 上线前先在预发(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 状态是否收敛。
快速参考
| Action | Command |
|---|---|
| 列出所有扩展 | 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),仅供参考