2017-09-13 18:00:51 +00:00
|
|
|
---
|
2019-04-24 16:40:01 +00:00
|
|
|
- name: Install OIDC certificate
|
|
|
|
copy:
|
|
|
|
content: "{{ kube_oidc_ca_cert | b64decode }}"
|
|
|
|
dest: "{{ kube_oidc_ca_file }}"
|
|
|
|
owner: root
|
|
|
|
group: root
|
|
|
|
mode: "0644"
|
|
|
|
when:
|
|
|
|
- kube_oidc_auth
|
|
|
|
- kube_oidc_ca_cert is defined
|
|
|
|
|
2017-09-26 09:38:58 +00:00
|
|
|
- name: kubeadm | Check if kubeadm has already run
|
|
|
|
stat:
|
2018-11-07 19:46:11 +00:00
|
|
|
path: "/var/lib/kubelet/config.yaml"
|
2021-02-10 13:36:59 +00:00
|
|
|
get_attributes: no
|
|
|
|
get_checksum: no
|
|
|
|
get_mime: no
|
2018-11-07 19:46:11 +00:00
|
|
|
register: kubeadm_already_run
|
2017-10-15 09:33:22 +00:00
|
|
|
|
2021-03-03 23:08:22 +00:00
|
|
|
- name: kubeadm | Backup kubeadm certs / kubeconfig
|
|
|
|
import_tasks: kubeadm-backup.yml
|
|
|
|
when:
|
|
|
|
- kubeadm_already_run.stat.exists
|
|
|
|
|
2017-09-13 18:00:51 +00:00
|
|
|
- name: kubeadm | aggregate all SANs
|
|
|
|
set_fact:
|
2021-03-24 00:26:05 +00:00
|
|
|
apiserver_sans: "{{ (sans_base + groups['kube_control_plane'] + sans_lb + sans_lb_ip + sans_supp + sans_access_ip + sans_ip + sans_address + sans_override + sans_hostname + sans_fqdn) | unique }}"
|
2019-04-08 15:10:35 +00:00
|
|
|
vars:
|
|
|
|
sans_base:
|
|
|
|
- "kubernetes"
|
|
|
|
- "kubernetes.default"
|
|
|
|
- "kubernetes.default.svc"
|
|
|
|
- "kubernetes.default.svc.{{ dns_domain }}"
|
|
|
|
- "{{ kube_apiserver_ip }}"
|
|
|
|
- "localhost"
|
|
|
|
- "127.0.0.1"
|
|
|
|
sans_lb: "{{ [apiserver_loadbalancer_domain_name] if apiserver_loadbalancer_domain_name is defined else [] }}"
|
2019-05-16 08:23:42 +00:00
|
|
|
sans_lb_ip: "{{ [loadbalancer_apiserver.address] if loadbalancer_apiserver is defined and loadbalancer_apiserver.address is defined else [] }}"
|
2019-04-08 15:10:35 +00:00
|
|
|
sans_supp: "{{ supplementary_addresses_in_ssl_keys if supplementary_addresses_in_ssl_keys is defined else [] }}"
|
2021-03-24 00:26:05 +00:00
|
|
|
sans_access_ip: "{{ groups['kube_control_plane'] | map('extract', hostvars, 'access_ip') | list | select('defined') | list }}"
|
|
|
|
sans_ip: "{{ groups['kube_control_plane'] | map('extract', hostvars, 'ip') | list | select('defined') | list }}"
|
|
|
|
sans_address: "{{ groups['kube_control_plane'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list | select('defined') | list }}"
|
2019-06-25 15:00:37 +00:00
|
|
|
sans_override: "{{ [kube_override_hostname] if kube_override_hostname else [] }}"
|
2021-03-24 00:26:05 +00:00
|
|
|
sans_hostname: "{{ groups['kube_control_plane'] | map('extract', hostvars, ['ansible_hostname']) | list | select('defined') | list }}"
|
|
|
|
sans_fqdn: "{{ groups['kube_control_plane'] | map('extract', hostvars, ['ansible_fqdn']) | list | select('defined') | list }}"
|
2017-10-17 10:06:07 +00:00
|
|
|
tags: facts
|
2017-09-13 18:00:51 +00:00
|
|
|
|
2018-08-15 08:41:13 +00:00
|
|
|
- name: Create audit-policy directory
|
2018-08-16 10:51:09 +00:00
|
|
|
file:
|
|
|
|
path: "{{ audit_policy_file | dirname }}"
|
|
|
|
state: directory
|
2021-07-12 07:00:47 +00:00
|
|
|
mode: 0640
|
2020-07-20 08:32:54 +00:00
|
|
|
when: kubernetes_audit|default(false) or kubernetes_audit_webhook|default(false)
|
2018-08-15 08:41:13 +00:00
|
|
|
|
|
|
|
- name: Write api audit policy yaml
|
|
|
|
template:
|
|
|
|
src: apiserver-audit-policy.yaml.j2
|
2018-08-16 10:51:09 +00:00
|
|
|
dest: "{{ audit_policy_file }}"
|
2021-07-12 07:00:47 +00:00
|
|
|
mode: 0640
|
2020-07-20 08:32:54 +00:00
|
|
|
when: kubernetes_audit|default(false) or kubernetes_audit_webhook|default(false)
|
|
|
|
|
|
|
|
- name: Write api audit webhook config yaml
|
|
|
|
template:
|
|
|
|
src: apiserver-audit-webhook-config.yaml.j2
|
|
|
|
dest: "{{ audit_webhook_config_file }}"
|
2021-07-12 07:00:47 +00:00
|
|
|
mode: 0640
|
2020-07-20 08:32:54 +00:00
|
|
|
when: kubernetes_audit_webhook|default(false)
|
2018-08-15 08:41:13 +00:00
|
|
|
|
2018-08-18 14:05:35 +00:00
|
|
|
# Nginx LB(default), If kubeadm_config_api_fqdn is defined, use other LB by kubeadm controlPlaneEndpoint.
|
|
|
|
- name: set kubeadm_config_api_fqdn define
|
|
|
|
set_fact:
|
|
|
|
kubeadm_config_api_fqdn: "{{ apiserver_loadbalancer_domain_name|default('lb-apiserver.kubernetes.local') }}"
|
|
|
|
when: loadbalancer_apiserver is defined
|
|
|
|
|
2021-03-03 23:45:00 +00:00
|
|
|
- name: Set kubeadm api version to v1beta2
|
|
|
|
set_fact:
|
|
|
|
kubeadmConfig_api_version: v1beta2
|
|
|
|
|
|
|
|
- name: kubeadm | Create kubeadm config
|
|
|
|
template:
|
|
|
|
src: "kubeadm-config.{{ kubeadmConfig_api_version }}.yaml.j2"
|
|
|
|
dest: "{{ kube_config_dir }}/kubeadm-config.yaml"
|
|
|
|
mode: 0640
|
2017-09-13 18:00:51 +00:00
|
|
|
|
2020-04-08 08:27:43 +00:00
|
|
|
- name: kubeadm | Check if apiserver.crt contains all needed SANs
|
2021-04-12 16:17:38 +00:00
|
|
|
shell: |
|
|
|
|
set -o pipefail
|
|
|
|
for IP in {{ apiserver_ips | join(' ') }}; do
|
|
|
|
openssl x509 -noout -in "{{ kube_cert_dir }}/apiserver.crt" -checkip $IP | grep -q 'does match certificate' || echo 'NEED-RENEW'
|
|
|
|
done
|
|
|
|
for HOST in {{ apiserver_hosts | join(' ') }}; do
|
|
|
|
openssl x509 -noout -in "{{ kube_cert_dir }}/apiserver.crt" -checkhost $HOST | grep -q 'does match certificate' || echo 'NEED-RENEW'
|
|
|
|
done
|
|
|
|
vars:
|
|
|
|
apiserver_ips: "{{ apiserver_sans|map('ipaddr')|reject('equalto', False)|list }}"
|
|
|
|
apiserver_hosts: "{{ apiserver_sans|difference(apiserver_ips) }}"
|
|
|
|
args:
|
|
|
|
executable: /bin/bash
|
2020-04-08 08:27:43 +00:00
|
|
|
register: apiserver_sans_check
|
2021-04-12 16:17:38 +00:00
|
|
|
changed_when: "'NEED-RENEW' in apiserver_sans_check.stdout"
|
2020-04-08 08:27:43 +00:00
|
|
|
when:
|
|
|
|
- kubeadm_already_run.stat.exists
|
2022-04-12 12:47:23 +00:00
|
|
|
- not kube_external_ca_mode
|
2020-04-08 08:27:43 +00:00
|
|
|
|
|
|
|
- name: kubeadm | regenerate apiserver cert 1/2
|
|
|
|
file:
|
|
|
|
state: absent
|
|
|
|
path: "{{ kube_cert_dir }}/{{ item }}"
|
|
|
|
with_items:
|
|
|
|
- apiserver.crt
|
|
|
|
- apiserver.key
|
|
|
|
when:
|
|
|
|
- kubeadm_already_run.stat.exists
|
2021-03-22 18:22:48 +00:00
|
|
|
- apiserver_sans_check.changed
|
2022-04-12 12:47:23 +00:00
|
|
|
- not kube_external_ca_mode
|
2020-04-08 08:27:43 +00:00
|
|
|
|
|
|
|
- name: kubeadm | regenerate apiserver cert 2/2
|
|
|
|
command: >-
|
|
|
|
{{ bin_dir }}/kubeadm
|
|
|
|
init phase certs apiserver
|
|
|
|
--config={{ kube_config_dir }}/kubeadm-config.yaml
|
|
|
|
when:
|
|
|
|
- kubeadm_already_run.stat.exists
|
2021-03-22 18:22:48 +00:00
|
|
|
- apiserver_sans_check.changed
|
2022-04-12 12:47:23 +00:00
|
|
|
- not kube_external_ca_mode
|
2020-04-08 08:27:43 +00:00
|
|
|
|
2017-09-15 21:28:15 +00:00
|
|
|
- name: kubeadm | Initialize first master
|
2019-04-19 13:01:54 +00:00
|
|
|
command: >-
|
2019-07-09 12:41:59 +00:00
|
|
|
timeout -k 300s 300s
|
2019-04-19 13:01:54 +00:00
|
|
|
{{ bin_dir }}/kubeadm init
|
|
|
|
--config={{ kube_config_dir }}/kubeadm-config.yaml
|
|
|
|
--ignore-preflight-errors=all
|
2020-09-17 11:30:45 +00:00
|
|
|
--skip-phases={{ kubeadm_init_phases_skip | join(',') }}
|
2022-04-12 12:47:23 +00:00
|
|
|
{{ kube_external_ca_mode | ternary('', '--upload-certs') }}
|
2017-09-15 21:28:15 +00:00
|
|
|
register: kubeadm_init
|
2017-09-27 13:47:47 +00:00
|
|
|
# Retry is because upload config sometimes fails
|
2017-09-15 21:28:15 +00:00
|
|
|
retries: 3
|
2019-04-09 07:21:04 +00:00
|
|
|
until: kubeadm_init is succeeded or "field is immutable" in kubeadm_init.stderr
|
2021-12-06 08:16:32 +00:00
|
|
|
when: inventory_hostname == first_kube_control_plane and not kubeadm_already_run.stat.exists
|
2017-09-26 09:38:58 +00:00
|
|
|
failed_when: kubeadm_init.rc != 0 and "field is immutable" not in kubeadm_init.stderr
|
2021-02-23 17:44:02 +00:00
|
|
|
environment:
|
|
|
|
PATH: "{{ bin_dir }}:{{ ansible_env.PATH }}"
|
2017-09-26 09:38:58 +00:00
|
|
|
notify: Master | restart kubelet
|
|
|
|
|
2019-04-19 13:01:54 +00:00
|
|
|
- name: set kubeadm certificate key
|
|
|
|
set_fact:
|
|
|
|
kubeadm_certificate_key: "{{ item | regex_search('--certificate-key ([^ ]+)','\\1') | first }}"
|
2021-03-24 00:26:05 +00:00
|
|
|
with_items: "{{ hostvars[groups['kube_control_plane'][0]]['kubeadm_init'].stdout_lines | default([]) }}"
|
2019-04-19 13:01:54 +00:00
|
|
|
when:
|
|
|
|
- kubeadm_certificate_key is not defined
|
2019-12-05 15:24:32 +00:00
|
|
|
- (item | trim) is match('.*--certificate-key.*')
|
2019-04-19 13:01:54 +00:00
|
|
|
|
2019-04-23 21:37:59 +00:00
|
|
|
- name: Create hardcoded kubeadm token for joining nodes with 24h expiration (if defined)
|
|
|
|
shell: >-
|
2021-09-23 17:19:13 +00:00
|
|
|
{{ bin_dir }}/kubeadm --kubeconfig {{ kube_config_dir }}/admin.conf token delete {{ kubeadm_token }} || :;
|
|
|
|
{{ bin_dir }}/kubeadm --kubeconfig {{ kube_config_dir }}/admin.conf token create {{ kubeadm_token }}
|
2020-06-16 07:24:03 +00:00
|
|
|
changed_when: false
|
2019-04-23 21:37:59 +00:00
|
|
|
when:
|
2021-12-06 08:16:32 +00:00
|
|
|
- inventory_hostname == first_kube_control_plane
|
2019-04-23 21:37:59 +00:00
|
|
|
- kubeadm_token is defined
|
2019-08-06 07:59:53 +00:00
|
|
|
- kubeadm_refresh_token
|
2019-04-23 21:37:59 +00:00
|
|
|
tags:
|
|
|
|
- kubeadm_token
|
|
|
|
|
2019-04-19 13:01:54 +00:00
|
|
|
- name: Create kubeadm token for joining nodes with 24h expiration (default)
|
2021-09-23 17:19:13 +00:00
|
|
|
command: "{{ bin_dir }}/kubeadm --kubeconfig {{ kube_config_dir }}/admin.conf token create"
|
2020-06-16 07:24:03 +00:00
|
|
|
changed_when: false
|
2019-04-19 13:01:54 +00:00
|
|
|
register: temp_token
|
|
|
|
retries: 5
|
|
|
|
delay: 5
|
|
|
|
until: temp_token is succeeded
|
2021-12-06 08:16:32 +00:00
|
|
|
delegate_to: "{{ first_kube_control_plane }}"
|
2019-04-19 13:01:54 +00:00
|
|
|
when: kubeadm_token is not defined
|
|
|
|
tags:
|
|
|
|
- kubeadm_token
|
2018-12-28 07:27:27 +00:00
|
|
|
|
2019-04-19 13:01:54 +00:00
|
|
|
- name: Set kubeadm_token
|
|
|
|
set_fact:
|
|
|
|
kubeadm_token: "{{ temp_token.stdout }}"
|
|
|
|
when: temp_token.stdout is defined
|
|
|
|
tags:
|
|
|
|
- kubeadm_token
|
|
|
|
|
2020-09-17 11:34:45 +00:00
|
|
|
- name: kubeadm | Join other masters
|
|
|
|
include_tasks: kubeadm-secondary.yml
|
2019-04-19 13:01:54 +00:00
|
|
|
|
|
|
|
- name: kubeadm | upgrade kubernetes cluster
|
2019-11-14 10:05:34 +00:00
|
|
|
include_tasks: kubeadm-upgrade.yml
|
|
|
|
when:
|
|
|
|
- upgrade_cluster_setup
|
|
|
|
- kubeadm_already_run.stat.exists
|
2017-09-26 09:38:58 +00:00
|
|
|
|
2019-04-19 13:01:54 +00:00
|
|
|
# FIXME(mattymo): from docs: If you don't want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file.
|
2018-10-09 08:40:43 +00:00
|
|
|
- name: kubeadm | Remove taint for master with node role
|
2022-01-05 10:26:32 +00:00
|
|
|
command: "{{ kubectl }} taint node {{ inventory_hostname }} {{ item }}"
|
2021-12-06 08:16:32 +00:00
|
|
|
delegate_to: "{{ first_kube_control_plane }}"
|
2021-03-03 13:35:20 +00:00
|
|
|
with_items:
|
|
|
|
- "node-role.kubernetes.io/master:NoSchedule-"
|
|
|
|
- "node-role.kubernetes.io/control-plane:NoSchedule-"
|
2021-04-29 12:20:50 +00:00
|
|
|
when: inventory_hostname in groups['kube_node']
|
2018-10-19 07:38:12 +00:00
|
|
|
failed_when: false
|