From dc2976e7f69d4f5560e20911f26903d02ef8fe30 Mon Sep 17 00:00:00 2001 From: Mike Thomas Date: Fri, 10 Feb 2023 06:58:58 +0100 Subject: [PATCH] Metallb BGP support (#212) * Add metallb frr and bgp support * Set metallb mode to layer2 as default in sample * Add BGP resource check * Add automatic downloading of metallb-frr * Remove frr manifest --- inventory/sample/group_vars/all.yml | 12 ++++++++++++ roles/k3s/master/tasks/metallb.yml | 25 +++++++++++++++++++++++-- roles/k3s/post/tasks/metallb.yml | 14 +++++++++++++- roles/k3s/post/templates/metallb.crs.j2 | 22 ++++++++++++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/inventory/sample/group_vars/all.yml b/inventory/sample/group_vars/all.yml index 8815a59..4e2bfcd 100644 --- a/inventory/sample/group_vars/all.yml +++ b/inventory/sample/group_vars/all.yml @@ -43,7 +43,19 @@ extra_agent_args: >- # image tag for kube-vip kube_vip_tag_version: "v0.5.7" +# metallb type frr or native +metal_lb_type: "native" + +# metallb mode layer2 or bgp +metal_lb_mode: "layer2" + +# bgp options +# metal_lb_bgp_my_asn: "64513" +# metal_lb_bgp_peer_asn: "64512" +# metal_lb_bgp_peer_address: "192.168.30.1" + # image tag for metal lb +metal_lb_frr_tag_version: "v7.5.1" metal_lb_speaker_tag_version: "v0.13.7" metal_lb_controller_tag_version: "v0.13.7" diff --git a/roles/k3s/master/tasks/metallb.yml b/roles/k3s/master/tasks/metallb.yml index 24950dd..fa1089f 100644 --- a/roles/k3s/master/tasks/metallb.yml +++ b/roles/k3s/master/tasks/metallb.yml @@ -15,7 +15,16 @@ owner: root group: root mode: 0644 - when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname'] + when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname'] and metal_lb_type == "native" + +- name: Download metallb-frr manifest to first master + ansible.builtin.get_url: + url: "https://raw.githubusercontent.com/metallb/metallb/{{ metal_lb_controller_tag_version }}/config/manifests/metallb-frr.yaml" # noqa yaml[line-length] + dest: "/var/lib/rancher/k3s/server/manifests/metallb-frr-crds.yaml" + owner: root + group: root + mode: 0644 + when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname'] and metal_lb_type == "frr" - name: Set image versions for metallb manifest ansible.builtin.replace: @@ -27,4 +36,16 @@ to: "metallb/speaker:{{ metal_lb_speaker_tag_version }}" loop_control: label: "{{ item.change }} => {{ item.to }}" - when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname'] + when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname'] and metal_lb_type == "native" + +- name: Set image versions for metallb-frr manifest + ansible.builtin.replace: + path: "/var/lib/rancher/k3s/server/manifests/metallb-frr-crds.yaml" + regexp: "{{ item.change | ansible.builtin.regex_escape }}" + replace: "{{ item.to }}" + with_items: + - change: "metallb/speaker:{{ metal_lb_controller_tag_version }}" + to: "metallb/speaker:{{ metal_lb_speaker_tag_version }}" + loop_control: + label: "{{ item.change }} => {{ item.to }}" + when: ansible_hostname == hostvars[groups['master'][0]]['ansible_hostname'] and metal_lb_type == "frr" diff --git a/roles/k3s/post/tasks/metallb.yml b/roles/k3s/post/tasks/metallb.yml index df3455b..9a6454e 100644 --- a/roles/k3s/post/tasks/metallb.yml +++ b/roles/k3s/post/tasks/metallb.yml @@ -79,11 +79,23 @@ until: this.rc == 0 retries: 5 -- name: Test metallb-system resources +- name: Test metallb-system resources for Layer 2 configuration command: >- k3s kubectl -n metallb-system get {{ item }} changed_when: false run_once: true + when: metal_lb_mode == "layer2" with_items: - IPAddressPool - L2Advertisement + +- name: Test metallb-system resources for BGP configuration + command: >- + k3s kubectl -n metallb-system get {{ item }} + changed_when: false + run_once: true + when: metal_lb_mode == "bgp" + with_items: + - IPAddressPool + - BGPPeer + - BGPAdvertisement diff --git a/roles/k3s/post/templates/metallb.crs.j2 b/roles/k3s/post/templates/metallb.crs.j2 index 6b6b0af..562f561 100644 --- a/roles/k3s/post/templates/metallb.crs.j2 +++ b/roles/k3s/post/templates/metallb.crs.j2 @@ -13,9 +13,31 @@ spec: {% for range in metal_lb_ip_range %} - {{ range }} {% endfor %} + +{% if metal_lb_mode == "layer2" %} --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default namespace: metallb-system +{% endif %} +{% if metal_lb_mode == "bgp" %} +--- +apiVersion: metallb.io/v1beta2 +kind: BGPPeer +metadata: + name: default + namespace: metallb-system +spec: + myASN: {{ metal_lb_bgp_my_asn }} + peerASN: {{ metal_lb_bgp_peer_asn }} + peerAddress: {{ metal_lb_bgp_peer_address }} + +--- +apiVersion: metallb.io/v1beta1 +kind: BGPAdvertisement +metadata: + name: default + namespace: metallb-system +{% endif %}