Your Kubernetes cluster is monitoring, meshing, and looking good—but let’s be honest, it’s a little isolated. In this part, we’ll roll out the red carpet for external traffic with ingress, then sprinkle on some load-balancing magic with MetalLB. Why? Because nothing says “production-ready” like an open (yet secure) path for requests. Let’s get into the good stuff!
Install Ingress-Nginx Controller
Again we will use helm to install ingress-nginx
helm upgrade --install ingress-nginx ingress-nginx \ --repo https://kubernetes.github.io/ingress-nginx \ --set controller.kind=DaemonSet \ --namespace ingress-nginx --create-namespaceInject linkerd if you want to
kubectl get ds ingress-nginx-controller -o yaml -n ingress-nginx | \linkerd inject --ingress - | kubectl apply -f -Setting up MetalLB for Loading Balancing
Because we install k8s cluster on bare-metal servers (VMs, local servers), not in cloud providers (aws, azure, gce, ...), we need a solution for load balancing that isn’t built into the infrastructure.
will step in to offer the crucial IP address management we need to expose services to the outside world. In this section, we’ll configure MetalLB, set up IP pools, and connect it to our ingress controller so we can finally let external traffic in with style and stability.
First we need to enable strict ARP mode
kubectl get configmap kube-proxy -n kube-system -o yaml | \sed -e "s/strictARP: false/strictARP: true/" | \kubectl diff -f - -n kube-systemkubectl get configmap kube-proxy -n kube-system -o yaml | \sed -e "s/strictARP: false/strictARP: true/" | \kubectl apply -f - -n kube-systemThen install it using helm
helm repo add metallb https://metallb.github.io/metallbhelm install metallb metallb/metallb --namespace metallb-system --create-namespaceConfigure the metallb
---apiVersion: metallb.io/v1beta1kind: IPAddressPoolmetadata: name: default namespace: metallb-systemspec: addresses: - 192.168.20.200-192.168.20.205 #<-- Change this to match with node ip range autoAssign: true---apiVersion: metallb.io/v1beta1kind: L2Advertisementmetadata: name: default namespace: metallb-systemspec: ipAddressPools: - defaultReplace line 9 in file ingress/metallb-config.yaml with your ip range (same range with your node ip and not use).
You can find the file above in ingress/ folder, create those objects by running this command
kubectl create -f ingress/metallb-config.yamlyou should see EXTERNAL-IP value for ingress-nginx-controller
kubectl get svc -n ingress-nginx
Testing
As you know in , we have to change grafana and linkerd service to NodePort so we can access it.
Now we create ingress rules for grafana and linkerd dashboard
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: prometheus-ingress annotations: nginx.ingress.kubernetes.io/service-upstream: "true" namespace: monitoringspec: ingressClassName: nginx rules: - host: dev.grafana.local http: paths: - backend: service: name: prometheus-grafana port: number: 80 path: / pathType: ImplementationSpecific - host: dev.prometheus.local http: paths: - backend: service: name: prometheus-kube-prometheus-prometheus port: number: 9090 path: / pathType: ImplementationSpecificstatus: loadBalancer: {}---apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: linkerd-ingress annotations: nginx.ingress.kubernetes.io/service-upstream: "true" namespace: linkerd-vizspec: ingressClassName: nginx rules: - host: dev.linkerd.local http: paths: - backend: service: name: web port: number: 8084 path: / pathType: ImplementationSpecificstatus: loadBalancer: {} kubectl create -f ingress/ingress-rules.yamlEdit hosts file (C:\WINDOWS\system32\drivers\etc\hosts in Windows, /etc/hosts in Linux)
EXTERNAL_IP dev.prometheus.local EXTERNAL_IP dev.grafana.local EXTERNAL_IP dev.linkerd.localEXTERNAL_IP can get from:
kubectl get svc -n ingress-nginxNow you can access Grafana in your local machine (same network with your cluster) using dev.grafana.local.

Conclusion
Congratulations—you’ve just added ingress and load balancing to your Kubernetes cluster! Now it’s accessible, load-ready, and almost pretending it’s a cloud-native rockstar. With ingress and MetalLB in place, your cluster can handle anything you (or a surprise spike in traffic) throw at it. Give yourself a high-five; your setup is ready for the big leagues (or at least to impress the team)!
And again you can find the script .