Best for
- Installing OpenSearch cluster for KubeSphere observability extensions
- Configuring OpenSearch storage for logging, events, auditing, and notifications
- Managing OpenSearch Dashboard and Curator components
kubesphere/kubesphere/skills/opensearch/SKILL.md
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
Decision brief
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
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/kubesphere/kubesphere --skill "skills/opensearch"Inspect the Agent Skill "opensearch" from https://github.com/kubesphere/kubesphere/blob/04a29b5c601470fa6bc2f2e92358dcb802a0d414/skills/opensearch/SKILL.md at commit 04a29b5c601470fa6bc2f2e92358dcb802a0d414. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
Installing OpenSearch cluster for KubeSphere observability extensions
Review the “Components” section in the pinned source before continuing.
Review the “Prerequisites” section in the pinned source before continuing.
Review the “Check Installation Status” section in the pinned source before continuing.
kubectl get installplan opensearch -o jsonpath='{.spec.enabled}'
Permission review
The documentation includes network, browsing, or remote request actions.
# URL: https://<node-ip>:30920The documentation includes network, browsing, or remote request actions.
curl -k -u admin:admin "https://<node-ip>:30920/_cluster/health"The documentation asks the agent to run terminal commands or scripts.
# Node IPEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 83/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 17,017 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
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 |
# 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 disabledkubectl 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:
kubectl 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.
apiVersion: 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
apiVersion: 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
apiVersion: 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 |
opensearch-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):
1. Find target clusters:
kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}'
2. Get cluster kubeconfig:
kubectl get cluster <cluster-name> -o jsonpath='{.spec.connection.kubeconfig}' | base64 -d > /tmp/<cluster-name>-kubeconfig
3. Use this kubeconfig for ALL subsequent commands
Note: Replace
<cluster-name>with the actual cluster name. Usespec.connection.kubeconfigfor imported clusters.
⚠️ REQUIRED: Complete Access Target Cluster checklist FIRST
# 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
# 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.
# 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:
Find which cluster OpenSearch was deployed to:
kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}'
Get cluster kubeconfig:
kubectl get cluster <cluster-name> -o jsonpath='{.spec.connection.kubeconfig}' | base64 -d > /tmp/<cluster-name>-kubeconfig
Get OpenSearch endpoint:
# 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='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
# Full endpoint
echo "https://${NODE_IP}:${NODE_PORT}"
apiVersion: 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:
kubectl 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:
apiVersion: 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
kubectl --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
# 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 |
Alternatives
K-Dense-AI/scientific-agent-skills
Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.
davepoon/buildwithclaude
Automate YouTube tasks via Rube MCP (Composio): upload videos, manage playlists, search content, get analytics, and handle comments. Always search tools first for current schemas.
K-Dense-AI/scientific-agent-skills
Analyze Neuropixels extracellular recordings end-to-end with SpikeInterface. Covers loading SpikeGLX/Open Ephys/NWB data, preprocessing, drift/motion correction, Kilosort4 (and CPU) spike sorting, quality metrics, and unit curation (threshold-based, model-based UnitRefine, and AI-assisted visual review). Use when working with Neuropixels 1.0/2.0 recordings, spike sorting, or extracellular electrophysiology analysis.
K-Dense-AI/scientific-agent-skills
Standard single-cell RNA-seq analysis pipeline. Use for QC, normalization, dimensionality reduction (PCA/UMAP/t-SNE), clustering, differential expression, visualization, and converting R-friendly single-cell formats such as Seurat or SingleCellExperiment RDS files into h5ad for Scanpy. Best for exploratory scRNA-seq analysis with established workflows. For deep learning models use scvi-tools; for data format questions use anndata.