Uma alternativa para usar serverless sem ficar preso ao provedor de cloud

# whoami

root Victor Perin

  • Organizador do NodeSchool Campinas
  • Desenvolvedor NodeJS
  • Desculpem pelos vicios de linguagem
  • ❤️ Cryptography | Cypherpunks | Bitcoins
  • ❤️ JS | Docker | NoSQL
  • ❤️ FP | Reactive | Async
  • ❤️ DevOps

Afinal, WHY?!

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 runs on top of Kubernetes

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.

Serverless + Kubernetes

Kubernetes consegue trabalhar muito bem com autoscaling. O que torna muito simples e mais barato a implementação  em larga escala.

Aceita uma gama de linguagens

O Kubeless vem de fábrica suportando as seguintes runtimes:

  • python
  • nodejs
  • ruby
  • php
  • go
  • dotnetcore
  • java
  • ballerina

Instalação

Antes, e mais complexo, você precisará de um cluster kubernetes rodando.

 

Se você quiser testar localmente, pode instalar o minikube.

Adicionando o Kubeless no Kubernetes

$ 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

Instale o kubeless-cli

(Na sua maquina)

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/

Hello World

(com serverless framework)

// 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

Deploy

// 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

Triggers

The End!

Kubeless - Serverless sem provider lock-in

By Victor Perin

Kubeless - Serverless sem provider lock-in

  • 456