Out of the box, the MicroK8s distribution of ingress-nginx installed as the MicroK8s addon ingress binds to ports 80+443 on the node's IP address using a hostPort, as we can see here:
microk8s kubectl -n ingress describe daemonset.apps/nginx-ingress-microk8s-controller
Name: nginx-ingress-microk8s-controller
Selector: name=nginx-ingress-microk8s
Node-Selector: <none>
Labels: microk8s-application=nginx-ingress-microk8s
Annotations: deprecated.daemonset.template.generation: 1
Desired Number of Nodes Scheduled: 4
Current Number of Nodes Scheduled: 4
Number of Nodes Scheduled with Up-to-date Pods: 4
Number of Nodes Scheduled with Available Pods: 4
Number of Nodes Misscheduled: 0
Pods Status: 4 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: name=nginx-ingress-microk8s
Service Account: nginx-ingress-microk8s-serviceaccount
Containers:
nginx-ingress-microk8s:
Image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller-amd64:0.25.1
Ports: 80/TCP, 443/TCP
Host Ports: 80/TCP, 443/TCP
Args:
/nginx-ingress-controller
--configmap=$(POD_NAMESPACE)/nginx-load-balancer-microk8s-conf
--publish-status-address=127.0.0.1
Liveness: http-get http://:10254/healthz delay=30s timeout=5s period=10s #success=1 #failure=3
Environment:
POD_NAME: (v1:metadata.name)
POD_NAMESPACE: (v1:metadata.namespace)
Mounts: <none>
Volumes: <none>
Events: <none>
This is fine for a single-node deployment, but now MicroK8s supports HA clustering we need to find a way of load-balancing our Ingress, as a multi-node cluster will have one Ingress controller per node, each bound to its own node's IP.
Enter MetalLB, a software load-balancer which works well in layer2 mode, which is also available as a MicroK8s addon metallb. We can use MetalLB to load-balance between the ingress controllers.
There's one snag though, MetalLB requires a Service resource, and the MicroK8s distribution of Ingress does not include one.
microk8s kubectl -n ingress get svc
No resources found in ingress namespace.
This gist contains the definition for a Service which should work with default deployments of the MicroK8s addons Ingress and MetalLB. It assumes that both of these addons are already enabled.
microk8s enable ingress metallb
Download this manifest ingress-service.yaml
and apply it with:
microk8s kubectl apply -f ingress-service.yaml
Now there is a load-balancer which listens on an arbitrary IP and directs traffic towards one of the listening ingress controllers.
microk8s kubectl -n ingress get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress LoadBalancer 10.152.183.141 192.168.0.61 80:30029/TCP,443:30276/TCP 24h
Hey @KlimDos. Do you mean the ingress is still available on the node's IP on ports 80+443, or a high port?
This is how my config looks right now. I just tested and I can get to my ingress on 80+443 on the MetalLB IP
192.168.0.61
and on the node IP192.168.0.49
, so it's behaving the same as yours. Can confirm my nodes are still listening on 80+443 themselves:To be honest I don't know how or why it is doing this, whether it's a necessary part of how Kubernetes/MetalLB works, but if it's a problem in your environment, you could solve it with host firewalling. Delete the global firewall rules for 80+443, and create IP-specific firewall rules for the MetalLB IP.