diff --git a/roles/kubernetes/control-plane/defaults/main/main.yml b/roles/kubernetes/control-plane/defaults/main/main.yml index b94121dc2..d3582fb00 100644 --- a/roles/kubernetes/control-plane/defaults/main/main.yml +++ b/roles/kubernetes/control-plane/defaults/main/main.yml @@ -2,6 +2,9 @@ # disable upgrade cluster upgrade_cluster_setup: false +# Number of retries (with 5 seconds interval) to check that new control plane nodes +# are in Ready condition after joining +control_plane_node_become_ready_tries: 24 # By default the external API listens on all interfaces, this can be changed to # listen on a specific address/interface. # NOTE: If you specific address/interface and use loadbalancer_apiserver_localhost diff --git a/roles/kubernetes/control-plane/tasks/kubeadm-secondary.yml b/roles/kubernetes/control-plane/tasks/kubeadm-secondary.yml index d562d3019..35972d19d 100644 --- a/roles/kubernetes/control-plane/tasks/kubeadm-secondary.yml +++ b/roles/kubernetes/control-plane/tasks/kubeadm-secondary.yml @@ -98,3 +98,18 @@ when: - inventory_hostname != first_kube_control_plane - kubeadm_already_run is not defined or not kubeadm_already_run.stat.exists + +- name: Wait for new control plane nodes to be Ready + when: kubeadm_already_run.stat.exists + run_once: true + command: > + {{ kubectl }} get nodes --selector node-role.kubernetes.io/control-plane + -o jsonpath-as-json="{.items[*].status.conditions[?(@.type == 'Ready')]}" + register: control_plane_node_ready_conditions + retries: "{{ control_plane_node_become_ready_tries }}" + delay: 5 + delegate_to: "{{ groups['kube_control_plane'][0] }}" + until: > + control_plane_node_ready_conditions.stdout + | from_json | selectattr('status', '==', 'True') + | length == (groups['kube_control_plane'] | length)