Skip to content

Companion Tools

KSail manages cluster provisioning and GitOps bootstrapping. Inner-loop tools handle the build-watch-deploy cycle, hot-reload, or local↔remote traffic bridging. They are complementary—not competing—layers.

ksail workload watch monitors your workload source directory and auto-applies changes. It scopes the apply to the nearest directory containing a kustomization file (kustomization.yaml, kustomization.yml, or Kustomization), falling back to kubectl apply -f <dir> --recursive when no kustomization boundary is found. The watch path is resolved from --path if set, otherwise from spec.workload.sourceDirectory in ksail.yaml, falling back to k8s/. All companion tools work alongside it—they operate at different layers and don’t conflict.

LayerResponsibilityTool
Cluster lifecycleCreate, configure, and delete clustersKSail
GitOps bootstrapInstall Flux/ArgoCD, push manifestsKSail
Manifest watch & applyWatch files, auto-apply Kustomize layersKSail (ksail workload watch)
Build & deploy loopWatch files, rebuild images, hot-reloadTilt, Skaffold, or DevSpace
Local↔remote bridgingBridge local processes to in-cluster podsTelepresence or mirrord

Tilt watches your source files, rebuilds container images, and applies updated manifests to a running cluster. KSail creates and configures that cluster.

  1. Write a Tiltfile that targets the KSail-managed kubeconfig context.

    # Tiltfile
    allow_k8s_contexts("k3d-dev")
    docker_build("my-app", ".")
    k8s_yaml("k8s/deployment.yaml")
    k8s_resource("my-app", port_forwards="8080:80")
  2. Start Tilt:

    Terminal window
    tilt up

    When done, tear down with:

    Terminal window
    tilt down
    ksail cluster delete

DevSpace provides hot-reload for interpreted languages (Python, Node.js, Ruby) by syncing file changes directly into running containers without image rebuilds.

  1. Initialize DevSpace in your project directory.

    Terminal window
    devspace init

    This creates a devspace.yaml. Pass the KSail context via --kube-context (see the context name table above).

    devspace.yaml
    version: v2beta1
    name: my-app
    dev:
    my-app:
    imageSelector: my-app
    sync:
    - path: ./src:/app/src
    terminal: {}
    ports:
    - port: "8080:80"
  2. Start DevSpace dev mode:

    Terminal window
    devspace dev --kube-context <your-context>

    When done, tear down with:

    Terminal window
    devspace purge
    ksail cluster delete

Telepresence bridges your local machine to the cluster network, letting you run a service locally while it receives traffic from in-cluster pods. This is useful for debugging services without image rebuilds.

  1. Deploy your application

    Terminal window
    kubectl --context <your-context> create deployment my-app --image=nginx:latest
    kubectl --context <your-context> expose deployment my-app --port=80
  2. Connect Telepresence and intercept traffic:

    Terminal window
    telepresence connect --context <your-context>
    telepresence intercept my-app --port 8080:80

    Traffic destined for my-app is now routed to localhost:8080. Run your local service on that port:

    Terminal window
    # Run your service locally — it receives cluster traffic
    go run ./cmd/server --port 8080

    When done, tear down with:

    Terminal window
    telepresence leave my-app || true
    telepresence quit || true
    ksail cluster delete

Skaffold automates the build-tag-deploy pipeline. KSail provides the cluster; Skaffold handles the rest.

  1. Create skaffold.yaml pointing at the KSail cluster context (replace <your-context> with the value from the table above).

    skaffold.yaml
    apiVersion: skaffold/v4beta11
    kind: Config
    metadata:
    name: my-app
    build:
    artifacts:
    - image: my-app
    manifests:
    rawYaml:
    - k8s/deployment.yaml
    deploy:
    kubeContext: <your-context>
    kubectl: {}
  2. Run Skaffold in dev mode:

    Terminal window
    skaffold dev

    When done: Ctrl+C (also cleans up deployed resources), then ksail cluster delete.

mirrord lets you run a local process as if it were inside the cluster by mirroring or stealing traffic from a remote pod. KSail sets up the cluster; mirrord connects your local process to it.

See the KSail + mirrord guide for full setup instructions, mirror vs. steal mode comparison, IDE integration, and usage tips.