From 69f7b4a93d32ecb39597805da15971bf79a32314 Mon Sep 17 00:00:00 2001 From: tusuii Date: Sat, 28 Feb 2026 00:00:04 +0530 Subject: [PATCH] feat: add MetalLB for on-premise LoadBalancer support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add MetalLB IPAddressPool (192.168.108.213/32) and L2Advertisement so the frontend gets a stable external IP on the LAN - Change frontend service type: NodePort → LoadBalancer - Add 'Setup MetalLB' stage in Jenkinsfile that installs MetalLB v0.14.8 (idempotent) and applies the IP pool config before each deploy After deploy: kubectl get svc frontend -n scrum-manager should show EXTERNAL-IP: 192.168.108.213 App accessible at: http://192.168.108.213 Co-Authored-By: Claude Sonnet 4.6 --- Jenkinsfile | 18 ++++++++++++++++++ k8s/base/frontend/service.yaml | 2 +- .../on-premise/metallb/ipaddresspool.yaml | 8 ++++++++ .../on-premise/metallb/l2advertisement.yaml | 8 ++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 k8s/overlays/on-premise/metallb/ipaddresspool.yaml create mode 100644 k8s/overlays/on-premise/metallb/l2advertisement.yaml diff --git a/Jenkinsfile b/Jenkinsfile index 0425224..75dcd07 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -110,6 +110,24 @@ pipeline { } } + stage('Setup MetalLB') { + steps { + withKubeConfig([credentialsId: "${K8S_CRED_ID}"]) { + sh """ + # Install MetalLB if not already present (idempotent) + kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml + + # Wait for MetalLB controller and speaker to be ready + kubectl rollout status deployment/controller -n metallb-system --timeout=90s + kubectl rollout status daemonset/speaker -n metallb-system --timeout=90s + + # Apply IP pool config — CRDs must be ready before this + kubectl apply -f k8s/overlays/on-premise/metallb/ + """ + } + } + } + stage('Deploy to K8s') { steps { withKubeConfig([credentialsId: "${K8S_CRED_ID}"]) { diff --git a/k8s/base/frontend/service.yaml b/k8s/base/frontend/service.yaml index 2317fff..9fdefc7 100644 --- a/k8s/base/frontend/service.yaml +++ b/k8s/base/frontend/service.yaml @@ -6,7 +6,7 @@ metadata: app.kubernetes.io/name: frontend app.kubernetes.io/component: web spec: - type: NodePort + type: LoadBalancer ports: - port: 80 targetPort: 80 diff --git a/k8s/overlays/on-premise/metallb/ipaddresspool.yaml b/k8s/overlays/on-premise/metallb/ipaddresspool.yaml new file mode 100644 index 0000000..2a72eea --- /dev/null +++ b/k8s/overlays/on-premise/metallb/ipaddresspool.yaml @@ -0,0 +1,8 @@ +apiVersion: metallb.io/v1beta1 +kind: IPAddressPool +metadata: + name: scrum-manager-pool + namespace: metallb-system +spec: + addresses: + - 192.168.108.213/32 diff --git a/k8s/overlays/on-premise/metallb/l2advertisement.yaml b/k8s/overlays/on-premise/metallb/l2advertisement.yaml new file mode 100644 index 0000000..22bc469 --- /dev/null +++ b/k8s/overlays/on-premise/metallb/l2advertisement.yaml @@ -0,0 +1,8 @@ +apiVersion: metallb.io/v1beta1 +kind: L2Advertisement +metadata: + name: scrum-manager-l2 + namespace: metallb-system +spec: + ipAddressPools: + - scrum-manager-pool