Skip to content

docs: split k0s deployment guide by connectivity - #156

Open
kupratyu-splunk wants to merge 1 commit into
ai-tier-gafrom
codex/split-deployment-guides-ai-tier-ga
Open

docs: split k0s deployment guide by connectivity#156
kupratyu-splunk wants to merge 1 commit into
ai-tier-gafrom
codex/split-deployment-guides-ai-tier-ga

Conversation

@kupratyu-splunk

Copy link
Copy Markdown
Collaborator

Description

Related Issues

  • Related to #

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement
  • Test improvement
  • CI/CD improvement
  • Chore (dependency updates, etc.)

Changes Made

Testing Performed

  • Unit tests pass (make test)
  • Linting passes (make lint)
  • Integration tests pass (if applicable)
  • E2E tests pass (if applicable)
  • Manual testing performed

Test Environment

  • Kubernetes Version:
  • Cloud Provider:
  • Deployment Method:

Test Steps

Documentation

  • Updated inline code comments
  • Updated README.md (if adding features)
  • Updated API documentation
  • Updated deployment guides
  • Updated CHANGELOG.md
  • No documentation needed

Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published
  • I have updated the Helm chart version (if applicable)
  • I have updated CRD schemas (if applicable)

Breaking Changes

Impact:

Migration Path:

Screenshots/Recordings

Additional Notes

Reviewer Notes

Please pay special attention to:


Commit Message Convention: This PR follows Conventional Commits

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0b794ced5a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +396 to +400
scp tools/cluster_setup/k0s_cluster_with_stack.sh \
tools/cluster_setup/install_from_airgap_bundle.sh \
admin@install-machine:/opt/splunk-ai/

scp tools/cluster_setup/my-cluster-config.yaml \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Include the operator manifests in the offline transfer

Following this transfer command leaves /opt/splunk-ai without artifacts.yaml, although configure_images unconditionally copies the path from files.aiPlatform (which defaults to ./artifacts.yaml) before installation starts, so the documented offline command exits immediately. Transfer artifacts.yaml as well, and also splunk-operator-cluster.yaml when enabling the in-cluster Splunk mode described later in this guide, or include both manifests in the bundle.

Useful? React with 👍 / 👎.

Comment on lines +351 to +352
./upload_to_minio.sh
# Or use upload_to_s3.sh or upload_to_seaweedfs.sh.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Supply the target object-store settings during upload

For any target other than the scripts' localhost defaults, these commands do not upload to the object store configured for the cluster: upload_to_minio.sh defaults to http://127.0.0.1:9000, a default bucket, and minioadmin credentials, while the S3 and SeaweedFS scripts likewise require target-specific environment variables. Since the scripts do not read my-cluster-config.yaml, the guide must show how to export the configured endpoint, bucket, credentials, and region before declaring the models staged and disabling installer staging.

Useful? React with 👍 / 👎.

Comment on lines +214 to +224
| Section | What to set |
|---|---|
| `cluster` | Cluster name, SSH private key path, and SSH user |
| `cluster.airgap` | Set to `false` |
| `nodes.existingIPs` | Controller and worker IP addresses |
| `storage.objectStore` | Storage type, endpoint, bucket, and credentials |
| `images.registry` | Registry hostname |
| `images.registryInsecure` | `true` only for a plain HTTP registry |
| `images` | Image names and tags supplied with your build |
| `aiPlatform.defaultAcceleratorType` | `L40S` or `H100` |
| `metallb.pool.addresses` | Unused LAN address range for LoadBalancer services |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Enable in-cluster Splunk before the assistant steps

When a user follows this configuration table, the copied template retains splunk.enabled: false; load_config therefore selects disabled mode and the installer skips both the Splunk Operator and Standalone. The later Splunk Web, administrator-secret, and app-installation steps cannot work despite being part of the guide's completion criteria. Both connectivity guides need to instruct users who will connect Splunk AI Assistant to set splunk.enabled: true (and distinguish the external-Splunk mode where applicable).

Useful? React with 👍 / 👎.

Comment on lines +400 to +405
The default service uses NodePort. Find the assigned port:

```bash
kubectl get svc -n ai-platform \
-l app.kubernetes.io/name=splunk
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Expose Splunk Web before advertising a node URL

Even after splunk.enabled is corrected, the Standalone created by install_splunk_standalone has no serviceTemplate, so the Splunk Operator creates its normal ClusterIP service rather than a NodePort; aiPlatform.serviceTemplate only exposes SAIA. Consequently no assigned node port exists and http://<worker-node-ip>:<nodePort> is unreachable. Both guides should either configure the Standalone service as NodePort or use the port-forward flow that the installer itself prints.

Useful? React with 👍 / 👎.

Comment on lines +415 to +417
```bash
kubectl get secret splunk-standalone-secret -n ai-platform \
-o jsonpath='{.data.password}' | base64 --decode && echo

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Read the generated versioned Splunk secret

With the template's default standaloneName: splunk-standalone, the installer wires the operator-managed secret as splunk-splunk-standalone-standalone-secret-v1; it never creates splunk-standalone-secret. Thus this command returns NotFound and users cannot obtain the password needed by the next step. Update this command and its identical air-gapped counterpart to use the generated versioned name or discover the matching secret safely.

Useful? React with 👍 / 👎.

Comment on lines +460 to +464
kubectl get standalone splunk-standalone -n ai-platform -o json \
| jq '.status.appContext.appSrcDeployStatus'
```

`deployStatus: 3` means the app is installed.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Verify manually uploaded apps through Splunk

The preceding steps upload the archive through Splunk Web, but .status.appContext.appSrcDeployStatus is maintained by the Splunk Operator App Framework for packages discovered through the configured object-store appRepo; it does not report apps installed manually through the UI. In this documented flow the map can therefore be empty even after a successful installation, or contain statuses for unrelated object-store apps. Verify the app through Splunk's app list/REST API instead, and apply the same correction to the air-gapped guide.

Useful? React with 👍 / 👎.

Comment on lines +175 to +182
On the connected preparation machine, install:

- `curl`
- `crane` or another container-image copy tool
- `git`
- `helm`
- `tar`
- `sha256sum` or `shasum`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Require a Linux AMD64 bundle-preparation host

On macOS, ARM64, or any non-Linux-AMD64 preparation machine, the documented bundle build fails because prepare_airgap_bundle.sh always downloads the Linux AMD64 k0s binary and immediately executes it to run k0s airgap list-images and bundle-artifacts; it likewise bundles the Linux AMD64 yq binary. The prerequisites currently imply a generic machine and even accept macOS's shasum. State the required OS/architecture or make the bundle script select compatible host and target binaries.

Useful? React with 👍 / 👎.

Comment on lines +84 to +88
| Node type | Minimum CPU | Minimum RAM | Minimum disk | Count |
|---|---:|---:|---:|---:|
| Controller | 4 cores | 8 GB | 100 GB | 1, or 3 for high availability |
| CPU worker | 8 cores | 32 GB | 200 GB | 1 or more |
| GPU worker | 48 vCPUs | 384 GiB | 500 GB | 2 |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove the unsupported three-controller topology

When three controller IPs are configured as this table permits, install_k0s_cluster installs k0s only on CONTROLLER_IPS[0]; the other controller IPs are merely prepared and are never joined as controllers. The installer nevertheless includes all three in its expected node count, so installation waits for nodes that cannot appear and no HA control plane is created. Document one controller until the installer actually provisions the additional controllers, or implement the advertised HA join flow.

Useful? React with 👍 / 👎.

Comment on lines +95 to +98
The minimum production topology is one controller, one CPU worker, and two GPU
workers. The controller and CPU worker can share one machine for lab testing,
but this configuration is not supported for production. One GPU worker is not
enough because AI inference is distributed across both workers.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Remove the unsupported controller and CPU-worker colocation

With the two required GPU workers present, omitting a separate CPU-worker IP does not make the controller a CPU worker: label_nodes adds the CPU workload label to the controller only when WORKER_IPS is completely empty, so all CPU-selected platform workloads remain unschedulable. Listing the controller IP again as a worker is worse because the worker install loop removes /var/lib/k0s and the controller service on that host. Do not advertise this lab topology unless the installer can explicitly co-label the controller while other workers exist.

Useful? React with 👍 / 👎.

Comment on lines +327 to +330
### 3. Stage the model weights

Run on a connected machine that can reach both Hugging Face and the target
object store.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Provide an offline transfer path for model weights

In a fully separated air gap where the connected and disconnected environments have no network path—the scenario this guide acknowledges in the transfer section—the connected preparation machine cannot also reach the internal target object store as required here. The bundle explicitly excludes model weights, and the later transfer commands never copy model_artifacts, so such users have no way to satisfy modelStaging.enabled: false before installation. Document how to package and physically transfer the downloaded artifacts and then upload them from a machine inside the disconnected environment.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant