Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple ingress from host with microk8s?

Tags:

I would like to do two things with MicroK8s:

  1. Route the host machine (Ubuntu 18.04) ports 80/443 to Microk8s
  2. Use something like the simple ingress defined in the kubernetes.io docs

My end goal is to create a single node Kubernetes cluster that sits on the Ubuntu host, then using ingress to route different domains to their respective pods inside the service.

I've been attempting to do this with Microk8s for the past couple of days but can't wrap my head around it.

  • The best I've gotten so far is using MetalLB to create a load balancer. But this required me to use a free IP address available on my local network rather than the host machines IP address.

  • I've also enabled the default-http-backend and attempted to export and edit these config files with no success.

As an example this will work on Minikube once the ingress add on is enabled, This example shows the base Nginx server image at port 80 on the cluster IP:

# ingress-service.yaml  apiVersion: extensions/v1beta1 kind: Ingress metadata:   name: ingress-service   annotations:     kubernetes.io/ingress.class: nginx     nginx.ingress.kubernetes.io/rewrite-target: / spec:   rules:     # - host: nginx.ioo     - http:         paths:           - path: /             backend:               serviceName: nginx-cluster-ip-service               servicePort: 80 
# nginx-deployment.yaml  apiVersion: apps/v1 kind: Deployment metadata:   name: nginx-deployment spec:   replicas: 1   selector:     matchLabels:       component: nginx   template:     metadata:       labels:         component: nginx     spec:       containers:         - name: nginx           image: nginx           ports:             - containerPort: 80 
# nginx-cluster-ip-service  apiVersion: v1 kind: Service metadata:   name: nginx-cluster-ip-service spec:   type: ClusterIP   selector:     component: nginx   ports:     - port: 80       targetPort: 80 
like image 638
denski Avatar asked Feb 03 '19 18:02

denski


People also ask

Does ingress work with ClusterIP?

Ingress isn't a service type like NodePort, ClusterIP, or LoadBalancer. Ingress actually acts as a proxy to bring traffic into the cluster, then uses internal service routing to get the traffic where it is going.

Is Microk8s single node?

Managed by Canonical, Microk8s is a non-elastic, rails-based single-node Kubernetes tool that is focused primarily on offline development, prototyping, and testing.

Which ingress is used to route traffic from single IP to multiple services in Kubernetes?

Kubernetes ingress resources are used to configure the ingress rules and routes for individual Kubernetes services. Using an ingress controller and ingress rules, a single IP address can be used to route traffic to multiple services in a Kubernetes cluster.


2 Answers

TLDR

Update the annotation to be kubernetes.io/ingress.class: public

Why

For MicroK8s v1.21, running

microk8s enable ingress 

Will create a DaemonSet called nginx-ingress-microk8s-controller in the ingress namespace.

If you inspect that, there is a flag to set the ingress class:

      - args:         ... omitted ...          - --ingress-class=public         ... omitted ...  

Therefore in order to work with most examples online, you need to either

  1. Remove the --ingress-class=public argument so it defaults to nginx
  2. Update annotations like kubernetes.io/ingress.class: nginx to be kubernetes.io/ingress.class: public
like image 200
Justin W. Avatar answered Oct 14 '22 22:10

Justin W.


If I understood you correctly, there are a few ways you might be looking at.

One would be MetalLB which you already mentioned.

MetalLB provides a network load-balancer implementation for Kubernetes clusters that do not run on a supported cloud provider, effectively allowing the usage of LoadBalancer Services within any cluster.

You can read the detailed implementation A pure software solution: MetalLB

Another way would be Over a NodePort Service

This approach has a few other limitations one ought to be aware of:

  • Source IP address

Services of type NodePort perform source address translation by default. This means the source IP of a HTTP request is always the IP address of the Kubernetes node that received the requestfrom the perspective of NGINX.

You can also use host network

In a setup where there is no external load balancer available but using NodePorts is not an option, one can configure ingress-nginx Pods to use the network of the host they run on instead of a dedicated network namespace. The benefit of this approach is that the NGINX Ingress controller can bind ports 80 and 443 directly to Kubernetes nodes' network interfaces, without the extra network translation imposed by NodePort Services.

You have to also remember that if you edit the configuration inside the POD, it will be gone if the Pod is restarted or it crashes.

I hope this helps you to determine which way to go with your idea.

like image 30
Crou Avatar answered Oct 14 '22 23:10

Crou