diff --git a/cesnet-central/playbooks/files/usr/local/bin/k8s-pods-cleaner.sh b/cesnet-central/playbooks/files/usr/local/bin/k8s-pods-cleaner.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5a0e482ef08f813c095924eafee8f9690742edc1
--- /dev/null
+++ b/cesnet-central/playbooks/files/usr/local/bin/k8s-pods-cleaner.sh
@@ -0,0 +1,26 @@
+#! /bin/sh
+
+#
+# Clean kubernetes pods stuck in "Terminating" state
+#
+# Example:
+#
+# k8s-pods-cleaner.sh hub app=jupyterhub,component=singleuser-server --yes
+#
+
+if [ -z "$1" ]; then
+	echo "Usage: $0 NAMESPACE [QUERY [--yes]]"
+	exit 0
+fi
+
+NS="$1"
+QUERY="$2"
+PERFORM="$3"
+for pod in $(kubectl get pod -n "$NS" -l "$QUERY" --field-selector="status.phase==Failed" -ojsonpath='{.items[*].metadata.name}'); do
+	if [ -n "$PERFORM" ]; then
+		kubectl get pod -n "$NS" "$pod" -oyaml > "/tmp/$NS-$pod.yaml"
+		kubectl delete pod -n "$NS" "$pod" --force
+	else
+		kubectl get pod -n "$NS" "$pod"
+	fi
+done
diff --git a/cesnet-central/playbooks/k8s.yaml b/cesnet-central/playbooks/k8s.yaml
index 26daba2a6ce0c491beecb566efb487450f4c2bca..28d0277980bcd89a724243f9601d0f9e23298b7e 100644
--- a/cesnet-central/playbooks/k8s.yaml
+++ b/cesnet-central/playbooks/k8s.yaml
@@ -167,6 +167,11 @@
         dest: /etc/profile.d/k8s-cheats.sh
         src: files//etc/profile.d/k8s-cheats.sh
         mode: preserve
+    - name: K8s pods cleaner
+      copy:
+        dest: /usr/local/bin/k8s-pods-cleaner.sh
+        src: files/usr/local/bin/k8s-pods-cleaner.sh
+        mode: preserve
 
 - name: K8s network deployment
   hosts: master