diff --git a/roles/upgrade/post-upgrade/tasks/main.yml b/roles/upgrade/post-upgrade/tasks/main.yml
index cef98bb0bb5df29a229e09a312b76738836d4373..3d16489ff34fd7a9d6dce8cdc4c30db760d1f15a 100644
--- a/roles/upgrade/post-upgrade/tasks/main.yml
+++ b/roles/upgrade/post-upgrade/tasks/main.yml
@@ -2,4 +2,5 @@
 - name: Uncordon node
   command: "{{ bin_dir }}/kubectl uncordon {{ inventory_hostname }}"
   delegate_to: "{{ groups['kube-master'][0] }}"
-  when: needs_cordoning|default(false)
+  when:
+    - needs_cordoning|default(false)
diff --git a/roles/upgrade/pre-upgrade/tasks/main.yml b/roles/upgrade/pre-upgrade/tasks/main.yml
index e4dbe569bcdec2420307fcddf308d586ed9f3ba1..59a264f35baaf60b59382f2dc04c46b47f812d6d 100644
--- a/roles/upgrade/pre-upgrade/tasks/main.yml
+++ b/roles/upgrade/pre-upgrade/tasks/main.yml
@@ -1,13 +1,27 @@
 ---
+# Node Ready: type = ready, status = True
+# Node NotReady: type = ready, status = Unknown
 - name: See if node is in ready state
-  shell: "{{ bin_dir }}/kubectl get nodes | grep {{ inventory_hostname }}"
-  register: kubectl_nodes
+  shell: >-
+     {{ bin_dir }}/kubectl get node {{ inventory_hostname }}
+     -o jsonpath='{ range .status.conditions[?(@.type == "Ready")].status }{ @ }{ end }'
+  register: kubectl_node_ready
+  delegate_to: "{{ groups['kube-master'][0] }}"
+  failed_when: false
+
+# SchedulingDisabled: unschedulable = true
+# else unschedulable key doesn't exist
+- name: See if node is schedulable
+  shell: >-
+     {{ bin_dir }}/kubectl get node {{ inventory_hostname }}
+     -o jsonpath='{ .spec.unschedulable }'
+  register: kubectl_node_schedulable
   delegate_to: "{{ groups['kube-master'][0] }}"
   failed_when: false
 
 - set_fact:
     needs_cordoning: >-
-      {% if " Ready" in kubectl_nodes.stdout -%}
+      {% if kubectl_node_ready.stdout == "True" and kubectl_node_schedulable.stdout == "" -%}
       true
       {%- else -%}
       false