kubernetes ingress configuration

1.2k views Asked by At

I have a working Nexus 3 pod, reachable on port 30080 (with NodePort): http://nexus.mydomain:30080/ works perfectly from all hosts (from the cluster or outside).

Now I'm trying to make it accessible at the port 80 (for obvious reasons).

Following the docs, I've implemented it like that (trivial):

[...]
---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nexus-ingress
  namespace: nexus-ns
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - host: nexus.mydomain
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              serviceName: nexus-service
              servicePort: 80

Applying it works without errors. But when I try to reach http://nexus.mydomain, I get:

Service Unavailable

No logs are shown (the webapp is not hit).

What did I miss ?

2

There are 2 answers

1
PjoterS On BEST ANSWER

K3s Lightweight Kubernetes

K3s is designed to be a single binary of less than 40MB that completely implements the Kubernetes API. In order to achieve this, they removed a lot of extra drivers that didn't need to be part of the core and are easily replaced with add-ons.

As I mentioned in comments, K3s as default is using Traefik Ingress Controller.

Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience. It receives requests on behalf of your system and finds out which components are responsible for handling them.

This information can be found in K3s Rancher Documentation.

Traefik is deployed by default when starting the server... To prevent k3s from using or overwriting the modified version, deploy k3s with --no-deploy traefik and store the modified copy in the k3s/server/manifests directory. For more information, refer to the official Traefik for Helm Configuration Parameters.

To disable it, start each server with the --disable traefik option.

If you want to deploy Nginx Ingress controller, you can check guide How to use NGINX ingress controller in K3s.

As you are using specific Nginx Ingress like nginx.ingress.kubernetes.io/rewrite-target: /$1, you have to use Nginx Ingress.

If you would use more than 2 Ingress controllers you will need to force using nginx ingress by annotation.

  annotations:
    kubernetes.io/ingress.class: "nginx"

If mention information won't help, please provide more details like your Deployment, Service.

0
touchmarine On

I do not think you can expose it on port 80 or 443 over a NodePort service or at least it is not recommended.

In this configuration, the NGINX container remains isolated from the host network. As a result, it can safely bind to any port, including the standard HTTP ports 80 and 443. However, due to the container namespace isolation, a client located outside the cluster network (e.g. on the public internet) is not able to access Ingress hosts directly on ports 80 and 443. Instead, the external client must append the NodePort allocated to the ingress-nginx Service to HTTP requests.

-- Bare-metal considerations - NGINX Ingress Controller

* Emphasis added by me.

While it may sound tempting to reconfigure the NodePort range using the --service-node-port-range API server flag to include unprivileged ports and be able to expose ports 80 and 443, doing so may result in unexpected issues including (but not limited to) the use of ports otherwise reserved to system daemons and the necessity to grant kube-proxy privileges it may otherwise not require.

This practice is therefore discouraged. See the other approaches proposed in this page for alternatives.

-- Bare-metal considerations - NGINX Ingress Controller

I did a similar setup a couple of months ago. I installed a MetalLB load balancer and then exposed the service. Depending on your provider (e.g., GKE), a load balancer can even be automatically spun up. So possibly you don't even have to deal with MetalLB, although MetalLB is not hard to setup and works great.