Debug Spectro Cloud Palette clusters using event streams, log bundles, and edge host logs. Tracks known errors - both actionable and noise.
Debug cluster provisioning, upgrades, and operational issues using Palette's event streams and logs.
For the $PALETTE_API_KEY / $PROJECT_UID env vars used below, see the spectrocloud-common skill (auth + project UID lookup).
Events stream live and show orchestration progress. Watch these during provisioning.
# Get recent events for a cluster
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID/events?limit=50" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '[.items[] | {time: .metadata.creationTimestamp, type: .involvedObject.kind,
reason: .reason, message: .message}]'
# Overview with conditions and upgrade history
curl -s "https://api.spectrocloud.com/v1/dashboard/spectroclusters/$CLUSTER_UID/overview" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '{state: .status.state, conditions: .status.conditions, upgrades: .status.upgrades}'
# Poll events every 10 seconds during provisioning
while true; do
echo "=== $(date) ==="
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID/events?limit=10" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq -r '.items[] | "\(.metadata.creationTimestamp) [\(.reason)] \(.message)"' | head -10
sleep 10
done
Download comprehensive logs for deep debugging or support requests.
# Download log bundle (returns zip file)
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID/features/logFetcher/logs" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" \
-o spectro_logs.zip
# Extract and examine
unzip spectro_logs.zip -d cluster-logs/
ls cluster-logs/
| File/Folder | Contents |
|-------------|----------|
| Manifest.yaml | CRDs, Deployments, Pods, ConfigMaps, Events, Nodes |
| spectro-*.log | Palette agent logs (last 10k lines) |
| system.log | System logs |
| cloud-init.log | Cloud-init output |
For edge deployments, SSH to the host for live debugging.
# SSH to edge host (default creds: kairos/kairos)
ssh kairos@<edge-host-ip>
# Watch Palette agent logs (most useful)
sudo journalctl -u spectro-stylus-agent.service -f
# Check all Spectro services
sudo systemctl list-units 'spectro*'
# Key log files
cat /var/log/stylus-upgrade.log
cat /var/log/kube-init.log
cat /var/log/kube-join.log
# Check kubelet if K8s is initializing
sudo journalctl -u kubelet -f
| State | Meaning |
|-------|---------|
| Pending | Waiting for resources |
| Provisioning | Creating infrastructure/nodes |
| Running | Healthy and operational |
| Updating | Profile or config change in progress |
| Deleting | Teardown in progress |
| Failed | Unrecoverable error (check events) |
Palette's reconciliation pattern means some errors are transient and resolve automatically.
These often appear during provisioning but resolve:
| Error Pattern | Why It's OK |
|---------------|-------------|
| context deadline exceeded | Temporary timeout, will retry |
| connection refused to API server | Node not ready yet, will retry |
| unable to retrieve node | Node registering, will resolve |
| waiting for control plane | Normal during bootstrap |
| etcd cluster is not healthy | Etcd initializing, give it time |
These indicate real problems:
| Error Pattern | Likely Cause | Action |
|---------------|--------------|--------|
| failed to pull image | Registry auth or network | Check registry creds, network |
| node not found (persistent) | Edge host not registered | Check edge host in Palette UI |
| insufficient resources | Node too small | Increase CPU/RAM |
| pack validation failed | Profile misconfigured | Check pack values |
| version mismatch | K8s/image version conflict | Align provider image with K8s pack |
| duplicate edge host ID | Re-imaging without cleanup | Delete old edge host from Palette |
| certificate has expired | Stale certs | Re-register edge host |
| Error Pattern | Likely Cause | Action |
|---------------|--------------|--------|
| leader election failed | Both nodes competing | Check network between nodes |
| kine connection refused | Postgres/Kine not ready | Wait, check node logs |
| split brain | Network partition | Restore network, may need recovery |
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '{name: .metadata.name, state: .status.state, health: .status.clusterHealth}'
curl -s "https://api.spectrocloud.com/v1/dashboard/spectroclusters/$CLUSTER_UID/overview" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '.status.conditions[] | select(.status != "True") | {type, message, reason}'
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID/events?limit=20" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq -r '.items[] | "\(.metadata.creationTimestamp) [\(.reason)] \(.message)"'
ssh kairos@<edge-host-ip>
sudo journalctl -u spectro-stylus-agent.service -n 100 --no-pager
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID/features/logFetcher/logs" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" \
-o spectro_logs_$(date +%Y%m%d_%H%M).zip
# List edge hosts and their state
curl -s "https://api.spectrocloud.com/v1/edgehosts" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '[.items[] | {name: .metadata.name, uid: .metadata.uid, state: .status.state,
health: .status.health.state, cluster: .status.clusterUid}]'
# Check specific edge host
curl -s "https://api.spectrocloud.com/v1/edgehosts/$EDGEHOST_UID" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '{name: .metadata.name, state: .status.state, health: .status.health,
lastHeartbeat: .status.lastHeartbeat}'
# Check pack status on cluster
curl -s "https://api.spectrocloud.com/v1/spectroclusters/$CLUSTER_UID/packs/status" \
-H "ApiKey: $PALETTE_API_KEY" \
-H "ProjectUid: $PROJECT_UID" | \
jq '[.items[] | {name: .name, status: .status, message: .message}]'
This skill is a living document. When you encounter new errors:
| Operation | Endpoint |
|-----------|----------|
| Cluster events | GET /v1/spectroclusters/{uid}/events |
| Cluster overview | GET /v1/dashboard/spectroclusters/{uid}/overview |
| Download logs | GET /v1/spectroclusters/{uid}/features/logFetcher/logs |
| Edge hosts | GET /v1/edgehosts |
| Pack status | GET /v1/spectroclusters/{uid}/packs/status |
npx skills add nctiggy/spectrocloud-troubleshooting下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer