Debug your deployment
The self-hosted-controller (SHC) provides a set of diagnostic commands that let you validate configuration, inspect cluster health, check that the expected secrets exist, diagnose database issues, and analyze resource usage. This article is a full reference for those commands, including expected outputs and remediation steps.
All commands are executed from the orchestration node using the exec subcommand:
exec <COMMAND>
Configuration validation
CheckLocalConfig
Validates every key in your config.yml against the SHC schema.
exec CheckLocalConfig
The check reports:
- Missing required fields.
- Values that do not match the expected format or regex.
- Keys that the configuration reference does not declare, for example a typo such as
global.hots. The check reads every key of the computed configuration, including the keys inherited from the sizing profile.
Expected output (no errors)
Validating configuration...
Configuration is valid entries_checked=42
Example failure output
Missing required config description=Platform release version to deploy key=global.version.platform.version
Format mismatch expected_format=^[a-zA-Z0-9][a-zA-Z0-9\-\.]*(:\d+)?$ key=utils.oci_registry.host
Configuration validation failed: 2 error(s) found. Missing required configuration: global.version.platform.version (Platform release version to deploy).
Each error names the configuration key and the expected format. It never displays the rejected value.
What to do after a failure: Review each error line. Add any missing required keys to config.yml. Remove or correct the keys reported as undocumented: config help <PREFIX> lists the supported keys of a section. Fix values that do not match the expected format. For example, utils.oci_registry.host must be a bare hostname with no http:// or https:// scheme.
To enable the debug logs of the SHC, add the -v flag before the command. The flag is accepted in CLI mode only: the command input of the TUI rejects it.
-v exec CheckLocalConfig
The verbose output does not include the resolved configuration. To confirm that the secrets injected through ${env.VAR_NAME} references are loaded, run config show instead. Its output contains the resolved credentials in clear, and the per-run log file keeps a copy of everything written to the terminal: redact both before you share them. See Inspect the configuration with the SHC.
Infrastructure connectivity
CheckServersAreReachable
Tests SSH connectivity to all nodes listed in utils.ansible.inventory.
exec CheckServersAreReachable
Expected output
Pinging all configured servers via Ansible...
All configured servers are reachable
What to do after a failure:
- Verify that
SERVERS_SSH_KEY, whichutils.ansible.ssh-keyreads, holds the SSH private key itself, with real newlines, and is exported in your environment. - Confirm the target node is running and reachable from the orchestration node on TCP port 22.
- Verify the username in
utils.ansible.userhas SSH access to the node. - If you use password-based sudo, confirm
SERVERS_SUDO_PASSWORDis set correctly.
CheckServerSpec
Runs the check_servers_spec Ansible playbook against every manager and worker node in utils.ansible.inventory, and reports the first requirement each node fails.
exec CheckServerSpec
The command checks the following, in this order.
| Check | Requirement |
|---|---|
| Unique hostnames | No two nodes share a hostname |
| Ceph node names, manual storage mode only | Every node name in modules.platform_configuration.config.rook.storage.nodes is the hostname of an inventory node |
| OS family | Debian-based |
| OS version | Debian 12 or later |
| Swap | No active swap device |
| CPU | 44 logical CPUs or more per node |
| RAM | 120 GiB or more per node |
| NTP enabled | timedatectl reports NTP=yes |
| Clock synchronized | timedatectl reports NTPSynchronized=yes |
| Port availability | TCP 80, 443, 2379, 2380, 4240, 4250, 6443, 10514, and 11514 can be bound before K3s is installed |
| Dedicated storage disk, automatic storage mode | One unused block device of 200 GB or more, with no partition table and no filesystem, before K3s is installed |
| Selected Ceph devices, manual storage mode only | lvm2 is installed, and each device listed for the node is a writable whole disk or logical volume of 200 GB or more, unmounted, with no filesystem, partition table, or signature, before K3s is installed |
The port and storage checks are skipped once K3s is installed on the node. After the installation, the ports are bound by the cluster and the storage devices are consumed by Ceph, so requiring them to be free would fail every re-run.
What to do after a failure:
| Failure | Remediation |
|---|---|
| Duplicate hostnames | The error lists the inventory host to hostname mapping. Rename the affected nodes with hostnamectl set-hostname <NEW_HOSTNAME>, then re-run the command. |
| Debian version too old | Reinstall the node on Debian 12 or later. See Technical requirements. |
| Active swap | Run sudo swapoff -a, remove or comment out the swap entries in /etc/fstab, and disable any systemd swap unit or zram service that enables swap. Reboot the node, then check that /sbin/swapon --show=NAME --noheadings --raw returns no entry. See Swap. |
| CPU or RAM below the minimum | Resize the node. The error reports the detected value. |
| NTP not enabled | Install and enable systemd-timesyncd or chrony, then run timedatectl set-ntp true. |
| Clock not synchronized | Verify that the node reaches your NTP servers, then run systemctl restart systemd-timesyncd or systemctl restart chrony. |
| A required port is already bound | Run ss -tlnp on the node to identify the process holding the port, then stop it or reconfigure it to another port. |
| No unused extra disk | Attach a block device of 200 GB or more to the node and leave it unformatted, with no partition table. A disk that already carries a filesystem or partitions is rejected. |
| Manual Ceph node names do not match | Set each name in modules.platform_configuration.config.rook.storage.nodes to the short hostname of the node, as returned by hostname -s. |
| Selected Ceph device rejected | The error names the device and the reason. Create and activate the logical volume, or select another device, then re-run the command. |
CheckNodePortReachability
Verifies that every node can reach every other node on the TCP ports the cluster needs. The command runs on all manager and worker nodes, whatever their role.
exec CheckNodePortReachability
Each node briefly opens a listener on the ports below while the other nodes connect to it. Every connection attempt times out after 5 seconds.
| Port | Purpose |
|---|---|
| 6443 | Kubernetes API |
| 2379 | etcd client |
| 2380 | etcd peer |
| 4240 | Cilium health |
| 4250 | Cilium mutual authentication |
| 10514 | Syslog intake |
| 11514 | Syslog intake |
The check is skipped when K3s is installed on every node. When K3s is installed on some nodes only, those nodes open no listener, and the check reports only the connections that time out towards them.
Example failure output
Some nodes cannot reach each other on the ports the cluster needs, so the installation would fail. Fix the points below, then re-run CheckNodePortReachability.
Blocked connections between nodes:
- 10.0.0.11 does not accept TCP 2379 (etcd client) from any other node: packets are silently dropped (firewall, cloud security group, network firewall or stale Cilium BPF state).
Ports already used by another service (stop it before installing):
- 10.0.0.12: TCP 10514 (syslog intake) cannot be opened (Address already in use). Find the process with: sudo ss -ltnp 'sport = :10514'
What to do after a failure:
| Failure | Remediation |
|---|---|
Connection dropped (timeout) |
Allow inbound TCP from the other cluster nodes on the listed port, in the host firewall (iptables, nftables, ufw, or firewalld) and in every security group or network firewall between the nodes. To inspect the host firewall, run sudo iptables -S or sudo nft list ruleset on the node. |
Connection rejected (refused) |
A firewall rule rejects the connection. Remove or adapt the rule on the destination node or on the network path. |
| Port already used | Run sudo ss -ltnp 'sport = :<PORT>' on the node to identify the process, then stop it. |
| Node could not be checked | Verify the SSH access to the node with CheckServersAreReachable, and confirm that python3 is installed on the node. |
Nodes reused after a previous K3s installation
After a K3s uninstall, leftover Cilium network programs can still drop traffic even when the firewall accepts it. On dedicated nodes where K3s is stopped, run CleanupCilium, then run CheckNodePortReachability again. Do not bypass the check.
CheckS3Performance
Benchmarks the S3-compatible platform storage from every worker node and compares the results with minimum thresholds. The command is not part of Install.
Run it only when Sekoia asks you to
The benchmark generates a sustained load on your S3-compatible storage and creates buckets on it. Run it only at the request of Sekoia support, for example to investigate slow indexation, once the Kubernetes cluster is installed.
Before you run the benchmark, check the following points with your storage administrator:
- The benchmark uses the endpoint and the credentials of the platform storage,
global.platform_storage, which ExaLog also uses to store the events. These credentials must allow creating a bucket, and writing, reading, listing, and deleting objects. - Each worker node writes objects of up to 8 MiB to its own
warp-preflight-<NODE_NAME>bucket. The SHC does not delete these buckets or their objects, so they keep using storage capacity until you delete them. - The benchmark pods run without CPU or memory limits, and their requests add to the platform traffic on the same storage and network. On a platform that ingests events, the benchmark can slow down ingestion and indexation while it runs.
exec CheckS3Performance
The command deploys a temporary s3-warp-benchmark Helm release in the sekoia-system namespace. One minio/warp pod per worker node runs a mixed workload of GET, PUT, STAT, and DELETE requests against its bucket. The SHC removes the release when the benchmark completes, whether it passes or fails. The command displays a table with the measured value, the threshold, and the result of each metric. Each value is the median of the measurements across the worker nodes.
| Metric | Threshold |
|---|---|
| GET and PUT throughput | 50 MiB/s or more |
| STAT and DELETE throughput | 100 operations/s or more |
| Request latency (90th percentile) | 200 ms or less |
| Time to first byte for GET and PUT (90th percentile) | 100 ms or less |
The benchmark reads the platform storage endpoint and credentials from the computed configuration. Adjust it with the following keys in config.yml. The command does not accept --set overrides.
| Field | Description | Default |
|---|---|---|
modules.check_s3_performance.skip |
true to skip the benchmark. |
false |
modules.check_s3_performance.enforce |
false to report thresholds that are not met as a warning instead of a failure. |
true |
modules.check_s3_performance.duration |
Duration of each benchmark pass. | 5m |
modules.check_s3_performance.passes |
Number of benchmark passes. | 1 |
modules.check_s3_performance.concurrent |
Concurrent requests per worker node. | 20 |
modules.check_s3_performance.distribution |
Weights of the GET, PUT, STAT, and DELETE requests in the mixed workload. | get: 40, put: 40, stat: 10, delete: 10 |
modules.check_s3_performance.obj_size_max |
Maximum object size in bytes. Object sizes are randomized up to this value. | 8388608 |
modules.check_s3_performance.bucket_prefix |
Prefix of the benchmark bucket names. | warp-preflight |
modules.check_s3_performance.image |
Benchmark image. | docker.io/minio/warp:v0.8.0 |
modules.check_s3_performance.tls |
false to connect without TLS when the endpoint has no http:// or https:// scheme. A scheme in the endpoint takes precedence. |
true |
modules.check_s3_performance.insecure |
true to skip TLS certificate verification. |
false |
modules.check_s3_performance.thresholds |
Thresholds of the metrics. | See the table above. |
Once the benchmark is complete, whatever its result, delete the warp-preflight-* buckets and their objects from your storage, then list the buckets of the storage to confirm that none remains.
What to do after a failure: Compare each failed metric with the storage requirements, and review the storage capacity and the network path between the worker nodes and the S3 endpoint with your storage provider.
CheckKubernetesCluster
Connects to the Kubernetes API and verifies that every node has a Ready=True condition and that the actual node count matches your Ansible inventory.
exec CheckKubernetesCluster
Expected output
Kubernetes cluster is healthy nodes=6 expected=6
What to do after a failure:
- Run
kubectl get nodesto identify which nodes are notReady. - Run
kubectl describe node <node-name>and look for taints, conditions, or resource pressure. - Check K3s system logs on the failing node:
journalctl -u k3s -n 100.
Local artifact checks
CheckLocalReleaseFiles
Verifies that the platform release directory, <global.version.platform.path>/<global.version.platform.version>, exists on the orchestration node and is not empty. The command does not check the content of the directory or the security content bundles.
exec CheckLocalReleaseFiles
What to do after a failure: In online mode, run DownloadReleaseFiles first: the release directory does not exist until the download completes, and Install runs the download before this check. In air-gapped mode, confirm that the release archive was fully extracted and that global.version.platform.path points to the correct directory.
Missing security content bundles
A missing or unreadable bundle in data/<TYPE>/ does not fail the checks. PushDataBundles reports it as a warning and skips it, and the platform keeps the content version shipped with the release. Look for these warnings in the push stage output.
CheckLocalTools
Verifies that the tools used to push the signed release artifacts are available in the SHC container: cosign in a 2.x version, and skopeo.
exec CheckLocalTools
What to do after a failure: The tools ship with the SHC image. A failure usually means that the container does not run the SHC image of the release. Load the image from the release archive and set DOCKER_IMAGE as described in Deploy the platform.
CheckLocalGit
Clones the repository configured in utils.git.repo_url and tests both pull and push access.
exec CheckLocalGit
What to do after a failure:
- Verify
GIT_HTTP_USERNAMEandGIT_HTTP_PASSWORDare set correctly. - Confirm the repository exists and is reachable from the orchestration node.
- Ensure the user has both read and write permissions on the repository.
CheckLocalOCIRegistry
Tests push, pull, and delete access to your OCI registry. The command pushes an empty test artifact, tagged check-<TIMESTAMP>, to the repository set in utils.oci_registry.check_repo (default: <utils.oci_registry.project>/shc-probe), pulls it, then deletes it. If push fails, pull and delete are skipped and reported as untested.
exec CheckLocalOCIRegistry
What to do after a failure:
- Verify
REGISTRY_USERNAMEandREGISTRY_PASSWORDare set correctly. - Confirm the registry URL is reachable from the orchestration node.
- Verify that the registry credentials can push to and delete from the repository set in
utils.oci_registry.check_repo. The repository does not need to hold an image.
Application health
DebugArgoCD
Renders a three-panel status dashboard for all ArgoCD repositories, the root application, and every managed application.
exec DebugArgoCD
Reading the application table:
| Sync status | Health status | Action |
|---|---|---|
| Synced | Healthy | No action required. |
| Synced | Progressing | Wait 2-3 minutes, then re-run. Normal during deployments. |
| OutOfSync | Any | Check the Git repository, then run DebugArgoCDSyncAll to force re-synchronization. See the warning below. |
| Any | Degraded or Missing | Inspect pod logs and run DebugDatabases. See remediation below. |
What to do for Degraded or Missing applications:
- Run
kubectl get pods -n <namespace>to identify failing pods. - Run
kubectl logs -n <namespace> <pod-name>to view pod logs. - Run
kubectl get events -n <namespace> --sort-by='.lastTimestamp'to view recent events.
DebugArgoCDSyncAll
Forces a three-phase full re-synchronization of all ArgoCD applications in parallel.
A forced sync overwrites manual changes
The sync applies the manifests of the ArgoCD Git repository to the cluster. Any change made directly in the cluster to a resource that ArgoCD manages is overwritten. Before you run the command, check the recent commits of the repository set in utils.git.repo_url.
exec DebugArgoCDSyncAll
The three phases are:
- Partial sync of
secretgeneratorandconfigmapresources to refresh secrets before regeneration. - Restart of the
sekoiaio-secret-operatordeployment to pick up refreshed SecretGenerators. - Full sync of every application.
Sync behavior
The sync timeout per application is 300 seconds. Up to 32 applications are synced concurrently.
Use this command when applications are stuck in OutOfSync, or after a manual change to the ArgoCD repository.
Secret diagnostics
DebugMissingSecrets
Checks that the secrets the platform expects exist. The command compares the declared SecretGenerator CRDs against actual Kubernetes Secret objects and reports:
- Secrets that are entirely missing.
- Secrets that exist but have incomplete keys.
- The Vault path expected for each missing key, and whether the platform installer configuration declares it.
The output lists Vault paths and key names, not secret values.
The command refreshes the secrets
Before the comparison, the command runs the VaultContent step of the platform installer, which creates the missing Vault secrets and updates the values that come from your configuration. It then deletes every Kubernetes secret managed by a SecretGenerator object, restarts sekoiaio-secret-operator, and waits up to 120 seconds for the secrets to be recreated. Run it when you investigate missing secrets, not as a routine check.
exec DebugMissingSecrets
The command leaves the shpi-debug-dumpconfig installer release in the sekoia-system namespace. Like every installer release, it holds the rendered platform configuration, secret values included. Once the investigation is complete, remove it:
helm uninstall shpi-debug-dumpconfig -n sekoia-system
What to do after a failure:
- Check the
sekoiaio-secret-operatorstatus:kubectl get pods -n support | grep secret-operator. - Run
DebugArgoCDSyncAllto restart the operator and trigger secret regeneration. - If specific Vault paths are missing, contact Sekoia support. Share the Vault paths only if Sekoia support asks for them, and only through a secure channel. Never share a secret value.
Security content
SyncRulesCatalog and SyncIntakeFormats
Synchronize the rules-catalog-updater-on-self-hosted and intake-formats-updater-on-self-hosted ArgoCD applications, then wait for the job that loads the content into the platform to succeed. Each command first runs SyncArgoRootApp, which synchronizes the ArgoCD root application and waits up to 5 minutes for it to complete.
exec SyncRulesCatalog
exec SyncIntakeFormats
Each command waits up to 900 seconds for its job. To allow more time, set modules.sync_rules_catalog.sync_timeout or modules.sync_intake_formats.sync_timeout:
exec SyncRulesCatalog --set modules.sync_rules_catalog.sync_timeout=1800
What to do after a failure:
- If the error reports an operation already running on the application, wait for it to complete, then run the command again.
- If the job did not succeed, locate it with
kubectl get jobs -A | grep -E 'rules-catalog-updater|intake-formats-updater', then read its logs withkubectl logs -n <NAMESPACE> job/<JOB_NAME>. - Run
DebugArgoCDto check the state of the two applications.
To update the detection rules and the intake formats after the installation, see Update the security content.
Database diagnostics
DebugDatabases
Inspects all StatefulSets and CloudNativePG clusters in the support namespace.
exec DebugDatabases
Status definitions:
| Status | Meaning |
|---|---|
| Healthy | All replicas are running and ready with no recent restarts. |
| Warning | All replicas running, but restarts in the last 10 minutes or waiting containers detected. Monitor and re-run. |
| Unhealthy | One or more replicas are not ready. Investigate immediately. |
What to do for Unhealthy status:
- For a pod in
CrashLoopBackOff:kubectl logs -n support <pod-name> --previous - For a pod in
Pendingstate:kubectl describe pod -n support <pod-name>and check for resource pressure or missing PVCs. - For CNPG clusters:
kubectl describe cluster -n support <cluster-name>
Resource management
DebugResourceAllocation
Queries the Kubernetes Metrics API and compares live memory consumption against declared memory requests for every pod.
exec DebugResourceAllocation
Metrics Server required
This command requires the Kubernetes Metrics Server. If the Metrics API is unavailable, the command exits with an error. Run the HelmInstall module to deploy it.
The output shows:
- A waste report for all pods with a memory request, sorted by wasted RAM. Red rows indicate 80% or more waste.
- A list of pods without memory requests, alongside their live usage. These pods present a scheduling risk.
Helm releases
CleanupHelmReleases
Deletes the Helm revision records left in the pending-install, pending-upgrade, pending-rollback, failed, or uninstalling state by an interrupted run, in every namespace. The deployed and superseded revisions and the resources created by the charts are preserved. Each deletion is logged as a warning with the release name and its status.
exec CleanupHelmReleases
The SHC runs this command automatically before HelmInstall, PlatformInstallation, PlatformAccess, DebugMissingSecrets, and CheckS3Performance.
Run it only when no Helm operation is in progress
The command also deletes the record of a Helm operation that is still running. Do not run it, or a module that depends on it, while another SHC session is installing or upgrading the platform.
Operations
RebootNodes
Reboots all nodes listed in utils.ansible.inventory and waits for them to come back online. It is the first step of a cold restart of the whole cluster, and is followed by KubeCrashRecovery.
The nodes are not rebooted one at a time: up to five nodes reboot in parallel, without being drained and without any Ceph maintenance flag. The three managers and at least two workers are therefore down at the same time, which stops the Kubernetes API and the Ceph storage. The command waits up to 300 seconds for each node to accept SSH connections again. It does not check that K3s or the pods are running again.
Full platform outage
This command makes the whole platform unavailable. Run it only during a maintenance window, as part of the cold restart procedure. To apply OS patches or kernel updates, restart the nodes one at a time instead. See Patch the nodes one at a time.
To reboot every node, run:
exec RebootNodes
After the reboot, run KubeCrashRecovery.
The nodes reboot in parallel, without being drained, so the platform is unavailable until the nodes and their workloads restart. If pods stay in a failed state after the reboot, run KubeCrashRecovery.
KubeCrashRecovery
Deletes every pod of the cluster in ordered namespace phases and waits for each phase to become ready before moving to the next. Run it after RebootNodes, or after an unexpected crash of several nodes that left pods stuck in a failed state.
The phases run in this order: kube* namespaces → rook-ceph → vault → *system* → support → all remaining namespaces. No namespace is excluded.
In the support phase, the command removes the finalizers of the arangodb* pods before deleting them, then ignores the arango* pods in its readiness check. It can therefore report success while ArangoDB is still down.
A pod counts as ready when it is Running and all its containers are ready, or when it has completed.
The command adjusts its timing with the following keys:
| Field | Description | Default |
|---|---|---|
modules.kube_crash_recovery.pod_ready_timeout |
Seconds without progress before a phase fails. The countdown restarts each time the number of pods not ready decreases, so a phase can last longer than this value. | 300 |
modules.kube_crash_recovery.poll_interval |
Seconds between two readiness checks. | 10 |
Full platform outage
This command restarts every service of the platform. Run it only during a maintenance window, as part of the cold restart procedure.
Kubernetes API required
The command stops immediately, without retrying, if the Kubernetes API is not reachable. Before you run it, check that kubectl get nodes lists every node as Ready.
To restart every pod, run:
exec KubeCrashRecovery
After it completes, check the ArangoDB pods and the Vault seal status. See Run a cold restart of the whole cluster.
What to do after a timeout: The error names the phase that failed. List the pods that are not ready with kubectl get pods -A, and look for a READY column not complete or a status other than Running or Completed, such as CrashLoopBackOff. Check their events and logs, then delete only the stuck pods with kubectl delete pod -n <namespace> <pod-name>.
Re-running the command restarts every pod
Re-running KubeCrashRecovery restarts from the first phase and deletes every pod of the cluster again, including the healthy ones. Prefer deleting only the stuck pods.
RestartAllMicroservices
Restarts every deployment, StatefulSet, and DaemonSet marked as a Sekoia microservice, with a rolling restart, and waits up to 300 seconds in total for the rollouts to complete. The databases are not restarted. Use it after the Kubernetes secrets are refreshed, so that the services load the new values. See Rotate the certificate and credentials.
exec RestartAllMicroservices
A workload whose rollout is paused, partitioned, or set to OnDelete cannot be restarted and is reported as an error, like a rollout that does not complete in time.
PlatformScaleDown and PlatformDestroy
PlatformScaleDown deletes the platform namespaces and verifies that every node has released its storage volumes. PlatformDestroy also uninstalls K3s and, in the automatic storage mode, wipes the Ceph storage disks. Both commands are disabled by default and require safety flags. They provide no restore path. See Reset or destroy the platform.
K3SUninstall
Uninstalls K3s from the worker nodes, then from the manager nodes, then removes the Cilium networking from every node.
Destructive and irreversible
This command removes the Kubernetes cluster and every workload it runs. Run it only to reset a dedicated cluster. PlatformDestroy runs it after a verified cleanup of the platform workloads. See Reset or destroy the platform.
exec K3SUninstall
If the error reports that K3s was removed but the Cilium networking cleanup is incomplete, do not wipe the disks or reinstall. Run CleanupCilium.
CleanupCilium
Removes the Cilium networking left on dedicated nodes after a K3s uninstall: network interfaces, BPF programs, and CILIUM_ firewall rules. The command refuses to run while K3s or a Cilium agent is still running on a node. See Clean up the Cilium networking.
exec CleanupCilium
WipeStorageDisks
Detects the disks used by Ceph on every node, deactivates their Ceph volume groups, and erases them. It then removes the Rook host state, /var/lib/rook, on every node, including the nodes without a Ceph disk. The command refuses to run while K3s or Ceph processes are still running on a node, and refuses a disk that is mounted, still in use, or shared with a volume group that is not a Ceph volume group.
Destructive and irreversible
This command permanently destroys all data on detected Ceph disks. Run it only once K3s is uninstalled, as the last phase of a full cluster reset. See Reset or destroy the platform.
The command does not accept --set overrides. To run it, set modules.wipe_storage.enabled: true in your config.yml. With the flag unset, the command logs a warning and completes without wiping any disk.
exec WipeStorageDisks
In the manual storage mode, with modules.platform_configuration.config.rook.storage.mode: manual, the command wipes nothing and removes nothing: it logs a warning, and cleaning up the Ceph devices and /var/lib/rook is your responsibility.
Service diagnostics
Diagnostic
Evaluates rule-based health checks against the platform's Prometheus metrics and reports the state of each platform area.
exec Diagnostic
Use this command once the infrastructure and application layers are healthy but a platform feature misbehaves, for example alerts that stop being created or assets that stop being discovered. For the available targets, the output formats, and how to read a result, see Run platform diagnostics.
Increase the Ansible output
The SHC runs the node operations, such as CheckServerSpec, K3SInstall, or WipeStorageDisks, through Ansible. By default, it streams only the task headers, the failures, and the final summary. To investigate a node operation, set the following keys in your config.yml, then run the command again:
| Field | Description | Default |
|---|---|---|
utils.ansible.verbosity |
Ansible output streamed to the log: normal for the headers, failures, and summary, full for every line, or silent for no output. |
normal |
utils.ansible.debug_level |
Ansible verbosity level, from 0 to 4, equivalent to the -v to -vvvv options. |
0 |
Reset both values once the investigation is complete. The detailed output can include host details and task values: redact it before you share it.
Collecting logs for a support ticket
Redact the output before you share it
Command output, logs, and configuration files can contain secrets and customer information. Before you collect or send anything, check it against the following list, and replace each match with ***:
- Credentials: passwords, tokens, API keys, and private keys, such as the credentials displayed by
PlatformAccess, the output ofconfig show, and the values of the environment variables of the execution script. - Vault secret values. Share Vault paths or values only when Sekoia support asks for them, and only through a secure channel.
- Private hostnames, IP addresses, and internal URLs.
- Customer data, such as community names, user names, email addresses, and event contents.
When you escalate an issue to Sekoia L3 support, include the following in your request:
-
Copy the full terminal output of the failing command. The SHC also writes its log lines to a run log file,
/tmp/<TIMESTAMP>_self-hosted-controller.login the container. See Use the SHC interface to keep this file. -
Attach the per-run log file of the SHC. With
global.logging.fileset to/opt/sekoia/logs/self-hosted-controller.log, the file of each run is in$SEKOIA_LOCAL_DIR/logs/on the orchestration node, named after the start time of the run. In the TUI, the path is displayed at the bottom of the interface. With the default value, the file is deleted with the container: set the field, then run the failing command again. See SHC log file. -
Share your
config.ymlwith all secrets redacted (replace all passwords and keys with***). -
Collect K3s system logs from the affected nodes:
journalctl -u k3s -n 500 --no-pager > k3s.log -
If applications are degraded, collect ArgoCD and pod logs:
exec DebugArgoCD kubectl get pods -A --field-selector=status.phase!=Running,status.phase!=Succeeded kubectl logs -n <namespace> <pod-name> --previous
Related links
- Monitor your platform: Continuous monitoring with Grafana and on-demand diagnostic workflows.
- Deploy the platform: Post-deployment validation commands.
- Configure the deployment: How to fix configuration errors flagged by
CheckLocalConfig. - Run platform diagnostics: Targeted Prometheus health checks per platform area.
- Use the SHC interface: Run commands and diagnostics from the interactive interface.