Serverless : Knative avec Tekton et Apache OpenWhisk à l’aide de Kontena Pharos et miniONE …
Tags: docker, continuousdelivery, serverless, scaleway
Published: 2019-08-24 17:40:25

---
title: Serverless : Knative avec Tekton et Apache OpenWhisk à l’aide de Kontena Pharos et miniONE …
published: true
tags: docker,continuous-delivery,serverless,scaleway
canonical_url: https://medium.com/@abenahmed1/serverless-knative-avec-tekton-et-apache-openwhisk-%C3%A0-laide-de-kontena-pharos-et-minione-71ebad72eda3
---

### Serverless : Knative avec Tekton et Apache OpenWhisk à l’aide de Kontena Pharos et miniONE …

![](https://cdn-images-1.medium.com/max/1024/1*Y6-mmco-QK6uC-kvK3ggcQ.jpeg)

Le projet Knative a décidé de transformer Knative Build en un projet séparé, appelé [Tekton,](https://translate.googleusercontent.com/translate_c?depth=1&rurl=translate.google.com&sl=auto&sp=nmt4&tl=fr&u=https://github.com/tektoncd/pipeline&xid=17259,15700019,15700186,15700191,15700256,15700259,15700262,15700265&usg=ALkJrhj32SqBpWZMLFjDO-mlvya4m_0wiA) qui vise à fournir des fonctionnalités génériques de CI/CD basées sur [Kubernetes](https://translate.googleusercontent.com/translate_c?depth=1&rurl=translate.google.com&sl=auto&sp=nmt4&tl=fr&u=https://www.ibm.com/cloud/learn/kubernetes&xid=17259,15700019,15700186,15700191,15700256,15700259,15700262,15700265&usg=ALkJrhiFigt_oH7ySeL7rgZ9Z1oA7agaYg).

[Tekton Pipelines](https://tekton.dev/)

Cela permet par exemple d’exécuter des actions [OpenWhisk](https://translate.googleusercontent.com/translate_c?depth=1&rurl=translate.google.com&sl=auto&sp=nmt4&tl=fr&u=https://openwhisk.apache.org/&xid=17259,15700019,15700186,15700191,15700256,15700259,15700262,15700265&usg=ALkJrhiO7ttFQw1rUoNOHr6beBVGVLQvvw) dans Knative. Pour démarrer ce test, je pars d’une instance Bare Metal dans Scaleway :

![](https://cdn-images-1.medium.com/max/1024/1*9t_tb5rjD9o5mHiIrb44Hg.jpeg)

de type C2L :

[BareMetal Instances](https://www.scaleway.com/en/bare-metal-instances/)

![](https://cdn-images-1.medium.com/max/779/1*LHXAD7t67kO5eyHbrPlHDg.jpeg)

![](https://cdn-images-1.medium.com/max/937/1*X3QHa-E9FC_GS_eXjGbXrw.jpeg)

Et je déploie miniONE qui permet d’installer très facilement OpenNebula sur un seul hôte par une seule commande :

![](https://cdn-images-1.medium.com/max/614/0*Y4AXekyKby-1VRg8.png)

- [miniONE - Install OpenNebula with a Single command!](https://opennebula.org/minione-install-opennebula-with-a-single-command/)
- [OpenNebula/minione](https://github.com/OpenNebula/minione/blob/master/minione)

![](https://cdn-images-1.medium.com/max/1024/1*wv4Z_NLnT8z-C7iEheWDhA.png)

Au préalable, j’ai monté le second disque de 250 Go sur _/var/lib_ :

![](https://cdn-images-1.medium.com/max/1024/1*dz1HjVPv0B2xMWb1u1E4FA.jpeg)

OpenNebula est alors accessible :

![](https://cdn-images-1.medium.com/max/1024/1*bK_3G88IjuIbDVy41dJATQ.jpeg)

Dans le Marketplace, on peut voir qu’il existe une image dédiée au déploiement d’un cluster Kubernetes :

![](https://cdn-images-1.medium.com/max/1024/1*FnWTfsj7uhB94pleLKmuZw.jpeg)

[News from the Marketplace: Kubernetes Appliance](https://opennebula.org/news-from-the-marketplace-kubernetes-appliance/)

{% youtube BRstZ8yAUGM %}

Néanmoins, je récupère une image Ubuntu 18.04 qui va me servir au déploiement de mon cluster Kubernetes via Kontena Pharos :

![](https://cdn-images-1.medium.com/max/1024/1*cxUJtWNd67uY8eUZDadM4g.jpeg)

et j’ai lié l’instance Bare Metal à ZeroTier (un réseau mondial peer to peer sécurisé) :

![](https://cdn-images-1.medium.com/max/1024/1*wjTmnsSw2prLCG11Nha87w.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*NGSjnYf37mg3kT2K4BjwoA.jpeg)

Cela me permet de créer un nouveau réseau dans OpenNebula pour mes futures machines virtuelles qui pourront être accessibles depuis l’extérieur (en plus du réseau privé créé par défaut au moment de l’installation d’OpenNebula) :

![](https://cdn-images-1.medium.com/max/1024/1*Esx-ZZ39IyrpSaPEhreygw.jpeg)

avec la réservation d’un pool d’adresses IP via le plan d’adressage défini dans ZeroTier :

![](https://cdn-images-1.medium.com/max/1024/1*exjsmHnq43caeruLZxX5zw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*sUj27vjStF6OW8x4TSjc4w.jpeg)

Je crée alors quatres machines virtuelles pour mon cluster Kubernetes :

![](https://cdn-images-1.medium.com/max/1024/1*EVHPH2i4c4Y63zw3G0IcFA.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*7PyfLc9vp0fnbdSUW-pmxw.jpeg)

Récupération du binaire Kontena Pharos-Cluster sur Github :

![](https://cdn-images-1.medium.com/max/1024/1*zSVn0mqG16PhN7P0jk0VZw.jpeg)

puis création du fichier YAML nécéssaire au déploiement du cluster Kubernetes par Kontena Pharos :

![](https://cdn-images-1.medium.com/max/666/0*55FOboDY_RPPp9Zk.jpg)

![](https://cdn-images-1.medium.com/max/1024/1*P-AIcvbXMAbOH-fHRVFRew.png)<figcaption>cluster.yml</figcaption>

Déploiement du cluster Kubernetes :

![](https://cdn-images-1.medium.com/max/1024/1*PjbJCVKwBxILwigGTKRxPg.png)

Il est opérationnel :

![](https://cdn-images-1.medium.com/max/1024/1*9Kl9r6OkRc_9LUdBvHesRg.png)

J’installe Knative comme précédemment via Gloo (dont le binaire est à récupérer sur Github):

![](https://cdn-images-1.medium.com/max/1024/0*ht4iwuUClbOvZjkK.png)

[Knative Install using Gloo on a Kubernetes Cluster](https://knative.dev/docs/install/knative-with-gloo/)

![](https://cdn-images-1.medium.com/max/1024/1*AmbLqjzXhaG_33yB1OQhEQ.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*Tf4ZFFl7nu1ZJHSlmIY3IA.png)

Puis installation de Tekton :

[tektoncd/pipeline](https://github.com/tektoncd/pipeline/blob/master/docs/install.md)

![](https://cdn-images-1.medium.com/max/1024/1*0miQhIRfrtpSyLtyQQCIcA.png)

![](https://cdn-images-1.medium.com/max/1024/1*ykQ3JWoaqGqs0neuUm3yPw.png)

![](https://cdn-images-1.medium.com/max/1024/1*kkc4SAah8PQbW9-Lkd6sBQ.png)

Je vais reprendre l’exemple de cet excellent article d’IBM sur le sujet :

[Build a Knative Service with Tekton and Apache OpenWhisk Node.js Runtime](https://www.ibm.com/cloud/blog/build-a-knative-service-with-tekton-and-apache-openwhisk-nodejs-runtime)

![](https://cdn-images-1.medium.com/max/800/0*OcIuhFIxEOTmbJEm.png)

en commencant par créer un secret Kubernetes pour permettre à une image Docker d’être transférée dans un Docker Registry. Ce peut être Docker Hub ou tout autre Docker Registry. Et ceci via ce fichier YAML :

![](https://cdn-images-1.medium.com/max/972/1*ijQLYGFKAnGcEaROJzjHDQ.png)<figcaption>docker-secret.yaml</figcaption>

Il faut également créer un compte de service pour lier le processus de construction à ce secret afin que Tekton puisse envoyer des images Docker au Docker Registry à l’aide des informations d’identification (via ce fichier YAML) :

![](https://cdn-images-1.medium.com/max/734/1*1VG8oSoRw4ZLcFoKeT_1Tw.png)<figcaption>serviceaccount-tekton.yaml</figcaption>

et on les applique au cluster :

![](https://cdn-images-1.medium.com/max/1024/1*e9Fi4QUjvxoUYoI3gpWvXw.png)

On peut alors créer une première ressource de pipeline Tekton, c’est-à-dire ici obtenir le code d’exécution Node.js de l’image Docker à partir d’Apache OpenWhisk (un pipeline de type Git définit les paramètres, y compris la révision et l’URL à utiliser) :

![](https://cdn-images-1.medium.com/max/1024/1*YbrXJAf06gaXSo5AnUVNww.png)

Le deuxième pipeline contiendra les étapes à suivre pour transmettre une image Docker au Docker Registry. Dans cet exemple on utilise Docker Hub :

![](https://cdn-images-1.medium.com/max/1024/1*E71Mupw03mzJSJNKvUlprg.png)

Tekton s’attend à ce qu’un type soit spécifié pour _PipelineResource_. Dans ce cas, l’image doit être créée et poussée dans l’URL du Docker Registry fourni dans les paramètres. Une tâche Tekton définit le travail à exécuter via la définition de la ressource d’entrée en tant que ressource de Pipeline Git, la ressource de sortie en tant que référentiel Docker et les étapes à exécuter de manière séquentielle par la tâche. On définit le modèle de construction tel que l’on aurait pû le faire pour Knative-build. Définition de la tâche et application de cette dernière à Tekton via ces lignes de commande :

![](https://cdn-images-1.medium.com/max/1024/1*z96JW_IZGCTpBNHcdK07Rg.png)

Une tâche peut être exécutée par une ressource TaskRun dans Tekton. TaskRun lie les entrées et les sorties à PipelineResources (déjà défini), met au point les valeurs en fonction des paramètres utilisés pour la création des modèles et exécute les étapes de la tâche. Application de cette dernière via ces lignes de commande :

![](https://cdn-images-1.medium.com/max/1024/1*5Y9o0TTP9KvP8EbmEo6M7Q.png)

On peut créer une première action Knative avec Tekton ceci via le client _Knctl_ de Knative dont le binaire est à récupérer sur Github :

[cppforlife/knctl](https://github.com/cppforlife/knctl)

![](https://cdn-images-1.medium.com/max/1024/1*8jdgBoLdmJxI9un_3-bYhQ.jpeg)

Je peux alors déployer un simple service “HelloWorld” (sans fichier de déploiement) et l’invoquer par une requête POST :

![](https://cdn-images-1.medium.com/max/1024/1*-k25ncTJscEfxTK0sb0ONw.png)

Ce test n’aura pas engendré la consommation de beaucoup de ressource (comme en témoignent ces graphes de Netdata sur le serveur Bare Metal) :

[NetData - Get control of your Linux Servers. Simple. Effective. Awesome.](https://www.netdata.cloud/)

![](https://cdn-images-1.medium.com/max/1024/1*FVyYeMtkJWxqwktEbFu1Jw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*8CwjhS6Y-4yOsCXmk3LD3g.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*KJbUSVXWXZGo41nk5QusGQ.jpeg)

Le projet Tekton Pipelines permet donc de déclarer des pipelines de type CI/CD. Et ceci sur n’importe quel cluster Kubernetes …

[tektoncd/pipeline](https://github.com/tektoncd/pipeline)

A suivre ! …

![](https://cdn-images-1.medium.com/max/630/0*v2BlnfI4mrKbS7hR.jpg)