> Note: The best place to start is the README file in the faas or faas-netes repo.
This page has moved to the official documentation site:
This guide is for deployment to a vanilla Kubernetes 1.8 cluster running on Linux hosts. It is not a hand-book, please see the set of guides and blogs posts available at [openfaas/guide](https://github.com/openfaas/faas/tree/master/guide).
### A foreword on security
These instructions are for a development environment. If you plan to expose OpenFaaS on the public Internet you need to enable basic authentication with a proxy such as Kong or Traefik at a minimum. TLS is also highly recomended and freely available with LetsEncrypt.org. [Kong guide](https://github.com/openfaas/faas/blob/master/guide/kong_integration.md)[Traefik guide](https://github.com/openfaas/faas/blob/master/guide/traefik_integration.md).
## Kubernetes
OpenFaaS is Kubernetes-native and uses *Deployments*, *Service*s and *Secret*s. For more detail check out the ["faas-netes" repository](https://github.com/openfaas/faas-netes).
> For deploying on a cloud that supports Kubernetes *LoadBalancers* you may also want to apply the configuration in: `cloud/lb.yml`.
### 1.0 Build a cluster
You can start evaluating FaaS and building functions on your laptop or on a VM (cloud or on-prem).
*[10 minute guides for minikube / kubeadm](https://blog.alexellis.io/tag/learn-k8s/)
Additional information on [setting up Kubernetes](https://kubernetes.io/docs/setup/pick-right-solution/).
We have a special guide for minikube here:
*[Getting started with OpenFaaS on minikube](https://medium.com/devopslinks/getting-started-with-openfaas-on-minikube-634502c7acdf)
Are you using Google Kubernetes Engine (GKE)? You'll need to create an RBAC role with the following command:
Deploy a stack with asynchronous functionality provided by NATS Streaming.
* Deploy the whole stack
This command is split into two parts so that the OpenFaaS namespaces are always created first:
* openfaas - for OpenFaaS services
* openfaas-fn - for functions
```
$ cd faas-netes && \
kubectl apply -f ./namespaces.yml,./yaml
```
Note: RBAC is optional but encouraged and enabled by default.
Asynchronous invocation works by queuing requests with NATS Streaming. An alternative implementation is available with Kafka in an [open PR](https://github.com/openfaas/faas/pull/311).
* See also: [Asynchronous function guide](https://github.com/openfaas/faas/blob/master/guide/asynchronous.md)
### 3.0 Use OpenFaaS
After deploying OpenFaaS you can start using one of the guides or blog posts to create Serverless functions or test [community functions](https://github.com/openfaas/faas/blob/master/community.md).
You can also watch a complete walk-through of OpenFaaS on Kubernetes which demonstrates auto-scaling in action and how to use the Prometheus UI. [Video walk-through](https://www.youtube.com/watch?v=0DbrLsUvaso).
**Connect to the UI**
For simplicity the default configuration uses NodePorts rather than an IngressController (which is more complicated to setup).
| Service | TCP port |
--------------------|----------|
| API Gateway / UI | 31112 |
| Prometheus | 31119 |
> If you're an advanced Kubernetes user, you can add an IngressController to your stack and remove the NodePort assignments.
* Deploy a sample function
There are currently no sample functions built into this stack, but we can deploy them quickly via the UI or FaaS-CLI.
**Use the CLI**
* Install the CLI
```
$ curl -sL https://cli.openfaas.com | sudo sh
```
If you like you can also run the script via a non-root user. Then the faas-cli binary is downloaded to the current working directory instead.
* Then clone some samples to deploy on your cluster.
```
$ git clone https://github.com/openfaas/faas-cli
```
Edit stack.yml and change your gateway URL from `localhost:8080` to `kubernetes-node-ip:31112` or pass the `--gateway` / `-g` flag to commands.
i.e.
```
provider:
name: faas
gateway: http://192.168.4.95:31112
```
Now deploy the samples:
```
$ faas-cli deploy -f stack.yml
```
> The `faas-cli` also supports an override of `--gateway http://...` for example: