# 🇫🇷 Borg Collective, mes jouets pour apprendre Knative
Toute résistance est inutile
J'ai progressé dans mon apprentissage de Knative, et j'ai rapidement réalisé que j'avais besoin d'outils supplémentaires pour faciliter ma vie de développeur. Si je peux expérimenter vite, je peux le faire pour de nombreuses choses at accélérer mon apprentissage.
Tout d'abord, j'ai besoin d'un cluster Kubernetes sur lequel je puisse installer Knative facilement. Et je veux aussi pouvoir créer et détruire à volonté mon cluster plusieurs fois par jour (on sait tous que Kubernetes est fait pour ça 😉).
J'ai donc créé des "toy projects" pour m'aider dans mon apprentissage de Knative. Ils sont tous dans ce groupe GitLab : https://gitlab.com/borg-collective (opens new window).
Ils sont actuellement utilisables (pas forcément complet, ni l'état de l'art), et ils sont:
- Unimatrix 0 : tout ce qu'il vous faut pour créer un cluster K3S et installer Knative dessus
- 7of9 : un runtime à base de container pour déployer rapidement une sorte de fonction sur la plateforme Knative Serving, sans passer par l'étaple de construction de l'image, et du coup faciliter mon processus de découverte. J'ai basé 7of9 sur GraalVM + Vert.x + Kotlin et j'utilise les langages inclus dans GraalVM (JavaScript, Python, Ruby).
- Locutus.wip : c'est aussi un runtime à base de container pour s'amuser avec Knative Eventing. Là aussi, je voulais me passer de la phase de construction de l'image à chaque fois que je modifiais du code. Locutus.wip est basé sur NodeJS + Express + CloudEvents SDK. Alors pourquoi ".wip"? En fait la spécification CloudEvents n'est pas encore complètement cuite, et le SDK JavaScript non plus.
- Bientôt : Borg.Queen, comme 7of9 mais en utilisant le Kotlin script engine - "stay tuned".
# Unimatrix 0
Le projet est ici : https://gitlab.com/borg-collective/unimatrix-0 (opens new window)
Donc, Unimatrix 0 est un ensemble de scripts pour créer un (mono) cluster K3S et installer dessus les composants de Knative. C'est extrêment simple à utiliser. J'utilise Multipass (je les exécutent sous OSX, mais théoriquement cela devrait fonctionner sous Linux et Windows - quelques tests à venir...) :
git clone git@gitlab.com:borg-collective/unimatrix-0.git
cd unimatrix-0
./create-vm.sh
./knative-serving.sh
./knative-dns.sh
./knative-eventing.sh
./enable-broker.sh
./knative-monitoring.sh
Et c'est tout! (vous pouvez modifier les spécifications de la vm en éditabt le fichier vm.config
avant de lancer la création de la vm).
Le script va générer un fichier k3s.yml
dans le répertoire /config qui vous permettra de vous connecter à votre cluster "de l'extérieur" avec
kubectl` :
export KUBECONFIG=$PWD/config/k3s.yaml
kubectl get pods --all-namespaces
# or even run K9S
k9s --all-namespaces
# 7of9 pour jouer avec Knative Serving
Maintenant que nous avons une plateforme Knative qui tourne, nous pouvons déployer un service dessus. Tout d'abord, vous aurez besoin de kubectl
et de la CLI Knative kn
(voir Installing the Knative CLI (opens new window)), une fois installés, c'est très facile :
Créez u fichier hello.js
:
function hello(params) {
return {
message: "Hello World",
total: 42,
author: "@k33g_org",
params: params.getString("name")
}
}
Et ensuite créez le service :
kubectl create namespace k-apps
# create or update the service
kn service create --force hello-service \
--namespace k-apps \
--env FUNCTION_NAME="hello" \
--env LANG="js" \
--env FUNCTION_CODE="$(cat ./hello.js)" \
--env CONTENT_TYPE="application/json;charset=UTF-8" \
--image registry.gitlab.com/borg-collective/7of9:latest
Attendez un petit moment, et vous devriez obtenir une URL pour votre service qui ressemblera à celle ci :
http://hello-service.k-apps.192.168.64.70.xip.io
192.168.64.70
est l'IP de mon cluster local
curl -d '{"name":"Bob"}' \
-H "Content-Type: application/json" \
-X POST http://hello-service.k-apps.192.168.64.70.xip.io
Facile ! Non ?
# Locutus.wip pour jouer avec Knative Eventing
Alors je fais mes 1er pas avec Eventing, et je trouve que c'est plus compliqué à comprendre que la partie Serving (certainement parce la plupart du temps, je code des webapps). Du coup, pour faciliter mes expérimentations, j'ai créé Locutus.wip, et je trouve que c'est facile à utiliser.
Voici un exemple très simple, (revenez de temps en temps, j'ai prévu d'en écrire des plus complexes) :
Premièrement, nous devons créer un service et un bout de code qui va gérer l'évènement reçu (params
) et l'évènement créé pour la réponse (event
) :
read -d '' CODE << EOF
let hello = (event, params) => {
console.log("🦊", params)
return event
.type('dev.knative.demo')
.source('[Locutus]')
.time(new Date())
}
EOF
kn service create --force locutus-wip-1 \
--env FUNCTION_NAME="hello" \
--env FUNCTION_CODE="$CODE" \
--image registry.gitlab.com/borg-collective/locutus.wip:latest
le broker est injecté sur le namespace
default
pendant l'installation de Knative avec le projet Unimatrix 0 avec cette commande :kubectl label namespace default knative-eventing-injection=enabled
Ensuite, il faut créer une "source" (l'émetteur d'évènement), pour cela créez un fichier source.yml
:
apiVersion: sources.knative.dev/v1alpha2
kind: PingSource
metadata:
name: test-ping-source
spec:
schedule: "* * * * *"
jsonData: '{"message": "Hello world 😃 "}'
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: locutus-wip-1
Puis publiez la source :
kubectl apply -f source.yml
Et maintenant "checkez" régulièrement vote service (ce n'est pas instantané) :
kubectl logs -l serving.knative.dev/service=locutus-wip-1 -c user-container --since=1m
Au bout d'un moment, vous devriez obtenir quelque chose comme ceci :
🖐️ received data: { message: 'Hello world 😃 ' }
🦊 { message: 'Hello world 😃 ' }
👋 reply cloud event: {
"specversion": "1.0",
"id": "f38a6135-5e71-4e1b-a46d-9aa905ee83f3",
"type": "dev.knative.demo",
"source": "[Locutus]",
"time": "2020-05-30T09:00:00.031Z"
}
Voilà, c'est tout pour le moment. J4ai besoin de préparer un talk à propos de tout ça, donc la documentation des projets va évoluer.
Je vous souhaite une très belle journée.
Last Articles
- 🇫🇷 Type Result en Kotlin | 2020-10-31 | Kotlin
- 🇫🇷 Type Result en Kotlin | 2020-10-31 | Kotlin
- 🇬🇧 Every GitLab Page deserves a real CI/CD | 2020-07-23 | GitLab CI
- 🇫🇷 Lit-Element, commencer doucement | 2020-07-20 | WebComponent
- 🇬🇧 Build quickly and host easily your Docker images with GitLab and GitLab CI | 2020-06-02 | GitLab CI
- 🇬🇧 Deploy quickly on Clever Cloud with GitLab CI | 2020-05-31 | GitLab CI
- 🇫🇷 Borg Collective, mes jouets pour apprendre Knative | 2020-05-30 | Knative
- 🇬🇧 Borg Collective, Toys to learn Knative | 2020-05-30 | Knative
- 🇫🇷 M5Stack, une petit device IOT bien sympathique, programmable en Python | 2020-05-09 | IOT
- 🇫🇷 Knative, l'outil qui rend Kubernetes sympathique | 2020-05-02 | kubernetes