Create an Ingress with Basic Authentication (nginx)
If you install Longhorn on a Kubernetes cluster with kubectl or Helm, you will need to create an Ingress to allow external traffic to reach the Longhorn UI.
Authentication is not enabled by default for kubectl and Helm installations. In these steps, you’ll learn how to create an Ingress with basic authentication using annotations for the nginx ingress controller.
Create a basic auth file
auth. It’s important the file generated is named auth (actually - that the secret has a keydata.auth), otherwise the Ingress returns a 503.$ USER=<USERNAME_HERE>; PASSWORD=<PASSWORD_HERE>; echo "${USER}:$(openssl passwd -stdin -apr1 <<< ${PASSWORD})" >> auth
Create a secret:
$ kubectl -n longhorn-system create secret generic basic-auth --from-file=auth
Create an Ingress manifest
longhorn-ingress.yml:Since v1.2.0, Longhorn supports uploading backing image from the UI, so please specify
nginx.ingress.kubernetes.io/proxy-body-size: 10000mas below to ensure uploading images work as expected.apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: longhorn-ingressnamespace: longhorn-systemannotations:# type of authenticationnginx.ingress.kubernetes.io/auth-type: basic# prevent the controller from redirecting (308) to HTTPSnginx.ingress.kubernetes.io/ssl-redirect: 'false'# name of the secret that contains the user/password definitionsnginx.ingress.kubernetes.io/auth-secret: basic-auth# message to display with an appropriate context why the authentication is requirednginx.ingress.kubernetes.io/auth-realm: 'Authentication Required '# custom max body size for file uploading like backing image uploadingnginx.ingress.kubernetes.io/proxy-body-size: 10000mspec:rules:- http:paths:- pathType: Prefixpath: "/"backend:service:name: longhorn-frontendport:number: 80
Create the Ingress:
$ kubectl -n longhorn-system apply -f longhorn-ingress.yml
e.g.:
$ USER=foo; PASSWORD=bar; echo "${USER}:$(openssl passwd -stdin -apr1 <<< ${PASSWORD})" >> auth$ cat authfoo:$apr1$FnyKCYKb$6IP2C45fZxMcoLwkOwf7k0$ kubectl -n longhorn-system create secret generic basic-auth --from-file=authsecret/basic-auth created$ kubectl -n longhorn-system get secret basic-auth -o yamlapiVersion: v1data:auth: Zm9vOiRhcHIxJEZueUtDWUtiJDZJUDJDNDVmWnhNY29Md2tPd2Y3azAKkind: Secretmetadata:creationTimestamp: "2020-05-29T10:10:16Z"name: basic-authnamespace: longhorn-systemresourceVersion: "2168509"selfLink: /api/v1/namespaces/longhorn-system/secrets/basic-authuid: 9f66233f-b12f-4204-9c9d-5bcaca794bb7type: Opaque$ echo "apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: longhorn-ingressnamespace: longhorn-systemannotations:# type of authenticationnginx.ingress.kubernetes.io/auth-type: basic# prevent the controller from redirecting (308) to HTTPSnginx.ingress.kubernetes.io/ssl-redirect: 'false'# name of the secret that contains the user/password definitionsnginx.ingress.kubernetes.io/auth-secret: basic-auth# message to display with an appropriate context why the authentication is requirednginx.ingress.kubernetes.io/auth-realm: 'Authentication Required 'spec:rules:- http:paths:- pathType: Prefixpath: "/"backend:service:name: longhorn-frontendport:number: 80" | kubectl -n longhorn-system create -f -ingress.networking.k8s.io/longhorn-ingress created$ kubectl -n longhorn-system get ingressNAME HOSTS ADDRESS PORTS AGElonghorn-ingress * 45.79.165.114,66.228.45.37,97.107.142.125 80 2m7s$ curl -v http://97.107.142.125/* Trying 97.107.142.125...* TCP_NODELAY set* Connected to 97.107.142.125 (97.107.142.125) port 80 (#0)> GET / HTTP/1.1> Host: 97.107.142.125> User-Agent: curl/7.64.1> Accept: */*>< HTTP/1.1 401 Unauthorized< Server: openresty/1.15.8.1< Date: Fri, 29 May 2020 11:47:33 GMT< Content-Type: text/html< Content-Length: 185< Connection: keep-alive< WWW-Authenticate: Basic realm="Authentication Required"<<html><head><title>401 Authorization Required</title></head><body><center><h1>401 Authorization Required</h1></center><hr><center>openresty/1.15.8.1</center></body></html>* Connection #0 to host 97.107.142.125 left intact* Closing connection 0$ curl -v http://97.107.142.125/ -u foo:bar* Trying 97.107.142.125...* TCP_NODELAY set* Connected to 97.107.142.125 (97.107.142.125) port 80 (#0)* Server auth using Basic with user 'foo'> GET / HTTP/1.1> Host: 97.107.142.125> Authorization: Basic Zm9vOmJhcg==> User-Agent: curl/7.64.1> Accept: */*>< HTTP/1.1 200 OK< Date: Fri, 29 May 2020 11:51:27 GMT< Content-Type: text/html< Content-Length: 1118< Last-Modified: Thu, 28 May 2020 00:39:41 GMT< ETag: "5ecf084d-3fd"< Cache-Control: max-age=0<<!DOCTYPE html><html lang="en">......
Additional Steps for AWS EKS Kubernetes Clusters
You will need to create an ELB (Elastic Load Balancer) to expose the nginx Ingress controller to the Internet. Additional costs may apply.
Create pre-requisite resources according to the nginx ingress controller documentation.
Create an ELB by following these steps.