k8s/roles/k8s_control_plane/tasks/kubeadm_init.yml
2026-07-15 11:14:21 +03:00

134 lines
4.1 KiB
YAML

---
- name: kubeadm init | Get full kubeadm version
ansible.builtin.command: kubeadm version -o short
register: _kubeadm_full_version
changed_when: false
- name: kubeadm init | Check if cluster already initialized
ansible.builtin.stat:
path: /etc/kubernetes/admin.conf
register: _admin_conf
- name: kubeadm init | Write kubeadm config
ansible.builtin.template:
src: kubeadm_config.yml.j2
dest: /tmp/kubeadm_config.yml
mode: "0600"
when: not _admin_conf.stat.exists
- name: kubeadm init | Initialize cluster
ansible.builtin.command: >
kubeadm init
--config /tmp/kubeadm_config.yml
--upload-certs
when: not _admin_conf.stat.exists
register: _kubeadm_init
changed_when: true
- name: kubeadm init | Ensure .kube dir for root
ansible.builtin.file:
path: /root/.kube
state: directory
mode: "0700"
- name: kubeadm init | Copy admin.conf for root
ansible.builtin.copy:
src: /etc/kubernetes/admin.conf
dest: /root/.kube/config
remote_src: true
mode: "0600"
- name: kubeadm init | Ensure .kube dir for ansible_user
ansible.builtin.file:
path: "/home/{{ ansible_user }}/.kube"
state: directory
owner: "{{ ansible_user }}"
group: "{{ ansible_user }}"
mode: "0700"
- name: kubeadm init | Copy admin.conf for ansible_user
ansible.builtin.copy:
src: /etc/kubernetes/admin.conf
dest: "{{ kubeconfig_path }}"
remote_src: true
owner: "{{ ansible_user }}"
group: "{{ ansible_user }}"
mode: "0600"
# Fix #6: pinned Flannel version — change flannel_version in defaults to upgrade
- name: kubeadm init | Install Flannel CNI
ansible.builtin.command: >
kubectl apply -f
https://github.com/flannel-io/flannel/releases/download/{{ flannel_version }}/kube-flannel.yml
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
when:
- cni_plugin == "flannel"
- not _admin_conf.stat.exists
changed_when: true
- name: kubeadm init | Install Calico CNI
ansible.builtin.command: >
kubectl apply -f
https://raw.githubusercontent.com/projectcalico/calico/{{ calico_version }}/manifests/calico.yaml
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
when:
- cni_plugin == "calico"
- not _admin_conf.stat.exists
changed_when: true
# single-node cluster — remove taint so workloads can schedule on master
- name: kubeadm init | Remove control-plane taint (single-node)
ansible.builtin.command: >
kubectl taint nodes {{ inventory_hostname }}
node-role.kubernetes.io/control-plane:NoSchedule-
environment:
KUBECONFIG: /etc/kubernetes/admin.conf
when: not _admin_conf.stat.exists
failed_when: false
changed_when: true
# Fix #5: save join command so worker nodes can be added later (tokens expire in 24h)
- name: kubeadm init | Save worker join command
ansible.builtin.shell: >
kubeadm token create --print-join-command
register: _join_command
changed_when: false
- name: kubeadm init | Write join command to file
ansible.builtin.copy:
content: "{{ _join_command.stdout }}\n"
dest: /etc/kubernetes/worker_join_command.sh
mode: "0600"
# Fix #3: create .kube dir on managers before copying kubeconfig (race condition)
- name: kubeadm init | Ensure .kube dir on manager nodes
ansible.builtin.file:
path: "/home/{{ ansible_user }}/.kube"
state: directory
owner: "{{ ansible_user }}"
group: "{{ ansible_user }}"
mode: "0700"
delegate_to: "{{ item }}"
loop: "{{ groups['manager_nodes'] }}"
when: kubeconfig_fetch_to_managers | bool
- name: kubeadm init | Fetch kubeconfig to controller
ansible.builtin.fetch:
src: /etc/kubernetes/admin.conf
dest: "/tmp/k8s_admin_{{ inventory_hostname }}.conf"
flat: true
when: kubeconfig_fetch_to_managers | bool
- name: kubeadm init | Distribute kubeconfig to manager nodes
ansible.builtin.copy:
src: "/tmp/k8s_admin_{{ inventory_hostname }}.conf"
dest: "/home/{{ ansible_user }}/.kube/config"
owner: "{{ ansible_user }}"
group: "{{ ansible_user }}"
mode: "0600"
delegate_to: "{{ item }}"
loop: "{{ groups['manager_nodes'] }}"
when: kubeconfig_fetch_to_managers | bool