┌──────────────────────┐ ┌─────────────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐
│ 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) │
└──────────────────────┘
Metadata and status for available/installed extensions.
| 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 |
Version-specific details: Helm chart location, dependencies, requirements.
| 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] |
Trigger for install/upgrade/uninstall. Creates Helm Job to deploy components.
Spec:
| Field | Type | Required | Description |
|---|---|---|---|
metadata.name |
string | ✅ | Must match spec.extension.name |
spec.extension.name |
string | ✅ | Extension name |
spec.extension.version |
string | ✅ | Exact version to install |
spec.enabled |
bool | ✅ | Enable extension |
spec.upgradeStrategy |
string | ✅ | Use Manual for production |
spec.config |
string | ❌ | Custom YAML config |
spec.clusterScheduling |
object | ❌ | Multi-cluster config (Multicluster mode only) |
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 |
⚠️ CRITICAL:
metadata.name = spec.extension.name
enabled: true and upgradeStrategy: Manual
# List all extensions
kubectl get extensions
# List by category
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
# List extension available versions
kubectl get extensionversions.kubesphere.io -l kubesphere.io/extension-ref=<extension-name>
# View extension details
kubectl describe extension <extension-name>
kubectl describe extensionversion.kubesphere.io <extension-name>-<version>
⚠️ CRITICAL:
metadata.name MUST match spec.extension.name
recommendedVersion or latest)# Verify the extension and version exist before creating InstallPlan
kubectl get extension <extension-name>
kubectl get extensionversion <extension-name>-<version>
# Get version details (check installationMode, namespace, dependencies, etc.)
kubectl describe extension <extension-name>
kubectl describe extensionversion <extension-name>-<version>
Based on the extension details above:
installationMode=Multicluster, specify clusters in placement.clusters
apiVersion: kubesphere.io/v1alpha1
kind: InstallPlan
metadata:
name: <extension-name>
spec:
# clusterScheduling: # Only for Multicluster extensions.
# placement:
# clusters:
# - <cluster-name>
# overrides:
# host: |-
# # Extension agent configuration: custom settings for the extension agent in the current cluster, with higher priority than the global extension configuration.
#
# custom:
# key: override-value
# config: | ## Omit if user didn't request custom config
# # Custom configuration for the extension, serving as a global extension configuration that can override default settings.
#
# custom:
# key: override-value
enabled: true
extension:
name: <extension-name> # CRITICAL: MUST match metadata.name
version: <version> # CRITICAL: Use EXACT version requested
upgradeStrategy: Manual
kubectl apply -f installplan-<extension-name>.yaml
# Watch status
kubectl get installplan <extension-name> -w
# Get details
kubectl describe installplan <extension-name>
# Verify extension status
kubectl describe extension <extension-name>
# Check deployed resources
NAMESPACE=$(kubectl get installplan <extension-name> -o jsonpath='{.status.targetNamespace}')
kubectl get pods,svc -n $NAMESPACE
⚠️ CRITICAL: InstallPlan metadata.name MUST match spec.extension.name
spec.config or spec.clusterScheduling (version unchanged)spec.extension.version to new version# Get current InstallPlan as template
kubectl get installplan <extension-name> -o yaml > installplan-<extension-name>.yaml
# Edit and apply:
# - For Update: modify spec.config or spec.clusterScheduling
# - For Upgrade: change spec.extension.version to target version
kubectl apply -f installplan-<extension-name>.yaml
kubectl get installplan <extension-name> -w
kubectl delete installplan <extension-name>
spec.config) unless custom values are neededupgradeStrategy: Manual for productionrecommendedVersion or latest)Symptoms: InstallPlan stuck in "Installing"/"Upgrading", Job pod shows Error/Failed
Diagnosis:
# Step 1: Check InstallPlan status
kubectl describe installplan <extension-name>
# Check status.state and status.conditions
# Step 2: Check Job pod logs
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
# Step 3: For Multicluster - check cluster scheduling status
kubectl get installplan <extension-name> -o jsonpath='{.status.clusterSchedulingStatuses}' | jq .
# Check each cluster's state and conditions, then get job name and logs
Solutions:
Symptoms: Job pod completed successfully, but InstallPlan stays in "Installing"/"Upgrading"
Diagnosis:
# Check if job completed
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
# Check job completion time vs current time
kubectl get job $JOB_NAME -n $NAMESPACE -o jsonpath='{.status.completionTime}'
Cause: Clock skew between nodes (NTP not synchronized)
Solution: Check and synchronize NTP across all cluster nodes
| Action | Command |
|---|---|
| List all extensions | kubectl get extensions |
| List extension versions | kubectl get extensionversions.kubesphere.io -l kubesphere.io/extension-ref=<name> |
| View extension details | kubectl describe extension <name> |
| View version details | kubectl describe extensionversion <name>-<version> |
| Install extension | kubectl apply -f installplan-<name>.yaml |
| Track installation | kubectl get installplan <name> -w |
| Upgrade extension | Modify version in InstallPlan, then kubectl apply |
| Uninstall extension | kubectl delete installplan <name> |
kubesphere-core - Core platform architecturekubesphere-cluster-management - Cluster operations