Day 0: Install and Baseline
Goals
- Deploy IMP components safely.
- Validate control-plane and data-plane readiness.
- Establish baseline observability and guardrails.
Prerequisites
- Kubernetes cluster with
/dev/kvmon target nodes kubectl,helm, cluster-admin context (pin via--context— see Day 1)- Nodes labeled
imp/enabled=true(source of truth: machine config patch for Talos/Omni)
Privileged Namespace
Imp's agent is privileged (mounts /dev/kvm, Firecracker binaries, guest kernel paths). Isolate it:
kubectl create namespace imp-system --dry-run=client -o yaml | kubectl apply -f -
kubectl label namespace imp-system pod-security.kubernetes.io/enforce=privileged --overwriteKeep imp-system as the only namespace with privileged. All other namespaces stay restricted unless independently justified. Do not relax Pod Security Admission cluster-wide.
Node Selector imp/enabled=true
The chart defaults both agent.nodeSelector and kvm.preflight.nodeSelector to imp/enabled=true. This label is the explicit opt-in for the scheduler and the privileged agent.
# Label the pool (manage via Talos/Omni machine config patch in production)
kubectl label node <node-name> imp/enabled=true --overwrite
kubectl get nodes -l imp/enabled=true
# Verify chart values still require it
helm get values imp -n imp-system | grep -A2 nodeSelectorWhen adding placement constraints, keep imp/enabled=true as a required selector — do not replace it.
Install (OCI)
helm upgrade --install imp oci://ghcr.io/syscode-labs/charts/imp --version 0.9.0 -n imp-system --create-namespace
kubectl -n imp-system get podsPull alternative:
helm pull oci://ghcr.io/syscode-labs/charts/imp --version 0.9.0
helm upgrade --install imp ./imp-0.9.0.tgz -n imp-system --create-namespaceImage Digest Pin
Pin images by digest in production values and verify before promotion:
# values-production.yaml
operator:
image:
digest: sha256:<operator-digest>
agent:
image:
digest: sha256:<agent-digest>helm upgrade --install imp oci://ghcr.io/syscode-labs/charts/imp --version 0.9.0 \
-n imp-system -f values-production.yamlAlso pin Firecracker, Jailer, guest-kernel, and rootfs artifact provenance.
Runtime OnDelete
imp-runtime DaemonSet uses updateStrategy: OnDelete — it never rolls or drains automatically.
To roll the runtime:
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data
kubectl -n imp-system delete pod -l app.kubernetes.io/name=imp-runtime --field-selector spec.nodeName=<node>
kubectl uncordon <node>Or delete the pod directly if cordon/drain is handled externally. The DaemonSet controller recreates the pod with the new spec. Do not expect a rolling update.
pressureLifecycle Opt-In
pressureLifecycle.enabled is false by default (opt-in). When enabled, the operator suspends resident ImpVMs — largest memory first — on nodes reporting MemoryPressure until it clears. It never auto-resumes; operator action is required.
pressureLifecycle:
enabled: trueEnable only if your runbook covers manual resume and you monitor kubelet pressure conditions.
Checklist
- Install CRDs and controller manifests.
- Deploy agent DaemonSet to target nodes (verify
imp/enabled=truecoverage). - Apply privileged
imp-systemnamespace policy. - Confirm controller and agent pods are healthy.
- Apply a minimal
ImpVMsample and verify lifecycle. - Document digest pins and
OnDeleterollout procedure.
Validation Steps
kubectl get crd | grep impkubectl get nodes -l imp/enabled=truekubectl -n imp-system get podskubectl -n imp-system get ds imp-runtime -o yaml | grep -A2 updateStrategykubectl get events -A --sort-by=.lastTimestamp | tail -n 50kubectl get impvm -A -o wide
Baseline Controls
- Pin image versions (digest) for repeatable rollouts.
- Define resource quotas and namespace boundaries.
- Configure log retention and metric scraping.
- Document rollback path before production rollout.
