From 6fe2248314fb319563a60ae023b552371e34e148 Mon Sep 17 00:00:00 2001
From: Matthew Mosesohn <matthew.mosesohn@gmail.com>
Date: Fri, 13 Sep 2019 13:40:29 +0300
Subject: [PATCH] Use more native way to update kubeconfigs using kubeadm
 (#5165)

Change-Id: I1076b418f85a26d9896be69910052128afc51cee
---
 .../master/tasks/kubeadm-fix-apiserver.yml    | 54 +++++++++++++++----
 1 file changed, 43 insertions(+), 11 deletions(-)

diff --git a/roles/kubernetes/master/tasks/kubeadm-fix-apiserver.yml b/roles/kubernetes/master/tasks/kubeadm-fix-apiserver.yml
index 32a4e0ffb..4200e6d71 100644
--- a/roles/kubernetes/master/tasks/kubeadm-fix-apiserver.yml
+++ b/roles/kubernetes/master/tasks/kubeadm-fix-apiserver.yml
@@ -1,13 +1,45 @@
 ---
-- name: Update server field in component kubeconfigs
-  lineinfile:
-    dest: "{{ kube_config_dir }}/{{ item }}.conf"
-    regexp: 'server:'
-    line: '    server: {{ kube_apiserver_endpoint }}'
-    backup: yes
+- name: Test if correct apiserver is set in all kubeconfigs
+  shell: >-
+    grep -Fq "{{ kube_apiserver_endpoint }}" {{ kube_config_dir }}/admin.conf &&
+    grep -Fq "{{ kube_apiserver_endpoint }}" {{ kube_config_dir }}/controller-manager.conf &&
+    grep -Fq "{{ kube_apiserver_endpoint }}" {{ kube_config_dir }}/kubelet.conf &&
+    grep -Fq "{{ kube_apiserver_endpoint }}" {{ kube_config_dir }}/scheduler.conf
+  register: kubeconfig_correct_apiserver
+  changed_when: False
+  failed_when: False
+
+- name: Create temporary directory
+  tempfile:
+    state: directory
+  register: kubeconfig_temp_dir
+  when: kubeconfig_correct_apiserver.rc != 0
+
+- name: Generate new kubeconfigs with correct apiserver
+  command: >-
+    {{ bin_dir }}/kubeadm init phase kubeconfig all
+    --config {{ kube_config_dir }}/kubeadm-config.yaml
+    --kubeconfig-dir {{ kubeconfig_temp_dir.path }}
+  when: kubeconfig_correct_apiserver.rc != 0
+
+- name: Copy new kubeconfigs to kube config dir
+  copy:
+    src: "{{ kubeconfig_temp_dir.path }}/{{ item }}"
+    dest: "{{ kube_config_dir }}/{{ item }}"
+    remote_src: yes
+  when: kubeconfig_correct_apiserver.rc != 0
   with_items:
-    - controller-manager
-    - scheduler
-  when:
-    - not loadbalancer_apiserver is defined
-  notify: "Master | Restart kube-{{ item }}"
+    - admin.conf
+    - controller-manager.conf
+    - kubelet.conf
+    - scheduler.conf
+  notify:
+    - "Master | Restart kube-controller-manager"
+    - "Master | Restart kube-scheduler"
+    - "Master | reload kubelet"
+
+- name: Cleanup temporary directory
+  file:
+    path: "{{ kubeconfig_temp_dir.path }}"
+    state: absent
+  when: kubeconfig_correct_apiserver.rc != 0
-- 
GitLab