diff --git a/guide/traefik_integration.md b/guide/traefik_integration.md new file mode 100644 index 0000000000000000000000000000000000000000..de4f188f114796327f53b5cf5907f562ef6c2d44 --- /dev/null +++ b/guide/traefik_integration.md @@ -0,0 +1,114 @@ +# Integrate Traefik with your OpenFaaS cluster + +> Træfik (pronounced like traffic) is a modern HTTP reverse proxy and +> load balancer made to deploy microservices with ease. +> - traefik.io + +In addition, [Traefik](https://traefik.io) offers Basic Authentication and easy SSL setup, using LetsEncrypt. It +supports several backends, such as Docker Swarm and Kubernetes. + +## Setup OpenFaaS + +OpenFaaS setup and configuration instructions can be found here: + +* [Docker Swarm](https://github.com/alexellis/faas/blob/master/guide/deployment_swarm.md) +* [Kubernetes](https://github.com/alexellis/faas/blob/master/guide/deployment_k8s.md) + +To quickly setup with Docker Swarm: +``` +$ docker swarm init --advertise-addr $(hostname -i) + +$ git clone https://github.com/alexellis/faas +$ cd faas +$ ./deploy_stack.sh +``` + +## Configure Traefik for Basic Authentication + +#### Generate an MD5 hashed password + +Use htpasswd to generate a hashed password +``` +$ htpasswd -c ./password.txt user +``` +Add a new password when prompted. The new credentials can be found in +the `password.txt` file. + +#### Add Traefik configuration to docker-compose.yml + +Add an entry under `services` with the Traefik configuration +``` +# docker-compose.yml +version: "3.2" +services: + traefik: + image: traefik:v1.3 + command: -c --docker=true + --docker.swarmmode=true + --docker.domain=traefik + --docker.watch=true + --web=true + --debug=true + --defaultEntryPoints='http' + --entryPoints='Name:http Address::80' + ports: + - 80:80 + - 8080:8080 + volumes: + - "/var/run/docker.sock:/var/run/docker.sock" + networks: + - functions + deploy: + placement: + constraints: [node.role == manager] +``` + +#### Update the Gateway service + +Traefik requires some service labels to discover the gateway service. +Update the gateway configuration to remove the port property and add +the appropriate labels. +``` +# docker-compose.yml +... + gateway: + ... + # ports: + # - 8080:8080 + ... + deploy: + labels: + - traefik.port=8080 + - traefik.frontend.rule=PathPrefixStrip:/openfaas + - traefik.frontend.auth.basic=user:$$apr1$$MU....4XHRJ3. #copy/paste the contents of password.txt here +... +``` +Rather than publicly exposing port 8080, the added `traefik.port` label will +make the gateway service available to Traefik on port 8080, but not +publicly. Requests will now pass through Traefik and be forwarded on. The +`PathPrefixStrip` property adds the ability to add different routes to +different services. Adding the path prefix but stripping +it as a request is passed to the appropriate service makes the `/system` and `/function` paths +available by including the `/openfaas` prefix. The `basic.auth` label should +include the username and the hashed password. Remember to escape any special +characters, so if the password contains a `$`, you can escape it by +doubling up `$$` just like the above. + +#### Re-Deploy OpenFaaS + +Redeploy OpenFaaS to update the service with the new changes. +``` +$ ./deploy_stack.yml +``` + +#### Test + +``` +$ curl -u user:password -X POST +https://localhost/openfaas/function/func_echoit -d "hello +OpenFaaS" +hello OpenFaaS +$curl -X POST +http://localhost/openfaas/function/func_echoit -d "hello OpenFaaS" +401 Unauthorized +```