2.8 KiB
2.8 KiB
Phase 1 Node Placement Runbook
This runbook matches the manifest changes in this repository.
Goal
Separate Kubernetes workloads into two planes:
- app plane for public-facing services
- worker plane for async NATS consumers
Required node labels
Apply these labels to your nodes.
App nodes
kubectl label node <app-node-1> node-role.workolik/app=true
kubectl label node <app-node-2> node-role.workolik/app=true
Worker nodes
kubectl label node <worker-node-1> node-role.workolik/worker=true
kubectl label node <worker-node-2> node-role.workolik/worker=true
Recommended taints
These taints keep worker jobs away from app nodes and allow only matching workloads onto the correct plane.
Worker nodes
kubectl taint node <worker-node-1> dedicated=workers:NoSchedule
kubectl taint node <worker-node-2> dedicated=workers:NoSchedule
App nodes
kubectl taint node <app-node-1> dedicated=apps:NoSchedule
kubectl taint node <app-node-2> dedicated=apps:NoSchedule
What the updated manifests now expect
Worker plane
These workloads now require worker-node placement:
They now use:
- required node affinity for
node-role.workolik/worker=true - toleration for
dedicated=workers:NoSchedule - pod anti-affinity
- topology spread constraints
App plane
These workloads now require app-node placement:
manifests/alaska/alaska.yamlmanifests/nearle/nearle-ariane.yamlmanifests/nearle/nearle-atlantis.yamlmanifests/nearle/nearle-fiesta.yamlmanifests/nearle/nearle-jupiter.yamlmanifests/nearle/nearle-titan.yaml
They now use:
- required node affinity for
node-role.workolik/app=true - toleration for
dedicated=apps:NoSchedule - pod anti-affinity
- topology spread constraints
Safe rollout order
- Label nodes.
- Taint nodes.
- Confirm labels and taints:
kubectl get nodes --show-labels
kubectl describe node <worker-node-1>
kubectl describe node <app-node-1>
- Apply manifests.
- Watch rescheduling:
kubectl get pods -A -o wide
Important warning
Do not apply these manifests until your cluster has at least:
- one labeled app node
- one labeled worker node
If the labels do not exist yet, pods with required node affinity will stay Pending.