Files
kubernetes/docs/PHASE1_NODE_PLACEMENT_RUNBOOK.md
2026-07-18 12:00:33 +05:30

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

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:

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

  1. Label nodes.
  2. Taint nodes.
  3. Confirm labels and taints:
kubectl get nodes --show-labels
kubectl describe node <worker-node-1>
kubectl describe node <app-node-1>
  1. Apply manifests.
  2. 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.