Uma alternativa para usar serverless sem ficar preso ao provedor de cloud
Um dos grandes problemas do serverless é ficar preso a um provedor de cloud.
Outra vantagem é a diversificação de linguagens. Com kubeless, é a comunidade pode criar runtimes.
Kubeless é uma extensão do Kubernetes e portanto, é nativo. Não há nenhuma "gambiarra" para implementar.
Pra que isso seja possível o Kubeless utiliza o Custom Resource Definitions (CRD), do Kubernetes.
Kubernetes consegue trabalhar muito bem com autoscaling. O que torna muito simples e mais barato a implementação em larga escala.
O Kubeless vem de fábrica suportando as seguintes runtimes:
Antes, e mais complexo, você precisará de um cluster kubernetes rodando.
Se você quiser testar localmente, pode instalar o minikube.
$ export RELEASE=$(curl -s https://api.github.com/repos/kubeless/kubeless/releases/latest | grep tag_name | cut -d '"' -f 4)
$ kubectl create ns kubeless
$ kubectl create -f https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless-$RELEASE.yaml
$ kubectl get pods -n kubeless
NAME READY STATUS RESTARTS AGE
kubeless-controller-manager-567dcb6c48-ssx8x 1/1 Running 0 1h
$ kubectl get deployment -n kubeless
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubeless-controller-manager 1 1 1 1 1h
$ kubectl get customresourcedefinition
NAME AGE
cronjobtriggers.kubeless.io 1h
functions.kubeless.io 1h
httptriggers.kubeless.io 1h
export OS=$(uname -s| tr '[:upper:]' '[:lower:]')
curl -OL https://github.com/kubeless/kubeless/releases/download/$RELEASE/kubeless_$OS-amd64.zip && \
unzip kubeless_$OS-amd64.zip && \
sudo mv bundles/kubeless_$OS-amd64/kubeless /usr/local/bin/
// handler.js
const _ = require('lodash')
const captalize = (event, context) =>
_.capitalize(event.data)
module.exports = {
capitalize,
};
Tem outros exemplos nesse link.
// package.json
{
"name": "capitalize",
"version": "1.0.0",
"description": "Example function for serverless kubeless",
"dependencies": {
"lodash": "^4.1.0"
},
"devDependencies": {
"serverless-kubeless": "^0.7.0"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "Apache-2.0"
}
# serverless.yml
service: capitalize
provider:
name: kubeless
runtime: nodejs6
plugins:
- serverless-kubeless
functions:
capitalize:
handler: handler.capitalize
// depois de conectar com o cluster kubernetes
$ npm install
$ serverless deploy
$ serverless invoke -f capitalize -l --data 'hello world!'
Serverless: Calling function: capitalize...
--------------------------------------------------------------------
Hello world!
$ serverless remove