diff --git a/roles/kubernetes/kubeadm/tasks/main.yml b/roles/kubernetes/kubeadm/tasks/main.yml
index 6223beb72c5ee5297c47207432f1e167e12440d2..4d16e8b26ab62b47cb21171c1cea97c75835a647 100644
--- a/roles/kubernetes/kubeadm/tasks/main.yml
+++ b/roles/kubernetes/kubeadm/tasks/main.yml
@@ -7,7 +7,6 @@
       {%- else -%}
       {{ kube_apiserver_endpoint }}
       {%- endif %}
-  when: not is_kube_master
   tags:
     - facts
 
@@ -61,6 +60,21 @@
   when: not is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
   notify: restart kubelet
 
+- name: Update server field in kube-proxy kubeconfig
+  shell: >-
+    {{ bin_dir }}/kubectl get configmap kube-proxy -n kube-system -o yaml
+    | sed 's#server:.*#server:\ {{ kube_apiserver_endpoint }}#g'
+    | kubectl replace -f -
+  delegate_to: "{{groups['kube-master']|first}}"
+  run_once: true
+  when: is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
+
+- name: Restart all kube-proxy pods to ensure that they load the new configmap
+  shell: "{{ bin_dir }}/kubectl delete pod -n kube-system -l k8s-app=kube-proxy"
+  delegate_to: "{{groups['kube-master']|first}}"
+  run_once: true
+  when: is_kube_master and kubeadm_discovery_address != kube_apiserver_endpoint
+
 # FIXME(mattymo): Reconcile kubelet kubeconfig filename for both deploy modes
 - name: Symlink kubelet kubeconfig for calico/canal
   file: