You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

232 lines
7.7 KiB

  1. ---
  2. - name: Set kubeadm_discovery_address
  3. set_fact:
  4. # noqa: jinja[spacing]
  5. kubeadm_discovery_address: >-
  6. {%- if "127.0.0.1" in kube_apiserver_endpoint or "localhost" in kube_apiserver_endpoint -%}
  7. {{ first_kube_control_plane_address }}:{{ kube_apiserver_port }}
  8. {%- else -%}
  9. {{ kube_apiserver_endpoint | replace("https://", "") }}
  10. {%- endif %}
  11. tags:
  12. - facts
  13. - name: Check if kubelet.conf exists
  14. stat:
  15. path: "{{ kube_config_dir }}/kubelet.conf"
  16. get_attributes: false
  17. get_checksum: false
  18. get_mime: false
  19. register: kubelet_conf
  20. - name: Check if kubeadm CA cert is accessible
  21. stat:
  22. path: "{{ kube_cert_dir }}/ca.crt"
  23. get_attributes: false
  24. get_checksum: false
  25. get_mime: false
  26. register: kubeadm_ca_stat
  27. delegate_to: "{{ groups['kube_control_plane'][0] }}"
  28. run_once: true
  29. - name: Calculate kubeadm CA cert hash
  30. shell: set -o pipefail && openssl x509 -pubkey -in {{ kube_cert_dir }}/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  31. args:
  32. executable: /bin/bash
  33. register: kubeadm_ca_hash
  34. when:
  35. - kubeadm_ca_stat.stat is defined
  36. - kubeadm_ca_stat.stat.exists
  37. delegate_to: "{{ groups['kube_control_plane'][0] }}"
  38. run_once: true
  39. changed_when: false
  40. - name: Create kubeadm token for joining nodes with 24h expiration (default)
  41. command: "{{ bin_dir }}/kubeadm token create"
  42. register: temp_token
  43. delegate_to: "{{ groups['kube_control_plane'][0] }}"
  44. when: kubeadm_token is not defined
  45. changed_when: false
  46. - name: Set kubeadm_token to generated token
  47. set_fact:
  48. kubeadm_token: "{{ temp_token.stdout }}"
  49. when: kubeadm_token is not defined
  50. - name: Set kubeadm api version to v1beta3
  51. set_fact:
  52. kubeadmConfig_api_version: v1beta3
  53. - name: Get kubeconfig for join discovery process
  54. command: "{{ kubectl }} -n kube-public get cm cluster-info -o jsonpath='{.data.kubeconfig}'"
  55. register: kubeconfig_file_discovery
  56. run_once: true
  57. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  58. when: kubeadm_use_file_discovery
  59. - name: Copy discovery kubeconfig
  60. copy:
  61. dest: "{{ kube_config_dir }}/cluster-info-discovery-kubeconfig.yaml"
  62. content: "{{ kubeconfig_file_discovery.stdout }}"
  63. owner: "root"
  64. mode: "0644"
  65. when:
  66. - ('kube_control_plane' not in group_names)
  67. - not kubelet_conf.stat.exists
  68. - kubeadm_use_file_discovery
  69. - name: Create kubeadm client config
  70. template:
  71. src: "kubeadm-client.conf.{{ kubeadmConfig_api_version }}.j2"
  72. dest: "{{ kube_config_dir }}/kubeadm-client.conf"
  73. backup: true
  74. mode: "0640"
  75. when: ('kube_control_plane' not in group_names)
  76. - name: Join to cluster if needed
  77. environment:
  78. PATH: "{{ bin_dir }}:{{ ansible_env.PATH }}:/sbin"
  79. when:
  80. - ('kube_control_plane' not in group_names)
  81. - not kubelet_conf.stat.exists
  82. block:
  83. - name: Join to cluster
  84. command: >-
  85. timeout -k {{ kubeadm_join_timeout }} {{ kubeadm_join_timeout }}
  86. {{ bin_dir }}/kubeadm join
  87. --config {{ kube_config_dir }}/kubeadm-client.conf
  88. --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests
  89. --skip-phases={{ kubeadm_join_phases_skip | join(',') }}
  90. register: kubeadm_join
  91. changed_when: kubeadm_join is success
  92. rescue:
  93. - name: Join to cluster with ignores
  94. command: >-
  95. timeout -k {{ kubeadm_join_timeout }} {{ kubeadm_join_timeout }}
  96. {{ bin_dir }}/kubeadm join
  97. --config {{ kube_config_dir }}/kubeadm-client.conf
  98. --ignore-preflight-errors=all
  99. --skip-phases={{ kubeadm_join_phases_skip | join(',') }}
  100. register: kubeadm_join
  101. changed_when: kubeadm_join is success
  102. always:
  103. - name: Display kubeadm join stderr if any
  104. when: kubeadm_join is failed
  105. debug:
  106. msg: |
  107. Joined with warnings
  108. {{ kubeadm_join.stderr_lines }}
  109. - name: Update server field in kubelet kubeconfig
  110. lineinfile:
  111. dest: "{{ kube_config_dir }}/kubelet.conf"
  112. regexp: 'server:'
  113. line: ' server: {{ kube_apiserver_endpoint }}'
  114. backup: true
  115. when:
  116. - kubeadm_config_api_fqdn is not defined
  117. - ('kube_control_plane' not in group_names)
  118. - kubeadm_discovery_address != kube_apiserver_endpoint | replace("https://", "")
  119. notify: Kubeadm | restart kubelet
  120. - name: Update server field in kubelet kubeconfig - external lb
  121. lineinfile:
  122. dest: "{{ kube_config_dir }}/kubelet.conf"
  123. regexp: '^ server: https'
  124. line: ' server: {{ kube_apiserver_endpoint }}'
  125. backup: true
  126. when:
  127. - ('kube_control_plane' not in group_names)
  128. - loadbalancer_apiserver is defined
  129. notify: Kubeadm | restart kubelet
  130. - name: Get current resourceVersion of kube-proxy configmap
  131. command: "{{ kubectl }} get configmap kube-proxy -n kube-system -o jsonpath='{.metadata.resourceVersion}'"
  132. register: original_configmap_resource_version
  133. run_once: true
  134. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  135. delegate_facts: false
  136. when:
  137. - kube_proxy_deployed
  138. tags:
  139. - kube-proxy
  140. # FIXME(mattymo): Need to point to localhost, otherwise control plane nodes will all point
  141. # incorrectly to first control plane node, creating SPoF.
  142. - name: Update server field in kube-proxy kubeconfig
  143. shell: >-
  144. set -o pipefail && {{ kubectl }} get configmap kube-proxy -n kube-system -o yaml
  145. | sed 's#server:.*#server: https://127.0.0.1:{{ kube_apiserver_port }}#g'
  146. | {{ kubectl }} replace -f -
  147. args:
  148. executable: /bin/bash
  149. run_once: true
  150. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  151. delegate_facts: false
  152. when:
  153. - kubeadm_config_api_fqdn is not defined
  154. - kubeadm_discovery_address != kube_apiserver_endpoint | replace("https://", "")
  155. - kube_proxy_deployed
  156. - loadbalancer_apiserver_localhost
  157. tags:
  158. - kube-proxy
  159. - name: Update server field in kube-proxy kubeconfig - external lb
  160. shell: >-
  161. set -o pipefail && {{ kubectl }} get configmap kube-proxy -n kube-system -o yaml
  162. | sed 's#server:.*#server: {{kube_apiserver_endpoint}}#g'
  163. | {{ kubectl }} replace -f -
  164. args:
  165. executable: /bin/bash
  166. run_once: true
  167. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  168. delegate_facts: false
  169. when:
  170. - kube_proxy_deployed
  171. - loadbalancer_apiserver is defined
  172. tags:
  173. - kube-proxy
  174. - name: Get new resourceVersion of kube-proxy configmap
  175. command: "{{ kubectl }} get configmap kube-proxy -n kube-system -o jsonpath='{.metadata.resourceVersion}'"
  176. register: new_configmap_resource_version
  177. run_once: true
  178. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  179. delegate_facts: false
  180. when:
  181. - kube_proxy_deployed
  182. tags:
  183. - kube-proxy
  184. - name: Set ca.crt file permission
  185. file:
  186. path: "{{ kube_cert_dir }}/ca.crt"
  187. owner: root
  188. group: root
  189. mode: "0644"
  190. - name: Restart all kube-proxy pods to ensure that they load the new configmap
  191. command: "{{ kubectl }} delete pod -n kube-system -l k8s-app=kube-proxy --force --grace-period=0"
  192. run_once: true
  193. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  194. delegate_facts: false
  195. when:
  196. - kubeadm_config_api_fqdn is not defined or loadbalancer_apiserver is defined
  197. - kubeadm_discovery_address != kube_apiserver_endpoint | replace("https://", "") or loadbalancer_apiserver is defined
  198. - kube_proxy_deployed
  199. - original_configmap_resource_version.stdout != new_configmap_resource_version.stdout
  200. tags:
  201. - kube-proxy
  202. - name: Extract etcd certs from control plane if using etcd kubeadm mode
  203. include_tasks: kubeadm_etcd_node.yml
  204. when:
  205. - etcd_deployment_type == "kubeadm"
  206. - inventory_hostname not in groups['kube_control_plane']
  207. - kube_network_plugin in ["calico", "flannel", "cilium"] or cilium_deploy_additionally | default(false) | bool
  208. - kube_network_plugin != "calico" or calico_datastore == "etcd"