Skip to content

Commit f685703

Browse files
panosmaurikosananos
authored andcommitted
feat: Add labels and karmada kubeconfig merge
Signed-off-by: Panos Mavrikos <pmavrikos@nubificus.co.uk>
1 parent 81b18ef commit f685703

3 files changed

Lines changed: 196 additions & 40 deletions

File tree

orchestrators/inventory.yml

Lines changed: 80 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,110 @@ all:
22
children:
33
management_cluster:
44
hosts:
5-
mls00:
6-
ansible_host: 192.168.5.79
5+
testvm00:
6+
ansible_host: 192.168.5.12
77
ansible_user: mlsysops
88
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
99
ansible_python_interpreter: /usr/bin/python3
1010
k3s_cluster_name: management
1111
pod_cidr: "10.10.0.0/16"
1212
service_cidr: "10.11.0.0/16"
13+
labels:
14+
is_vm: true
15+
continuumLayer: continuum
16+
vaccel: "false"
1317

1418
cluster1:
1519
children:
1620
master_nodes:
1721
hosts:
18-
mls01:
19-
ansible_host: 192.168.5.25
22+
testvm01:
23+
ansible_host: 192.168.5.55
2024
ansible_user: mlsysops
2125
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
2226
ansible_python_interpreter: /usr/bin/python3
2327
k3s_cluster_name: cluster1
2428
pod_cidr: "10.12.0.0/16"
2529
service_cidr: "10.13.0.0/16"
30+
labels:
31+
is_vm: true
32+
continuumLayer: cluster
33+
vaccel: "false"
2634
worker_nodes:
2735
hosts:
28-
mls02:
29-
ansible_host: 192.168.5.55
36+
testvm02:
37+
ansible_host: 192.168.5.7
3038
ansible_user: mlsysops
3139
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
3240
ansible_python_interpreter: /usr/bin/python3
3341
k3s_cluster_name: cluster1
34-
mls03:
35-
ansible_host: 192.168.5.80
42+
labels:
43+
is_vm: true
44+
continuumLayer: node
45+
vaccel: "false"
46+
testvm03:
47+
ansible_host: 192.168.5.79
3648
ansible_user: mlsysops
3749
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
3850
ansible_python_interpreter: /usr/bin/python3
3951
k3s_cluster_name: cluster1
40-
# cluster2:
41-
# children:
42-
# master_nodes:
43-
# hosts:
44-
# mls04:
45-
# ansible_host: 192.168.5.56
46-
# ansible_user: mlsysops
47-
# ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
48-
# ansible_python_interpreter: /usr/bin/python3
49-
# k3s_cluster_name: cluster2
50-
# pod_cidr: "10.14.0.0/16"
51-
# service_cidr: "10.15.0.0/16"
52-
#worker_nodes:
53-
# hosts: {}
52+
labels:
53+
is_vm: true
54+
continuumLayer: node
55+
vaccel: "false"
56+
cluster2:
57+
children:
58+
master_nodes:
59+
hosts:
60+
testvm04:
61+
ansible_host: 192.168.5.41
62+
ansible_user: mlsysops
63+
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
64+
ansible_python_interpreter: /usr/bin/python3
65+
k3s_cluster_name: cluster2
66+
pod_cidr: "10.14.0.0/16"
67+
service_cidr: "10.15.0.0/16"
68+
labels:
69+
is_vm: true
70+
continuumLayer: cluster
71+
vaccel: "false"
72+
worker_nodes:
73+
hosts:
74+
testvm05:
75+
ansible_host: 192.168.5.29
76+
ansible_user: mlsysops
77+
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
78+
ansible_python_interpreter: /usr/bin/python3
79+
k3s_cluster_name: cluster2
80+
labels:
81+
is_vm: true
82+
continuumLayer: node
83+
vaccel: "false"
84+
cluster3:
85+
children:
86+
master_nodes:
87+
hosts:
88+
testvm06:
89+
ansible_host: 192.168.5.9
90+
ansible_user: mlsysops
91+
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
92+
ansible_python_interpreter: /usr/bin/python3
93+
k3s_cluster_name: test1
94+
pod_cidr: "10.14.0.0/16"
95+
service_cidr: "10.15.0.0/16"
96+
labels:
97+
is_vm: true
98+
continuumLayer: cluster
99+
vaccel: "false"
100+
worker_nodes:
101+
hosts:
102+
testvm07:
103+
ansible_host: 192.168.5.63
104+
ansible_user: mlsysops
105+
ansible_ssh_private_key_file: /home/mlsysops/.ssh/id_rsa
106+
ansible_python_interpreter: /usr/bin/python3
107+
k3s_cluster_name: test1
108+
labels:
109+
is_vm: true
110+
continuumLayer: node
111+
vaccel: "false"

orchestrators/k3s-install.yml

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@
2121
update_cache: true
2222

2323
- name: Install k3s on master nodes
24-
shell: >
25-
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION={{ k3s_version }} sh -s - server
26-
--cluster-cidr={{ hostvars[inventory_hostname].pod_cidr }}
27-
--service-cidr={{ hostvars[inventory_hostname].service_cidr }}
28-
--node-ip {{ ansible_host }}
24+
shell: |
25+
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION={{ k3s_version }} sh -s - server \
26+
--cluster-cidr={{ hostvars[inventory_hostname].pod_cidr }} \
27+
--service-cidr={{ hostvars[inventory_hostname].service_cidr }} \
28+
--node-ip {{ ansible_host }} \
29+
{%- for item in labels | dict2items %}
30+
--node-label {{ item.key }}={{ item.value }} \
31+
{%- endfor %}
32+
2933
args:
3034
when: inventory_hostname in groups['master_nodes'] or 'management_cluster' in group_names
3135

@@ -36,12 +40,14 @@
3640
when: inventory_hostname in groups['master_nodes'] or 'management_cluster' in group_names
3741

3842
- name: Install k3s on worker nodes
39-
shell: >
40-
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION={{ k3s_version }} sh -s - agent
41-
--server https://{{ hostvars[groups['master_nodes'][0]]['ansible_host'] }}:6443
42-
--token {{ hostvars[groups['master_nodes'][0]]['node_token']['content'] | b64decode | trim }}
43-
--node-ip {{ ansible_host }}
43+
shell: |
44+
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION={{ k3s_version }} sh -s - agent \
45+
--server https://{{ (groups['master_nodes'] | map('extract', hostvars) | selectattr('k3s_cluster_name', 'eq', k3s_cluster_name) | first).ansible_host }}:6443 \
46+
--token {{ (groups['master_nodes'] | map('extract', hostvars) | selectattr('k3s_cluster_name', 'eq', k3s_cluster_name) | first).node_token['content'] | b64decode | trim }} \
47+
--node-ip {{ ansible_host }} \
48+
{% for item in labels | dict2items %}--node-label {{ item.key }}={{ item.value }} {% endfor %}
4449
args:
50+
executable: /bin/bash
4551
when: inventory_hostname in groups['worker_nodes']
4652

4753
- name: Ensure k3s config is readable

orchestrators/karmada-install.yml

Lines changed: 100 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
become: yes
66
become_user: root
77
become_method: sudo
8+
vars:
9+
kubeconfig_dir: "/home/{{ ansible_user }}/kubeconfigs"
810

911
tasks:
1012
- name: Fetch kubeconfig from cluster master nodes
1113
ansible.builtin.fetch:
1214
src: "/etc/rancher/k3s/k3s.yaml"
13-
dest: "/tmp/{{ inventory_hostname }}-k3s.yaml"
15+
dest: "{{kubeconfig_dir}}/{{ inventory_hostname }}-k3s.yaml"
1416
flat: yes
1517
when: inventory_hostname in groups['master_nodes']
1618

@@ -20,25 +22,29 @@
2022
become_user: root
2123
become_method: sudo
2224
gather_facts: no
25+
vars:
26+
kubeconfig_dir: "/home/{{ ansible_user }}/kubeconfigs"
2327

2428
tasks:
2529
- name: Ensure temporary directory exists
2630
ansible.builtin.file:
27-
path: /tmp/kubeconfigs
31+
path: "{{ kubeconfig_dir }}"
2832
state: directory
33+
owner: "{{ ansible_user }}"
34+
group: "{{ ansible_user }}"
2935
mode: '0755'
3036

3137
- name: Copy fetched kubeconfig to management vm
3238
ansible.builtin.copy:
33-
src: "/tmp/{{ item }}-k3s.yaml"
34-
dest: "/tmp/kubeconfigs/{{ item }}-k3s.yaml"
39+
src: "{{ kubeconfig_dir }}/{{ item }}-k3s.yaml"
40+
dest: "{{ kubeconfig_dir }}/{{ item }}-k3s.yaml"
3541
mode: '0644'
3642
loop: "{{ groups['master_nodes'] }}"
3743

3844
- name: Adjust kubeconfig server address for cluster master nodes
3945
ansible.builtin.replace:
40-
path: "/tmp/kubeconfigs/{{ item }}-k3s.yaml"
41-
regexp: '127.0.0.1'
46+
path: "{{ kubeconfig_dir }}/{{ item }}-k3s.yaml"
47+
regexp: '127\.0\.0\.1'
4248
replace: "{{ hostvars[item]['ansible_host'] }}"
4349
loop: "{{ groups['master_nodes'] }}"
4450

@@ -51,11 +57,20 @@
5157
managementvm_ip: "{{ hostvars[inventory_hostname]['ansible_host'] }}"
5258
managementvm_hostname: "{{ inventory_hostname }}"
5359
karmada_apiserver_nodeport: 32443
60+
kubeconfig_dir: "/home/{{ ansible_user }}/kubeconfigs"
5461

5562
tasks:
5663
- name: Gathering Facts
5764
ansible.builtin.setup:
5865

66+
- name: Ensure working directory exists
67+
file:
68+
path: "/home/{{ ansible_user }}/mlsysopsansible"
69+
state: directory
70+
owner: "{{ ansible_user }}"
71+
group: "{{ ansible_user }}"
72+
mode: '0755'
73+
5974
- name: Create values.yml
6075
ansible.builtin.copy:
6176
dest: "/home/{{ ansible_user }}/mlsysopsansible/values.yml"
@@ -200,6 +215,7 @@
200215
karmada_config: "/home/{{ ansible_user }}/karmada-kubeconfig.yaml"
201216
managementvm_ip: "{{ hostvars[inventory_hostname]['ansible_host'] }}"
202217
karmada_apiserver_nodeport: 32644
218+
kubeconfig_dir: "/home/{{ ansible_user }}/kubeconfigs"
203219

204220
tasks:
205221
- name: Patch Karmada API server service to NodePort
@@ -224,7 +240,7 @@
224240
become: yes
225241
vars:
226242
karmada_config: "/home/{{ ansible_user }}/karmada-kubeconfig.yaml"
227-
243+
kubeconfig_dir: "/home/{{ ansible_user }}/kubeconfigs"
228244
tasks:
229245
- name: Get list of all clusters
230246
ansible.builtin.set_fact:
@@ -258,7 +274,7 @@
258274
ansible.builtin.command: |
259275
karmadactl join {{ item }} \
260276
--kubeconfig {{ karmada_config }} \
261-
--cluster-kubeconfig /tmp/kubeconfigs/{{ cluster_masters[item] }}-k3s.yaml
277+
--cluster-kubeconfig {{ kubeconfig_dir }}/{{ cluster_masters[item] }}-k3s.yaml
262278
loop: "{{ cluster_list }}"
263279
register: join_clusters
264280
failed_when: join_clusters.rc != 0
@@ -274,3 +290,79 @@
274290
- name: Debug Karmada clusters
275291
debug:
276292
var: karmada_clusters.stdout
293+
294+
- name: Merge kubeconfig files into Karmada config
295+
hosts: management_cluster
296+
become: yes
297+
become_user: root
298+
become_method: sudo
299+
vars:
300+
karmada_config: "/home/{{ ansible_user }}/karmada-kubeconfig.yaml"
301+
kubeconfig_dir: "/home/{{ ansible_user }}/kubeconfigs"
302+
temp_dir: "/tmp/kubeconfigs"
303+
304+
tasks:
305+
- name: Ensure temporary directory exists
306+
ansible.builtin.file:
307+
path: "{{ temp_dir }}"
308+
state: directory
309+
mode: '0755'
310+
311+
- name: Find all cluster kubeconfig files
312+
ansible.builtin.find:
313+
paths: "{{ kubeconfig_dir }}"
314+
patterns: "*-k3s.yaml"
315+
register: found_configs
316+
317+
- name: Copy kubeconfigs to temporary directory
318+
ansible.builtin.copy:
319+
src: "{{ item.path }}"
320+
dest: "{{ temp_dir }}/{{ item.path | basename }}"
321+
remote_src: yes
322+
mode: '0644'
323+
loop: "{{ found_configs.files }}"
324+
when: found_configs.files | length > 0
325+
326+
- name: Normalize context and cluster names in temporary kubeconfigs
327+
ansible.builtin.shell: |
328+
name={{ item.path | basename | regex_replace('-k3s.yaml','') }}
329+
330+
kubectl --kubeconfig={{ temp_dir }}/{{ item.path | basename }} config rename-context default ${name} || true
331+
332+
sed -i "s/name: default/name: ${name}/" {{ temp_dir }}/{{ item.path | basename }}
333+
sed -i "s/cluster: default/cluster: ${name}/" {{ temp_dir }}/{{ item.path | basename }}
334+
args:
335+
executable: /bin/bash
336+
loop: "{{ found_configs.files }}"
337+
when: found_configs.files | length > 0
338+
339+
- name: Merge all kubeconfigs into Karmada config
340+
ansible.builtin.shell: |
341+
export KUBECONFIG=$(find {{ temp_dir }} -name '*-k3s.yaml' | tr '\n' ':' | sed 's/:$//'):{{ karmada_config }}
342+
kubectl config view --flatten > /tmp/merged-karmada.yaml
343+
args:
344+
executable: /bin/bash
345+
when: found_configs.files | length > 0
346+
347+
- name: Validate merged kubeconfig
348+
ansible.builtin.shell: |
349+
kubectl --kubeconfig=/tmp/merged-karmada.yaml config view
350+
register: validate_result
351+
failed_when: validate_result.rc != 0
352+
when: found_configs.files | length > 0
353+
354+
- name: Replace original Karmada config with merged one
355+
ansible.builtin.copy:
356+
src: "/tmp/merged-karmada.yaml"
357+
remote_src: yes
358+
dest: "{{ karmada_config }}"
359+
owner: "{{ ansible_user }}"
360+
group: "{{ ansible_user }}"
361+
mode: '0600'
362+
when: found_configs.files | length > 0 and validate_result.rc == 0
363+
364+
- name: Clean up temporary files and directory
365+
ansible.builtin.file:
366+
path: "{{ temp_dir }}"
367+
state: absent
368+
when: found_configs.files | length > 0

0 commit comments

Comments
 (0)