From 1188bdc8d852ab331c8d51e08d4815e94b47915a Mon Sep 17 00:00:00 2001 From: eaudetcobello <155978570+eaudetcobello@users.noreply.github.com> Date: Tue, 25 Jun 2024 08:16:14 -0400 Subject: [PATCH] Support MetalLB (#466) * Add metallb chart * make ck-loadbalancer chart work with cilium or metallb * implement metallb feature * moonray use metallb --------- Co-authored-by: Angelos Kolaitis --- .../hack/update-component-versions.py | 19 ++- build-scripts/hack/util.py | 1 + .../templates/{ => cilium}/bgp-policy.yaml | 6 +- .../templates/{ => cilium}/l2-policy.yaml | 4 + .../templates/{ => cilium}/lb-ip-pool.yaml | 4 + .../templates/metallb/bgp-policy.yaml | 31 ++++ .../templates/metallb/l2-policy.yaml | 19 +++ .../templates/metallb/lb-ip-pool.yaml | 19 +++ .../charts/ck-loadbalancer/values.yaml | 1 + k8s/manifests/charts/metallb-0.14.5.tgz | Bin 0 -> 39903 bytes .../pkg/k8sd/features/cilium/loadbalancer.go | 1 + .../k8sd/features/implementation_moonray.go | 4 +- src/k8s/pkg/k8sd/features/metallb/chart.go | 41 +++++ .../pkg/k8sd/features/metallb/loadbalancer.go | 154 ++++++++++++++++++ src/k8s/pkg/k8sd/features/metallb/register.go | 15 ++ 15 files changed, 315 insertions(+), 4 deletions(-) rename k8s/manifests/charts/ck-loadbalancer/templates/{ => cilium}/bgp-policy.yaml (84%) rename k8s/manifests/charts/ck-loadbalancer/templates/{ => cilium}/l2-policy.yaml (87%) rename k8s/manifests/charts/ck-loadbalancer/templates/{ => cilium}/lb-ip-pool.yaml (86%) create mode 100644 k8s/manifests/charts/ck-loadbalancer/templates/metallb/bgp-policy.yaml create mode 100644 k8s/manifests/charts/ck-loadbalancer/templates/metallb/l2-policy.yaml create mode 100644 k8s/manifests/charts/ck-loadbalancer/templates/metallb/lb-ip-pool.yaml create mode 100644 k8s/manifests/charts/metallb-0.14.5.tgz create mode 100644 src/k8s/pkg/k8sd/features/metallb/chart.go create mode 100644 src/k8s/pkg/k8sd/features/metallb/loadbalancer.go create mode 100644 src/k8s/pkg/k8sd/features/metallb/register.go diff --git a/build-scripts/hack/update-component-versions.py b/build-scripts/hack/update-component-versions.py index 21c3d865e..7dba88081 100755 --- a/build-scripts/hack/update-component-versions.py +++ b/build-scripts/hack/update-component-versions.py @@ -41,6 +41,11 @@ CONTOUR_HELM_REPO = "https://charts.bitnami.com/bitnami" CONTOUR_CHART_VERSION = "17.0.4" +# MetalLB Helm repository and chart version +METALLB_REPO = "https://metallb.github.io/metallb" +METALLB_CHART_VERSION = "0.14.5" + + def get_kubernetes_version() -> str: """Update Kubernetes version based on the specified marker file""" LOG.info("Checking latest Kubernetes version from %s", KUBERNETES_VERSION_MARKER) @@ -63,10 +68,16 @@ def get_cni_version() -> str: raise Exception(f"Failed to find cni dependency in {deps_file}") + def pull_contour_chart() -> None: - LOG.info("Pulling Contour Helm chart from %s with version %s", CONTOUR_HELM_REPO, CONTOUR_CHART_VERSION) + LOG.info( + "Pulling Contour Helm chart from %s with version %s", + CONTOUR_HELM_REPO, + CONTOUR_CHART_VERSION, + ) util.helm_pull("contour", CONTOUR_HELM_REPO, CONTOUR_CHART_VERSION, CHARTS) + def get_containerd_version() -> str: """Update containerd version using latest tag of specified branch""" containerd_repo = util.read_file(COMPONENTS / "containerd/repository") @@ -93,6 +104,11 @@ def get_helm_version() -> str: return util.parse_output(["git", "describe", "--tags", "--abbrev=0"], cwd=dir) +def pull_metallb_chart() -> None: + LOG.info("Pulling MetalLB chart @ %s", METALLB_CHART_VERSION) + util.helm_pull("metallb", METALLB_REPO, METALLB_CHART_VERSION, CHARTS) + + def update_component_versions(dry_run: bool): for component, get_version in [ ("kubernetes", get_kubernetes_version), @@ -110,6 +126,7 @@ def update_component_versions(dry_run: bool): for component, pull_helm_chart in [ ("bitnami/contour", pull_contour_chart), + ("metallb", pull_metallb_chart), ]: LOG.info("Updating chart for %s", component) if not dry_run: diff --git a/build-scripts/hack/util.py b/build-scripts/hack/util.py index 090f1d4f4..05bc961eb 100644 --- a/build-scripts/hack/util.py +++ b/build-scripts/hack/util.py @@ -49,6 +49,7 @@ def read_file(path: Path) -> str: def read_url(url: str) -> str: return urlopen(url).read().decode().strip() + def helm_pull(chart, repo_url: str, version: str, destination: Path) -> None: parse_output( [ diff --git a/k8s/manifests/charts/ck-loadbalancer/templates/bgp-policy.yaml b/k8s/manifests/charts/ck-loadbalancer/templates/cilium/bgp-policy.yaml similarity index 84% rename from k8s/manifests/charts/ck-loadbalancer/templates/bgp-policy.yaml rename to k8s/manifests/charts/ck-loadbalancer/templates/cilium/bgp-policy.yaml index 94e31921b..3affe934c 100644 --- a/k8s/manifests/charts/ck-loadbalancer/templates/bgp-policy.yaml +++ b/k8s/manifests/charts/ck-loadbalancer/templates/cilium/bgp-policy.yaml @@ -1,4 +1,6 @@ -{{- if .Values.bgp.enabled }} +{{- if (eq .Values.driver "cilium") }} +{{- if (.Values.bgp.enabled) }} + apiVersion: "cilium.io/v2alpha1" kind: CiliumBGPPeeringPolicy metadata: @@ -15,4 +17,6 @@ spec: neighbors: {{- toYaml . | nindent 4 }} {{- end }} + +{{- end}} {{- end}} diff --git a/k8s/manifests/charts/ck-loadbalancer/templates/l2-policy.yaml b/k8s/manifests/charts/ck-loadbalancer/templates/cilium/l2-policy.yaml similarity index 87% rename from k8s/manifests/charts/ck-loadbalancer/templates/l2-policy.yaml rename to k8s/manifests/charts/ck-loadbalancer/templates/cilium/l2-policy.yaml index 3a0862ca9..7540cd866 100644 --- a/k8s/manifests/charts/ck-loadbalancer/templates/l2-policy.yaml +++ b/k8s/manifests/charts/ck-loadbalancer/templates/cilium/l2-policy.yaml @@ -1,4 +1,6 @@ +{{- if (eq .Values.driver "cilium") }} {{- if .Values.l2.enabled }} + apiVersion: "cilium.io/v2alpha1" kind: CiliumL2AnnouncementPolicy metadata: @@ -12,4 +14,6 @@ spec: {{- end }} externalIPs: true loadBalancerIPs: true + +{{- end }} {{- end }} diff --git a/k8s/manifests/charts/ck-loadbalancer/templates/lb-ip-pool.yaml b/k8s/manifests/charts/ck-loadbalancer/templates/cilium/lb-ip-pool.yaml similarity index 86% rename from k8s/manifests/charts/ck-loadbalancer/templates/lb-ip-pool.yaml rename to k8s/manifests/charts/ck-loadbalancer/templates/cilium/lb-ip-pool.yaml index 044512b55..a5d2190a3 100644 --- a/k8s/manifests/charts/ck-loadbalancer/templates/lb-ip-pool.yaml +++ b/k8s/manifests/charts/ck-loadbalancer/templates/cilium/lb-ip-pool.yaml @@ -1,4 +1,6 @@ +{{- if (eq .Values.driver "cilium") }} {{- if .Values.ipPool.cidrs }} + apiVersion: "cilium.io/v2alpha1" kind: CiliumLoadBalancerIPPool metadata: @@ -10,4 +12,6 @@ spec: blocks: {{- toYaml . | nindent 4 }} {{- end }} + +{{- end }} {{- end }} diff --git a/k8s/manifests/charts/ck-loadbalancer/templates/metallb/bgp-policy.yaml b/k8s/manifests/charts/ck-loadbalancer/templates/metallb/bgp-policy.yaml new file mode 100644 index 000000000..f85027230 --- /dev/null +++ b/k8s/manifests/charts/ck-loadbalancer/templates/metallb/bgp-policy.yaml @@ -0,0 +1,31 @@ +{{- if (eq .Values.driver "metallb") }} +{{- if .Values.bgp.enabled }} + +apiVersion: "metallb.io/v1beta2" +kind: BGPPeer +metadata: + name: {{ include "ck-loadbalancer.fullname" . }} + labels: + {{- include "ck-loadbalancer.labels" . | nindent 4 }} +spec: + myASN: {{ .Values.bgp.localASN }} + {{- with (index .Values.bgp.neighbors 0) }} + peerASN: {{ .peerASN }} + peerAddress: {{ .peerAddress }} + peerPort: {{ .peerPort }} + {{- end }} + +--- + +apiVersion: "metallb.io/v1beta1" +kind: BGPAdvertisement +metadata: + name: {{ include "ck-loadbalancer.fullname" . }} + labels: + {{- include "ck-loadbalancer.labels" . | nindent 4 }} +spec: + ipAddressPools: + - {{ include "ck-loadbalancer.fullname" . }} + +{{- end }} +{{- end}} diff --git a/k8s/manifests/charts/ck-loadbalancer/templates/metallb/l2-policy.yaml b/k8s/manifests/charts/ck-loadbalancer/templates/metallb/l2-policy.yaml new file mode 100644 index 000000000..b97bfd4ad --- /dev/null +++ b/k8s/manifests/charts/ck-loadbalancer/templates/metallb/l2-policy.yaml @@ -0,0 +1,19 @@ +{{- if (eq .Values.driver "metallb") -}} +{{- if .Values.l2.enabled }} + +apiVersion: "metallb.io/v1beta1" +kind: L2Advertisement +metadata: + name: {{ include "ck-loadbalancer.fullname" . }} + labels: + {{- include "ck-loadbalancer.labels" . | nindent 4 }} +spec: + ipAddressPools: + - {{ include "ck-loadbalancer.fullname" . }} + {{- with .Values.l2.interfaces }} + interfaces: + {{- toYaml . | nindent 4 }} + {{- end }} + +{{- end }} +{{- end }} diff --git a/k8s/manifests/charts/ck-loadbalancer/templates/metallb/lb-ip-pool.yaml b/k8s/manifests/charts/ck-loadbalancer/templates/metallb/lb-ip-pool.yaml new file mode 100644 index 000000000..c5a18df7a --- /dev/null +++ b/k8s/manifests/charts/ck-loadbalancer/templates/metallb/lb-ip-pool.yaml @@ -0,0 +1,19 @@ +{{ if (eq .Values.driver "metallb") }} +{{ if .Values.ipPool.cidrs }} +apiVersion: "metallb.io/v1beta1" +kind: IPAddressPool +metadata: + name: {{ include "ck-loadbalancer.fullname" . }} + labels: + {{- include "ck-loadbalancer.labels" . | nindent 4 }} +spec: + addresses: + {{- range .Values.ipPool.cidrs }} + {{- if .cidr }} + - {{ .cidr }} + {{- else if and .start .stop }} + - {{ printf "%s-%s" .start .stop }} + {{ end }} + {{ end }} +{{ end }} +{{ end }} diff --git a/k8s/manifests/charts/ck-loadbalancer/values.yaml b/k8s/manifests/charts/ck-loadbalancer/values.yaml index a9bdafa96..e1a9eef69 100644 --- a/k8s/manifests/charts/ck-loadbalancer/values.yaml +++ b/k8s/manifests/charts/ck-loadbalancer/values.yaml @@ -1,3 +1,4 @@ +driver: l2: enabled: true diff --git a/k8s/manifests/charts/metallb-0.14.5.tgz b/k8s/manifests/charts/metallb-0.14.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c3784619149ab9c85d7c480eb93b40ab51f5a9bd GIT binary patch literal 39903 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