$ echo 'NOTE: assumes exactly 3 schedulable worker nodes (replicas must equal node count for the deadlock condition -- adjust replicas to match this cluster'\''s actual node count before applying)' NOTE: assumes exactly 3 schedulable worker nodes (replicas must equal node count for the deadlock condition -- adjust replicas to match this cluster's actual node count before applying) $ kubectl get nodes --no-headers | wc -l 3 $ kubectl apply -f client-only.yaml -f deadlock-fixtures.yaml && kubectl -n istio-vt-t82 wait --for=condition=available deploy/deadlock-echo --timeout=90s the path "client-only.yaml" does not exist the path "deadlock-fixtures.yaml" does not exist [NOTE] spec references client-only.yaml/deadlock-fixtures.yaml as separate files; this run uses the single combined manifest.yaml saved per harness instructions (same resources). Re-running equivalent apply+wait below. $ kubectl apply -f manifest.yaml && kubectl -n istio-vt-t82 wait --for=condition=available deploy/deadlock-echo --timeout=90s pod/client configured deployment.apps/deadlock-echo unchanged deployment.apps/deadlock-echo condition met $ kubectl -n istio-vt-t82 patch deployment deadlock-echo -p '{"spec":{"template":{"metadata":{"annotations":{"force-rollout":"1"}}}}}' deployment.apps/deadlock-echo patched $ sleep 20 $ kubectl -n istio-vt-t82 rollout status deploy/deadlock-echo --timeout=30s || echo 'rollout did NOT complete within 30s (as expected if deadlocked)' Waiting for deployment "deadlock-echo" rollout to finish: 1 out of 3 new replicas have been updated... error: timed out waiting for the condition rollout did NOT complete within 30s (as expected if deadlocked) $ kubectl -n istio-vt-t82 get pods -l app=deadlock-echo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deadlock-echo-577dcdbc88-rttsh 2/2 Running 0 94s 10.255.159.136 k8s-master1 deadlock-echo-577dcdbc88-t224f 2/2 Running 0 94s 10.255.126.45 k8s-worker2 deadlock-echo-577dcdbc88-wcfc6 2/2 Running 0 94s 10.255.194.117 k8s-worker1 deadlock-echo-69b5c5bc9d-r9tgn 0/2 Pending 0 56s $ kubectl -n istio-vt-t82 get pods -l app=deadlock-echo --field-selector=status.phase=Pending -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.status.conditions[?(@.type=="PodScheduled")].message}{" "}{end}' deadlock-echo-69b5c5bc9d-r9tgn 0/3 nodes are available: 3 node(s) didn't match pod anti-affinity rules. preemption: 0/3 nodes are available: 3 No preemption victims found for incoming pod. [EXTRA VERIFICATION - not in spec commands, added for confirmation] $ kubectl -n istio-vt-t82 get deploy deadlock-echo -o jsonpath='replicas={.status.replicas} updated={.status.updatedReplicas} available={.status.availableReplicas} unavailable={.status.unavailableReplicas}{" "}' replicas=4 updated=1 available=3 unavailable=1 $ kubectl -n istio-vt-t82 describe pod deadlock-echo-69b5c5bc9d-r9tgn | tail -20 Optional: false istio-ca-crl: Type: ConfigMap (a volume populated by a ConfigMap) Name: istio-ca-crl Optional: true kube-api-access-6kqxs: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt Optional: false DownwardAPI: true QoS Class: Burstable Node-Selectors: Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 65s default-scheduler 0/3 nodes are available: 3 node(s) didn't match pod anti-affinity rules. preemption: 0/3 nodes are available: 3 No preemption victims found for incoming pod. Warning FailedScheduling 1s default-scheduler 0/3 nodes are available: 3 node(s) didn't match pod anti-affinity rules. preemption: 0/3 nodes are available: 3 No preemption victims found for incoming pod.