2017-09-13 18:00:51 +00:00
|
|
|
---
|
2017-09-26 09:38:58 +00:00
|
|
|
- name: kubeadm | Check if old apiserver cert exists on host
|
|
|
|
stat:
|
|
|
|
path: "{{ kube_cert_dir }}/apiserver.pem"
|
|
|
|
register: old_apiserver_cert
|
|
|
|
delegate_to: "{{groups['kube-master']|first}}"
|
|
|
|
run_once: true
|
|
|
|
|
2018-11-21 09:35:40 +00:00
|
|
|
- name: kubeadm | Migrate old certs if necessary
|
|
|
|
import_tasks: kubeadm-migrate-certs.yml
|
|
|
|
when: old_apiserver_cert.stat.exists
|
|
|
|
|
2017-09-26 09:38:58 +00:00
|
|
|
- name: kubeadm | Check service account key
|
|
|
|
stat:
|
|
|
|
path: "{{ kube_cert_dir }}/sa.key"
|
|
|
|
register: sa_key_before
|
|
|
|
delegate_to: "{{groups['kube-master']|first}}"
|
|
|
|
run_once: true
|
|
|
|
|
|
|
|
- name: kubeadm | Check if kubeadm has already run
|
|
|
|
stat:
|
2018-11-07 19:46:11 +00:00
|
|
|
path: "/var/lib/kubelet/config.yaml"
|
|
|
|
register: kubeadm_already_run
|
2017-10-15 09:33:22 +00:00
|
|
|
|
|
|
|
- name: kubeadm | Delete old admin.conf
|
|
|
|
file:
|
2017-09-26 09:38:58 +00:00
|
|
|
path: "{{ kube_config_dir }}/admin.conf"
|
2017-10-15 09:33:22 +00:00
|
|
|
state: absent
|
2018-11-07 19:46:11 +00:00
|
|
|
when: not kubeadm_already_run.stat.exists
|
2017-09-26 09:38:58 +00:00
|
|
|
|
|
|
|
- name: kubeadm | Delete old static pods
|
|
|
|
file:
|
|
|
|
path: "{{ kube_config_dir }}/manifests/{{item}}.manifest"
|
|
|
|
state: absent
|
|
|
|
with_items: ["kube-apiserver", "kube-controller-manager", "kube-scheduler", "kube-proxy"]
|
|
|
|
when: old_apiserver_cert.stat.exists
|
|
|
|
|
|
|
|
- name: kubeadm | Forcefully delete old static pods
|
|
|
|
shell: "docker ps -f name=k8s_{{item}} -q | xargs --no-run-if-empty docker rm -f"
|
|
|
|
with_items: ["kube-apiserver", "kube-controller-manager", "kube-scheduler"]
|
|
|
|
when: old_apiserver_cert.stat.exists
|
|
|
|
|
2017-09-13 18:00:51 +00:00
|
|
|
- name: kubeadm | aggregate all SANs
|
|
|
|
set_fact:
|
2019-04-10 11:30:15 +00:00
|
|
|
apiserver_sans: "{{ (sans_base + groups['kube-master'] + sans_lb + sans_supp + sans_access_ip + sans_ip + sans_address) | unique }}"
|
|
|
|
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 [] }}"
|
|
|
|
sans_supp: "{{ supplementary_addresses_in_ssl_keys if supplementary_addresses_in_ssl_keys is defined else [] }}"
|
|
|
|
sans_access_ip: "{{ groups['kube-master'] | map('extract', hostvars, 'access_ip') | list | select('defined') | list }}"
|
|
|
|
sans_ip: "{{ groups['kube-master'] | map('extract', hostvars, 'ip') | list | select('defined') | list }}"
|
|
|
|
sans_address: "{{ groups['kube-master'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list | select('defined') | list }}"
|
2017-10-17 10:06:07 +00:00
|
|
|
tags: facts
|
2017-09-13 18:00:51 +00:00
|
|
|
|
|
|
|
- name: kubeadm | Copy etcd cert dir under k8s cert dir
|
|
|
|
command: "cp -TR {{ etcd_cert_dir }} {{ kube_config_dir }}/ssl/etcd"
|
|
|
|
changed_when: false
|
|
|
|
|
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
|
2018-08-15 08:41:13 +00:00
|
|
|
when: kubernetes_audit|default(false)
|
|
|
|
|
|
|
|
- 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 }}"
|
2018-08-15 08:41:13 +00:00
|
|
|
when: kubernetes_audit|default(false)
|
|
|
|
|
2018-08-14 12:13:44 +00:00
|
|
|
- name: gets the kubeadm version
|
|
|
|
command: "{{ bin_dir }}/kubeadm version -o short"
|
|
|
|
register: kubeadm_output
|
|
|
|
|
|
|
|
- name: sets kubeadm api version to v1alpha1
|
|
|
|
set_fact:
|
|
|
|
kubeadmConfig_api_version: v1alpha1
|
2018-10-16 22:33:30 +00:00
|
|
|
when: kubeadm_output.stdout is version('v1.11.0', '<')
|
2018-08-14 12:13:44 +00:00
|
|
|
|
2018-10-04 09:05:55 +00:00
|
|
|
- name: sets kubeadm api version to v1alpha2
|
2018-08-14 12:13:44 +00:00
|
|
|
set_fact:
|
|
|
|
kubeadmConfig_api_version: v1alpha2
|
2018-10-04 09:05:55 +00:00
|
|
|
when:
|
2018-10-16 22:33:30 +00:00
|
|
|
- kubeadm_output.stdout is version('v1.11.0', '>=')
|
|
|
|
- kubeadm_output.stdout is version('v1.12.0', '<')
|
2018-10-04 09:05:55 +00:00
|
|
|
|
|
|
|
- name: sets kubeadm api version to v1alpha3
|
|
|
|
set_fact:
|
|
|
|
kubeadmConfig_api_version: v1alpha3
|
2018-10-16 22:33:30 +00:00
|
|
|
when: kubeadm_output.stdout is version('v1.12.0', '>=')
|
2018-08-14 12:13:44 +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
|
|
|
|
|
2017-09-13 18:00:51 +00:00
|
|
|
- name: kubeadm | Create kubeadm config
|
|
|
|
template:
|
2018-08-14 12:13:44 +00:00
|
|
|
src: "kubeadm-config.{{ kubeadmConfig_api_version }}.yaml.j2"
|
|
|
|
dest: "{{ kube_config_dir }}/kubeadm-config.{{ kubeadmConfig_api_version }}.yaml"
|
2017-09-13 18:00:51 +00:00
|
|
|
register: kubeadm_config
|
|
|
|
|
2017-09-15 21:28:15 +00:00
|
|
|
- name: kubeadm | Initialize first master
|
2018-08-28 04:51:38 +00:00
|
|
|
command: timeout -k 600s 600s {{ bin_dir }}/kubeadm init --config={{ kube_config_dir }}/kubeadm-config.{{ kubeadmConfig_api_version }}.yaml --ignore-preflight-errors=all
|
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
|
2018-11-07 19:46:11 +00:00
|
|
|
when: inventory_hostname == groups['kube-master']|first 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
|
|
|
|
notify: Master | restart kubelet
|
|
|
|
|
|
|
|
- name: kubeadm | Upgrade first master
|
2017-09-27 13:48:18 +00:00
|
|
|
command: >-
|
2018-08-28 04:51:38 +00:00
|
|
|
timeout -k 600s 600s
|
2017-09-27 13:48:18 +00:00
|
|
|
{{ bin_dir }}/kubeadm
|
|
|
|
upgrade apply -y {{ kube_version }}
|
2018-08-14 12:13:44 +00:00
|
|
|
--config={{ kube_config_dir }}/kubeadm-config.{{ kubeadmConfig_api_version }}.yaml
|
2017-12-25 08:57:45 +00:00
|
|
|
--ignore-preflight-errors=all
|
2017-09-27 13:48:18 +00:00
|
|
|
--allow-experimental-upgrades
|
|
|
|
--allow-release-candidate-upgrades
|
2018-11-19 14:29:58 +00:00
|
|
|
--etcd-upgrade=false
|
2018-06-05 11:15:20 +00:00
|
|
|
--force
|
2017-09-26 09:38:58 +00:00
|
|
|
register: kubeadm_upgrade
|
2017-09-27 13:47:47 +00:00
|
|
|
# Retry is because upload config sometimes fails
|
2017-09-26 09:38:58 +00:00
|
|
|
retries: 3
|
2018-11-07 19:46:11 +00:00
|
|
|
when: inventory_hostname == groups['kube-master']|first and (kubeadm_config.changed and kubeadm_already_run.stat.exists)
|
2017-09-26 09:38:58 +00:00
|
|
|
failed_when: kubeadm_upgrade.rc != 0 and "field is immutable" not in kubeadm_upgrade.stderr
|
|
|
|
notify: Master | restart kubelet
|
|
|
|
|
|
|
|
# FIXME(mattymo): remove when https://github.com/kubernetes/kubeadm/issues/433 is fixed
|
|
|
|
- name: kubeadm | Enable kube-proxy
|
2018-08-14 12:13:44 +00:00
|
|
|
command: "{{ bin_dir }}/kubeadm alpha phase addon kube-proxy --config={{ kube_config_dir }}/kubeadm-config.{{ kubeadmConfig_api_version }}.yaml"
|
2018-11-15 18:03:23 +00:00
|
|
|
register: kubeadm_kube_proxy_enable
|
|
|
|
retries: 10
|
|
|
|
until: kubeadm_kube_proxy_enable is succeeded
|
2017-09-26 09:38:58 +00:00
|
|
|
when: inventory_hostname == groups['kube-master']|first
|
|
|
|
changed_when: false
|
2017-09-15 21:28:15 +00:00
|
|
|
|
|
|
|
- name: slurp kubeadm certs
|
|
|
|
slurp:
|
|
|
|
src: "{{ item }}"
|
|
|
|
with_items:
|
|
|
|
- "{{ kube_cert_dir }}/apiserver.crt"
|
|
|
|
- "{{ kube_cert_dir }}/apiserver.key"
|
|
|
|
- "{{ kube_cert_dir }}/apiserver-kubelet-client.crt"
|
|
|
|
- "{{ kube_cert_dir }}/apiserver-kubelet-client.key"
|
|
|
|
- "{{ kube_cert_dir }}/ca.crt"
|
|
|
|
- "{{ kube_cert_dir }}/ca.key"
|
|
|
|
- "{{ kube_cert_dir }}/front-proxy-ca.crt"
|
|
|
|
- "{{ kube_cert_dir }}/front-proxy-ca.key"
|
|
|
|
- "{{ kube_cert_dir }}/front-proxy-client.crt"
|
|
|
|
- "{{ kube_cert_dir }}/front-proxy-client.key"
|
|
|
|
- "{{ kube_cert_dir }}/sa.key"
|
|
|
|
- "{{ kube_cert_dir }}/sa.pub"
|
|
|
|
register: kubeadm_certs
|
|
|
|
delegate_to: "{{ groups['kube-master']|first }}"
|
|
|
|
run_once: true
|
|
|
|
|
2017-09-26 09:38:58 +00:00
|
|
|
- name: kubeadm | write out kubeadm certs
|
2017-09-15 21:28:15 +00:00
|
|
|
copy:
|
|
|
|
dest: "{{ item.item }}"
|
|
|
|
content: "{{ item.content | b64decode }}"
|
|
|
|
owner: root
|
|
|
|
group: root
|
2018-05-15 07:54:32 +00:00
|
|
|
mode: 0600
|
2017-09-15 21:28:15 +00:00
|
|
|
no_log: true
|
|
|
|
register: copy_kubeadm_certs
|
|
|
|
with_items: "{{ kubeadm_certs.results }}"
|
|
|
|
when: inventory_hostname != groups['kube-master']|first
|
|
|
|
|
2017-09-26 09:38:58 +00:00
|
|
|
- name: kubeadm | Init other uninitialized masters
|
2018-08-28 04:51:38 +00:00
|
|
|
command: timeout -k 600s 600s {{ bin_dir }}/kubeadm init --config={{ kube_config_dir }}/kubeadm-config.{{ kubeadmConfig_api_version }}.yaml --ignore-preflight-errors=all
|
2017-09-13 18:00:51 +00:00
|
|
|
register: kubeadm_init
|
2018-11-15 18:03:23 +00:00
|
|
|
retries: 10
|
|
|
|
until: kubeadm_init is succeeded or "field is immutable" in kubeadm_init.stderr
|
2018-11-07 19:46:11 +00:00
|
|
|
when: inventory_hostname != groups['kube-master']|first 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
|
|
|
|
notify: Master | restart kubelet
|
|
|
|
|
|
|
|
- name: kubeadm | Upgrade other masters
|
2017-09-27 13:48:18 +00:00
|
|
|
command: >-
|
2018-08-28 04:51:38 +00:00
|
|
|
timeout -k 600s 600s
|
2017-09-27 13:48:18 +00:00
|
|
|
{{ bin_dir }}/kubeadm
|
|
|
|
upgrade apply -y {{ kube_version }}
|
2018-08-14 12:13:44 +00:00
|
|
|
--config={{ kube_config_dir }}/kubeadm-config.{{ kubeadmConfig_api_version }}.yaml
|
2017-12-25 08:57:45 +00:00
|
|
|
--ignore-preflight-errors=all
|
2017-09-27 13:48:18 +00:00
|
|
|
--allow-experimental-upgrades
|
|
|
|
--allow-release-candidate-upgrades
|
2018-11-19 14:29:58 +00:00
|
|
|
--etcd-upgrade=false
|
2017-09-26 09:38:58 +00:00
|
|
|
register: kubeadm_upgrade
|
2018-11-07 19:46:11 +00:00
|
|
|
when: inventory_hostname != groups['kube-master']|first and (kubeadm_config.changed and kubeadm_already_run.stat.exists)
|
2017-09-26 09:38:58 +00:00
|
|
|
failed_when: kubeadm_upgrade.rc != 0 and "field is immutable" not in kubeadm_upgrade.stderr
|
|
|
|
notify: Master | restart kubelet
|
|
|
|
|
|
|
|
- name: kubeadm | Check service account key again
|
|
|
|
stat:
|
|
|
|
path: "{{ kube_cert_dir }}/sa.key"
|
|
|
|
register: sa_key_after
|
|
|
|
delegate_to: "{{groups['kube-master']|first}}"
|
|
|
|
run_once: true
|
|
|
|
|
|
|
|
- name: kubeadm | Set secret_changed if service account key was updated
|
|
|
|
command: /bin/true
|
|
|
|
notify: Master | set secret_changed
|
|
|
|
when: sa_key_before.stat.checksum|default("") != sa_key_after.stat.checksum
|
|
|
|
|
|
|
|
- name: kubeadm | cleanup old certs if necessary
|
2018-01-29 11:37:48 +00:00
|
|
|
import_tasks: kubeadm-cleanup-old-certs.yml
|
2017-09-26 09:38:58 +00:00
|
|
|
when: old_apiserver_cert.stat.exists
|
2018-10-09 08:40:43 +00:00
|
|
|
|
|
|
|
- name: kubeadm | Remove taint for master with node role
|
2018-11-21 09:35:40 +00:00
|
|
|
command: "{{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf taint node {{ inventory_hostname }} node-role.kubernetes.io/master:NoSchedule-"
|
2018-10-09 08:40:43 +00:00
|
|
|
delegate_to: "{{groups['kube-master']|first}}"
|
|
|
|
when: inventory_hostname in groups['kube-node']
|
2018-10-19 07:38:12 +00:00
|
|
|
failed_when: false
|