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.

157 lines
5.2 KiB

  1. ---
  2. - name: Set kubeadm_discovery_address
  3. set_fact:
  4. kubeadm_discovery_address: >-
  5. {%- if "127.0.0.1" in kube_apiserver_endpoint or "localhost" in kube_apiserver_endpoint -%}
  6. {{ first_kube_master }}:{{ kube_apiserver_port }}
  7. {%- else -%}
  8. {{ kube_apiserver_endpoint | replace("https://", "") }}
  9. {%- endif %}
  10. tags:
  11. - facts
  12. - name: Check if kubelet.conf exists
  13. stat:
  14. path: "{{ kube_config_dir }}/kubelet.conf"
  15. get_attributes: no
  16. get_checksum: no
  17. get_mime: no
  18. register: kubelet_conf
  19. - name: Check if kubeadm CA cert is accessible
  20. stat:
  21. path: "{{ kube_cert_dir }}/ca.crt"
  22. get_attributes: no
  23. get_checksum: no
  24. get_mime: no
  25. register: kubeadm_ca_stat
  26. delegate_to: "{{ groups['kube_control_plane'][0] }}"
  27. run_once: true
  28. - name: Calculate kubeadm CA cert hash
  29. 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/^.* //'
  30. args:
  31. executable: /bin/bash
  32. register: kubeadm_ca_hash
  33. when:
  34. - kubeadm_ca_stat.stat is defined
  35. - kubeadm_ca_stat.stat.exists
  36. delegate_to: "{{ groups['kube_control_plane'][0] }}"
  37. run_once: true
  38. changed_when: false
  39. - name: Create kubeadm token for joining nodes with 24h expiration (default)
  40. command: "{{ bin_dir }}/kubeadm token create"
  41. register: temp_token
  42. delegate_to: "{{ groups['kube_control_plane'][0] }}"
  43. when: kubeadm_token is not defined
  44. changed_when: false
  45. - name: Set kubeadm_token to generated token
  46. set_fact:
  47. kubeadm_token: "{{ temp_token.stdout }}"
  48. when: kubeadm_token is not defined
  49. - name: Set kubeadm api version to v1beta2
  50. set_fact:
  51. kubeadmConfig_api_version: v1beta2
  52. - name: Create kubeadm client config
  53. template:
  54. src: "kubeadm-client.conf.{{ kubeadmConfig_api_version }}.j2"
  55. dest: "{{ kube_config_dir }}/kubeadm-client.conf"
  56. backup: yes
  57. mode: 0640
  58. when: not is_kube_master
  59. - name: Join to cluster if needed
  60. environment:
  61. PATH: "{{ bin_dir }}:{{ ansible_env.PATH }}:/sbin"
  62. when: not is_kube_master and (not kubelet_conf.stat.exists)
  63. block:
  64. - name: Join to cluster
  65. command: >-
  66. timeout -k {{ kubeadm_join_timeout }} {{ kubeadm_join_timeout }}
  67. {{ bin_dir }}/kubeadm join
  68. --config {{ kube_config_dir }}/kubeadm-client.conf
  69. --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests
  70. register: kubeadm_join
  71. rescue:
  72. - name: Join to cluster with ignores
  73. command: >-
  74. timeout -k {{ kubeadm_join_timeout }} {{ kubeadm_join_timeout }}
  75. {{ bin_dir }}/kubeadm join
  76. --config {{ kube_config_dir }}/kubeadm-client.conf
  77. --ignore-preflight-errors=all
  78. register: kubeadm_join
  79. always:
  80. - name: Display kubeadm join stderr if any
  81. when: kubeadm_join is failed
  82. debug:
  83. msg: |
  84. Joined with warnings
  85. {{ kubeadm_join.stderr_lines }}
  86. - name: Update server field in kubelet kubeconfig
  87. lineinfile:
  88. dest: "{{ kube_config_dir }}/kubelet.conf"
  89. regexp: 'server:'
  90. line: ' server: {{ kube_apiserver_endpoint }}'
  91. backup: yes
  92. when:
  93. - kubeadm_config_api_fqdn is not defined
  94. - not is_kube_master
  95. - kubeadm_discovery_address != kube_apiserver_endpoint | replace("https://", "")
  96. notify: Kubeadm | restart kubelet
  97. # FIXME(mattymo): Need to point to localhost, otherwise masters will all point
  98. # incorrectly to first master, creating SPoF.
  99. - name: Update server field in kube-proxy kubeconfig
  100. shell: >-
  101. set -o pipefail && {{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf get configmap kube-proxy -n kube-system -o yaml
  102. | sed 's#server:.*#server: https://127.0.0.1:{{ kube_apiserver_port }}#g'
  103. | {{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf replace -f -
  104. args:
  105. executable: /bin/bash
  106. run_once: true
  107. delegate_to: "{{ groups['kube_control_plane']|first }}"
  108. delegate_facts: false
  109. when:
  110. - kubeadm_config_api_fqdn is not defined
  111. - kubeadm_discovery_address != kube_apiserver_endpoint | replace("https://", "")
  112. - kube_proxy_deployed
  113. - loadbalancer_apiserver_localhost
  114. tags:
  115. - kube-proxy
  116. - name: Set ca.crt file permission
  117. file:
  118. path: "{{ kube_cert_dir }}/ca.crt"
  119. owner: root
  120. group: root
  121. mode: "0644"
  122. - name: Restart all kube-proxy pods to ensure that they load the new configmap
  123. command: "{{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf delete pod -n kube-system -l k8s-app=kube-proxy --force --grace-period=0"
  124. run_once: true
  125. delegate_to: "{{ groups['kube_control_plane']|first }}"
  126. delegate_facts: false
  127. when:
  128. - kubeadm_config_api_fqdn is not defined
  129. - kubeadm_discovery_address != kube_apiserver_endpoint | replace("https://", "")
  130. - kube_proxy_deployed
  131. tags:
  132. - kube-proxy
  133. - name: Extract etcd certs from control plane if using etcd kubeadm mode
  134. include_tasks: kubeadm_etcd_node.yml
  135. when:
  136. - etcd_kubeadm_enabled
  137. - inventory_hostname not in groups['kube_control_plane']
  138. - kube_network_plugin in ["calico", "flannel", "canal", "cilium"] or cilium_deploy_additionally | default(false) | bool
  139. - kube_network_plugin != "calico" or calico_datastore == "etcd"