Worker Node Components Quiz
Quiz
resources:
requests:
memory: 128Mi
limits:
memory: 512Milimits.memory: 512Mi in the pod spec into a kernel enforcement boundary. Without cgroups, a container could freely consume all CPU and memory on the node, starving other pods. Think of resource requests as a scheduling reservation and limits as a hard ceiling enforced by the kernel at runtime.limits.memory: 512Mi in the pod spec into a kernel enforcement boundary. Without cgroups, a container could freely consume all CPU and memory on the node, starving other pods. Think of resource requests as a scheduling reservation and limits as a hard ceiling enforced by the kernel at runtime.Container Runtime Interface (CRI)
Standard gRPC API that lets kubelet work with any container runtime without code changes.
- Purpose: decouple kubelet from specific runtime implementations
- Protocol: gRPC — runtime runs as a separate process that kubelet calls
- What it abstracts: image pulls, container lifecycle, execution, log streaming
- Common runtimes: containerd (default in most distros), CRI-O (K8s-native)
- Key benefit: swap runtimes (e.g., containerd → CRI-O) without modifying kubelet
Did you get it right?
_____:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10livenessProbe checks if a container is alive. If it fails, kubelet restarts the container. This is different from readinessProbe (can accept traffic?) and startupProbe (has finished starting?).livenessProbe checks if a container is alive. If it fails, kubelet restarts the container. This is different from readinessProbe (can accept traffic?) and startupProbe (has finished starting?).Virtual IP (VIP) — Service ClusterIP
A Service ClusterIP is a fictional IP that exists only in iptables/IPVS rules — not on any actual network interface.
- Not assigned to: any pod, node interface, kube-proxy process, or Service object itself
- Lives in: iptables/IPVS rules created by kube-proxy on each node
- How traffic works: packet to VIP → kernel netfilter matches rule → DNAT rewrites destination to real pod IP
- Why it’s virtual: Linux netfilter intercepts and rewrites the packet before it ever leaves the node network stack
- Mental model: a ‘catch rule’ that hijacks packets destined for the ClusterIP and redirects them to a real pod
Did you get it right?
# Default Kubernetes node monitoring settings
node-monitor-period: 5s
node-monitor-grace-period: 40s
pod-eviction-timeout: 5mQoS Classes (Quality of Service)
Guaranteed: requests = limits for all containers. Highest priority, evicted last.
Burstable: requests < limits (or only requests set). Medium priority.
BestEffort: No requests or limits set. Lowest priority, evicted first.
kubelet uses these classes during resource pressure to decide which pods to evict, protecting workloads with stronger resource guarantees.
Did you get it right?
_____:
httpGet:
path: /ready
port: 8080
periodSeconds: 5readinessProbe determines if a container can accept traffic. When it fails, the pod is removed from Service endpoints. This is different from livenessProbe (restart if fails) and startupProbe (initial startup check).readinessProbe determines if a container can accept traffic. When it fails, the pod is removed from Service endpoints. This is different from livenessProbe (restart if fails) and startupProbe (initial startup check).Resource Limit Enforcement
Setup: kubelet reads resource requests/limits from pod spec.
Enforcement via cgroups: kubelet configures Linux cgroups to limit container resources.
CPU: When limit reached → container is throttled (slowed down) but continues running.
Memory: When limit exceeded → container is killed with OOMKilled status.
Requests vs Limits: Requests (guarantee) used for scheduling, limits (just promise) enforced by kubelet.
Did you get it right?
node.kubernetes.io/not-ready:NoExecute taint (or unreachable:NoExecute) to the failed node. Pods without a matching toleration are automatically removed via the taint eviction mechanism. This design is elegant: the Node Controller only needs to set a taint — it doesn’t need to know which pods are running or enumerate them individually. Each pod’s own tolerations determine whether it gets evicted. Option A is wrong because kubelet on a failed node is unreachable — that’s why the taint mechanism exists. Option B is wrong because the control plane doesn’t speak CRI directly; that’s kubelet’s job. Option D is wrong because pods enter Terminating state (not Failed), and it’s the pod’s controller (ReplicaSet, Deployment) — not the scheduler — that creates replacements.node.kubernetes.io/not-ready:NoExecute taint (or unreachable:NoExecute) to the failed node. Pods without a matching toleration are automatically removed via the taint eviction mechanism. This design is elegant: the Node Controller only needs to set a taint — it doesn’t need to know which pods are running or enumerate them individually. Each pod’s own tolerations determine whether it gets evicted. Option A is wrong because kubelet on a failed node is unreachable — that’s why the taint mechanism exists. Option B is wrong because the control plane doesn’t speak CRI directly; that’s kubelet’s job. Option D is wrong because pods enter Terminating state (not Failed), and it’s the pod’s controller (ReplicaSet, Deployment) — not the scheduler — that creates replacements.