opensearch — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited opensearch (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
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:
- hostapiVersion: 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:
- hostapiVersion: 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):
kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}' kubectl get cluster <cluster-name> -o jsonpath='{.spec.connection.kubeconfig}' | base64 -d > /tmp/<cluster-name>-kubeconfigNote: 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:
kubectl get installplan opensearch -o jsonpath='{.spec.clusterScheduling.placement.clusters}' kubectl get cluster <cluster-name> -o jsonpath='{.spec.connection.kubeconfig}' | base64 -d > /tmp/<cluster-name>-kubeconfig # 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:
- hostUninstall from all clusters:
kubectl delete installplan opensearchUninstall 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 |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.