Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when installing or configuring the OpenSearch extension for KubeSphere, which provides distributed search and analytics engine for storing logs, events, auditing, and notification history
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 191% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 256% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-18 | ✗→✓ | ▲ Improved | 105% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 60% | 0% |
OpenSearch is a distributed search and analytics engine built into the KubeSphere WizTelemetry Observability Platform. It is used to store, search, and analyze observability data including logs, auditing events, K8s events, and notification history.
| Component | Description | Default | |-----------|-------------|---------| | opensearch-master | Master node for cluster coordination | 1 replica | | opensearch-data | Data nodes for storing indices | 3 replicas | | opensearch-dashboards | Web UI for visualizing data | disabled | | opensearch-curator | Scheduled task to clean old indices | enabled |
bash# Check if OpenSearch is installed kubectl get installplan opensearch -o jsonpath='{.spec.enabled}' # Get installed version kubectl get extension opensearch -o jsonpath='{.status.installedVersion}' # Get target clusters kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}'
Returns:
"true" - installed and enabled"false" - installed but disabledbashkubectl get clusters -o jsonpath='{.items[*].metadata.name}'
⚠️ CRITICAL: Do Not guess.
⚠️ CRITICAL: DO NOT proceed until target clusters are determined.
Ask user (if not specified):
Available clusters: host, dev
Which clusters do you want to deploy OpenSearch to?MUST do this to get the latest version:
bashkubectl get extensionversions -l kubesphere.io/extension-ref=opensearch -o jsonpath='{range .items[*]}{.spec.version}{"\n"}{end}' | sort -V | tail -1
⚠️ CRITICAL: InstallPlan metadata.name MUST be opensearch. DO NOT use any other name.
Use the latest version obtained from "Get Latest Version" step.
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: opensearch spec: extension: name: opensearch version: <VERSION> # From Get Latest Version step enabled: true upgradeStrategy: Manual clusterScheduling: placement: clusters: - host
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: opensearch spec: extension: name: opensearch version: <VERSION> # From Get Latest Version step enabled: true upgradeStrategy: Manual config: | opensearch-dashboards: enabled: true clusterScheduling: placement: clusters: - host
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: opensearch spec: extension: name: opensearch version: <VERSION> # From Get Latest Version step enabled: true upgradeStrategy: Manual config: | opensearch-curator: enabled: false clusterScheduling: placement: clusters: - host
| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | opensearch-master.replicas | int | 1 | Number of master nodes | | opensearch-master.opensearchJavaOpts | string | "-Xmx512M -Xms512M" | JVM options | | opensearch-master.resources | object | - | Resource limits/requests | | opensearch-data.replicas | int | 3 | Number of data nodes | | opensearch-data.opensearchJavaOpts | string | "-Xmx1536M -Xms1536M" | JVM options | | opensearch-data.resources | object | - | Resource limits/requests | | opensearch-data.service.type | string | NodePort | Service type | | opensearch-data.service.nodePort | int | 30920 | NodePort for external access | | opensearch-dashboards.enabled | bool | false | Enable OpenSearch Dashboards | | opensearch-curator.enabled | bool | true | Enable index cleanup job |
yamlopensearch-master: replicas: 1 opensearchJavaOpts: "-Xmx512M -Xms512M" resources: requests: cpu: "100m" memory: "512Mi" limits: cpu: "500m" memory: "1Gi" opensearch-data: replicas: 3 opensearchJavaOpts: "-Xmx2048M -Xms2048M" resources: requests: cpu: "200m" memory: "2Gi" limits: cpu: "2000m" memory: "4Gi" persistence: size: 50Gi storageClass: "local-volume"
> ⚠️ CRITICAL: You MUST access the target cluster BEFORE checking status or running any kubectl commands below. > > ❌ DO NOT run kubectl commands without using the target cluster kubeconfig > ✅ MUST run: kubectl --kubeconfig=/tmp/<cluster>-kubeconfig ...
Checklist (must complete before any operation):
bash kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}'
bash kubectl get cluster <cluster-name> -o jsonpath='{.spec.connection.kubeconfig}' | base64 -d > /tmp/<cluster-name>-kubeconfig
> Note: Replace <cluster-name> with the actual cluster name. Use spec.connection.kubeconfig for imported clusters.
> ⚠️ REQUIRED: Complete Access Target Cluster checklist FIRST
bash# Extension status kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get extension opensearch # InstallPlan status kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get installplan opensearch
> ⚠️ REQUIRED: Complete Access Target Cluster checklist FIRST
bash# All pods kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get pods -n kubesphere-logging-system -l app.kubernetes.io/instance=opensearch-agent # By component kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get pods -n kubesphere-logging-system -l app.kubernetes.io/name=opensearch-master kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get pods -n kubesphere-logging-system -l app.kubernetes.io/name=opensearch-data # Status kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get pods -n kubesphere-logging-system -l app.kubernetes.io/instance=opensearch-agent -o wide
> ⚠️ REQUIRED: Complete Access Target Cluster checklist FIRST
OpenSearch uses NodePort (default: 30920) to expose service externally.
bash# Get NodePort service kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get svc -n kubesphere-logging-system opensearch-cluster-data # Get node IP kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}' # Access OpenSearch externally # URL: https://<node-ip>:30920 curl -k -u admin:admin "https://<node-ip>:30920/_cluster/health"
> ⚠️ This section defines what information this skill provides to other skills
When OpenSearch is successfully deployed, other skills can retrieve:
| Field | Example Value | Description | |-------|---------------|-------------| | endpoint | https://127.0.0.1:30920 | Full URL for Vector sink | | nodePort | 30920 | NodePort number | | nodeIP | 127.0.0.1 | Node internal IP | | auth.user | admin | Default username | | auth.password | admin | Default password |
How other skills should get this info:
bash kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}'
bash kubectl get cluster <cluster-name> -o jsonpath='{.spec.connection.kubeconfig}' | base64 -d > /tmp/<cluster-name>-kubeconfig
bash # NodePort NODE_PORT=$(kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get svc -n kubesphere-logging-system opensearch-cluster-data -o jsonpath='{.spec.ports?(@.port==9200)].nodePort}')
# Node IP NODE_IP=$(kubectl --kubeconfig=/tmp/<cluster>-kubeconfig get nodes -o jsonpath='{.items0].status.addresses?(@.type=="InternalIP")].address}')
# Full endpoint echo "https://${NODE_IP}:${NODE_PORT}"
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: opensearch spec: extension: name: opensearch version: <VERSION> # From Get Latest Version step enabled: true upgradeStrategy: Manual config: | opensearch-data: replicas: 5 opensearchJavaOpts: "-Xmx4096M -Xms4096M" opensearch-dashboards: enabled: true clusterScheduling: placement: clusters: - host
Uninstall from all clusters:
bashkubectl delete installplan opensearch
Uninstall from specific cluster:
To remove OpenSearch from a specific cluster, update the InstallPlan by removing that cluster from clusterScheduling.placement.clusters:
yamlapiVersion: kubesphere.io/v1alpha1 kind: InstallPlan metadata: name: opensearch spec: extension: name: opensearch version: <VERSION> enabled: true upgradeStrategy: Manual config: | opensearch-data: replicas: 3 clusterScheduling: placement: clusters: - <REMAINING_CLUSTERS> # Remove the cluster you want to uninstall from
> ⚠️ REQUIRED: Complete Access Target Cluster checklist FIRST
bashkubectl --kubeconfig=/tmp/<cluster>-kubeconfig get pods -n kubesphere-logging-system -l app.kubernetes.io/instance=opensearch-agent # Pod events kubectl --kubeconfig=/tmp/<cluster>-kubeconfig describe pods -n kubesphere-logging-system -l app.kubernetes.io/instance=opensearch-agent
> ⚠️ REQUIRED: Complete Access Target Cluster checklist FIRST
bash# Cluster health curl -k -u admin:admin "https://<node-ip>:30920/_cluster/health" # List indices curl -k -u admin:admin "https://<node-ip>:30920/_cat/indices"
| Issue | Solution | |-------|----------| | Pods not starting | Check node resources and storage availability | | Out of memory | Increase JVM heap size | | Cannot connect | Check NodePort firewall rules | | Index storage full | Increase PVC size or enable Curator |
Other measured skills in the registry, with their headline benchmark lift.