Day 0: Install and Baseline
Goals
- Install the operator and agent.
- Verify the control plane and data plane are Ready.
- Configure logging and Prometheus scraping.
Prerequisites
- Kubernetes cluster with
/dev/kvmon target nodes kubectl,helm, cluster-admin context (pin via--context; see Day 1)- Nodes labeled
imp/enabled=true
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 \
pod-security.kubernetes.io/audit=privileged \
pod-security.kubernetes.io/warn=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 nodes that may run IMP
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
helm upgrade --install imp ./charts/imp -n imp-system --create-namespace
kubectl -n imp-system get podsImage 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 ./charts/imp \
-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. When enabled, the operator suspends the largest resident ImpVMs first on nodes reporting MemoryPressure. It never auto-resumes; an operator must resume each VM.
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.
