Application Go avec architecture sans serveur sur Kubernetes avec Knative

L'auteur de notre nouvel article traduit affirme que Knative est le meilleur auquel ils pourraient penser dans l'univers! Êtes-vous d'accord?


Si vous utilisez déjà Kubernetes, vous avez probablement entendu parler de l'architecture sans serveur. Bien que les deux plates-formes, Kubernetes et Knative, soient évolutives, c'est l'architecture sans serveur qui fait tout ce qu'elle peut pour fournir aux développeurs un code fonctionnel sans les déranger avec des problÚmes d'infrastructure. Il réduit également les coûts d'infrastructure en faisant évoluer virtuellement les instances d'application à partir de zéro.





D'un autre cÎté, vous pouvez profiter de Kubernetes sans limitation en suivant le modÚle d'hébergement traditionnel et les techniques avancées de gestion du trafic. Grùce à cela, nous ouvrons diverses opportunités, par exemple, des déploiements bleu-vert et des tests A / B.



Knative est un effort pour tirer le meilleur des deux mondes! En tant que plate-forme cloud open source, Knative vous permet d'exécuter vos applications sans serveur sur Kubernetes, en tirant parti de la puissance de Kubernetes, et garantit la simplicité et la flexibilité d'une architecture sans serveur.



Ainsi, les développeurs peuvent se concentrer sur le codage et le déploiement d'un conteneur sur Kubernetes avec une seule commande, tandis que Knative gÚre l'application tout en prenant soin des nuances du réseau, de la mise à l'échelle automatique à zéro et du suivi des versions.



De plus, Knative permet aux développeurs d'écrire du code faiblement couplé avec leur cadre de gestion des événements, qui fournit des abonnements, des diffusions et une gestion des événements universels. Cela signifie que vous pouvez déclarer la connectivité des événements et que vos applications peuvent s'abonner à des flux de données spécifiques.



Dirigée par Google, la plateforme open-source a été intégrée à la Cloud Native Computing Foundation. Cela implique un manque de verrouillage du fournisseur, ce qui constitue par ailleurs une limitation significative des solutions FaaS sans serveur cloud actuelles. Vous pouvez exécuter Knative sur n'importe quel cluster Kubernetes.



À qui s'adresse Knative?



Knative aide une grande variété de professionnels, chacun avec ses propres connaissances, expérience et responsabilités.







Les ingénieurs peuvent se concentrer sur la gestion du cluster Kubernetes et sur l'installation et la maintenance des instances Knative à l'aide de kubectl, tandis que les développeurs créent et déploient des applications à l'aide de l'API Knative.



C'est un gros plus pour toute organisation, puisque désormais différentes équipes peuvent résoudre leurs problÚmes sans interférer les unes avec les autres.



Pourquoi devriez-vous utiliser Knative?



La plupart des organisations utilisant Kubernetes ont un processus complexe de gestion du dĂ©ploiement et de la maintenance des charges de travail. Cela conduit les dĂ©veloppeurs Ă  prĂȘter attention aux dĂ©tails dont ils n'ont pas Ă  se soucier. Les dĂ©veloppeurs doivent se concentrer sur le codage plutĂŽt que sur les assemblages et les dĂ©ploiements.



Kubeless aide les développeurs à faciliter l'exécution de leur code sans avoir à en savoir trop sur ce qui se passe sous le capot de Kubernetes.



Un cluster Kubernetes occupe des ressources d'infrastructure car il nécessite que toutes les applications aient au moins un conteneur en cours d'exécution. Knative gÚre cet aspect pour vous et prend en charge la mise à l'échelle automatique des conteneurs dans le cluster à partir de zéro. Cela permet aux administrateurs Kubernetes de regrouper plusieurs applications dans un seul cluster.



Si vous disposez de plusieurs applications avec des temps de charge de pointe diffĂ©rents, ou si vous disposez d'un cluster qui met Ă  l'Ă©chelle automatiquement les nƓuds de calcul, vous pouvez en tirer un grand avantage pendant les temps d'arrĂȘt.



Une mine d'or pour les applications d'architecture de microservices qui peuvent ne pas avoir besoin de microservices s'exécutant à un moment précis. Cela permet une utilisation plus efficace des ressources et vous pouvez en faire plus avec des ressources limitées.



De plus, il s'intÚgre assez bien avec le moteur Eventing et facilite la conception de systÚmes indépendants. Le code d'application peut rester totalement libre de toute configuration de point de terminaison, et vous pouvez publier et vous abonner à des événements en déclarant des configurations au niveau de Kubernetes. C'est un avantage non négligeable pour les applications de microservices complexes!



Comment fonctionne Knative?



Knative fournit l' API kn à l'aide des opérateurs Kubernetes et CRD. En les utilisant, vous pouvez déployer des applications à l'aide de la ligne de commande. En arriÚre-plan, Knative créera tout ce dont Kubernetes a besoin (déploiements, services, données entrantes, etc.) pour exécuter des applications sans que vous ayez à vous en soucier.



Sachez que Knative ne crée pas immédiatement de pods. Au lieu de cela, il fournit un point de terminaison virtuel pour les applications et les écoute. Si une demande atteint ces points de terminaison, Knative exécute les pods requis. Cela permet aux applications de passer de zéro au nombre d'instances souhaité.







Knative fournit des points de terminaison d'application en utilisant son propre domaine au format [app-name]. [namespace]. [custom-domain] .



Cela permet d'identifier de maniÚre unique l'application. Ceci est similaire à la façon dont Kubernetes gÚre les services, mais vous devez créer vos propres enregistrements de domaine A pour pointer vers la passerelle d'entrée Istio. Istio gÚre tout le trafic qui passe par votre cluster en arriÚre-plan.



Knative est une fusion de nombreux produits CNCF et open source tels que Kubernetes, Istio, Prometheus, Grafana et des moteurs de streaming d'événements tels que Kafka et Google Pub / Sub.



Installation de Knative



Knative a une structure modulaire raisonnable et vous ne pouvez installer que les composants dont vous avez besoin. Knative propose des composants d'événement, de service et de surveillance. Vous pouvez les installer à l'aide de CRD personnalisés.



Knative a des dépendances externes et des exigences pour chaque composant. Par exemple, si vous installez un composant de service, vous devez également installer Istio et le module complémentaire DNS.



L'installation de Knative est assez compliquée et mérite un article séparé. Mais pour des raisons de démonstration, commençons par installer le composant de service.



Pour ce faire, vous avez besoin d'un cluster Kubernetes fonctionnel.



Installez le service CRD et les composants principaux de service:



kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-core.yaml
      
      





Installez Istio pour Knative:



curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.7.0 sh - && 

cd istio-1.7.0 && export PATH=$PWD/bin:$PATH

istioctl install --set profile=demo

kubectl label namespace knative-serving istio-injection=enabled
      
      





Attendez qu'Istio soit prĂȘt en vĂ©rifiant si Kubernetes a allouĂ© une adresse IP externe Ă  la passerelle Istio Ingress:



kubectl -n istio-system get service istio-ingressgateway
      
      





Définissez votre propre domaine et configurez DNS pour qu'il pointe vers l'adresse IP de la passerelle d'entrée Istio:



kubectl patch configmap/config-domain --namespace knative-serving --type merge  -p "{\"data\":{\"$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}').xip.io\":\"\"}}"

kubectl apply -f https://github.com/knative/net-istio/releases/download/v0.17.0/release.yaml

kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-default-domain.yaml
      
      





Installez le module complémentaire Istio HPA:



kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-hpa.yaml
      
      





Installation de la CLI Knative



L'installation de la CLI Knative est simple. Vous devez télécharger la derniÚre version du binaire CLI Knative dans le dossier bin ou spécifier le chemin approprié.



sudo wget https://storage.googleapis.com/knative-nightly/client/latest/kn-linux-amd64 -O /usr/local/bin/kn

sudo chmod +x /usr/local/bin/kn

kn version
      
      





Lancement de l'application Hello, World!



Maintenant, exécutons notre premier "Hello, World!" pour voir à quel point il est facile de déployer avec Knative.



Utilisons l'exemple d'application Hello, World! dans Go pour dĂ©monstration. Il s'agit d'une API REST simple qui renvoie Hello $ TARGET , oĂč $ TARGET est une variable d'environnement que vous pouvez dĂ©finir dans le conteneur.



Exécutez la commande suivante pour commencer:



$ kn service create helloworld-go --image gcr.io/knative-samples/helloworld-go --env TARGET="World" --annotation autoscaling.knative.dev/target=10
Creating service 'helloworld-go' in namespace 'default':
0.171s Configuration "helloworld-go" is waiting for a Revision to become ready.
  6.260s ...
  6.324s Ingress has not yet been reconciled.
  6.496s Waiting for load balancer to be ready
  6.637s Ready to serve.
Service 'helloworld-go' created to latest revision 'helloworld-go-zglmv-1' is available at URL:
http://helloworld-go.default.34.71.125.175.xip.io
      
      





kubectl get pod
No resources found in default namespace.
      
      





Commençons le service helloworld .



$ curl http://helloworld-go.default.34.71.125.175.xip.io
Hello World!
      
      





Et aprĂšs un certain temps, nous obtenons une rĂ©ponse. Jetons un coup d'Ɠil aux pods.



$ kubectl get pod
NAME                                               READY   STATUS    RESTARTS   AGE
helloworld-go-zglmv-1-deployment-6d4b7fb4f-ctz86   2/2     Running   0          50s
      
      





Ainsi, comme vous pouvez le voir, Knative s'est déroulé en dessous en arriÚre-plan en un seul mouvement. Il s'avÚre que nous avons littéralement mis à l'échelle à partir de zéro.



Si nous donnons un peu de temps, nous verrons que le pod commence Ă  ĂȘtre terminĂ©. Voyons ce qui se passe.



$ kubectl get pod -w
NAME                                               READY   STATUS    RESTARTS   AGE
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Running   0          7s
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Terminating   0          67s
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   1/2     Terminating   0          87s
      
      





L'exemple ci-dessus montre que Knative gĂšre les pods selon nos besoins. Bien que la premiĂšre requĂȘte soit lente car Knative crĂ©e des charges de travail pour la traiter, les requĂȘtes suivantes s'exĂ©cuteront plus rapidement. Vous pouvez affiner le temps de ralentissement des pods en fonction de vos besoins ou si vous avez un SLA plus strict.



Allons un peu plus loin. Si vous regardez les annotations, nous avons limité chacune d'entre elles en cours de traitement à 10 demandes simultanées. Alors, que se passe-t-il si nous chargeons nos fonctions en plus de cela? Découvrons maintenant!



Nous allons utiliser l'utilitaire hey pour charger l'application. La commande suivante envoie 50 demandes simultanées au point de terminaison dans les 30 secondes.



$ hey -z 30s -c 50 http://helloworld-go.default.34.121.106.103.xip.io
  Average:      0.1222 secs
  Requests/sec: 408.3187
Total data:   159822 bytes
  Size/request: 13 bytes
Response time histogram:
  0.103 [1]     |
  0.444 [12243] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.785 [0]     |
  1.126 [0]     |
  1.467 [0]     |
  1.807 [0]     |
  2.148 [0]     |
  2.489 [0]     |
  2.830 [0]     |
  3.171 [0]     |
  3.512 [50]    |
Latency distribution:
  10% in 0.1042 secs
  25% in 0.1048 secs
  50% in 0.1057 secs
  75% in 0.1077 secs
  90% in 0.1121 secs
  95% in 0.1192 secs
  99% in 0.1826 secs
Details (average, fastest, slowest):
  DNS+dialup:   0.0010 secs, 0.1034 secs, 3.5115 secs
  DNS-lookup:   0.0006 secs, 0.0000 secs, 0.1365 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0062 secs
  resp wait:    0.1211 secs, 0.1033 secs, 3.2698 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0032 secs
Status code distribution:
  [200] 12294 responses
      
      





Regardons maintenant les pods.



$ kubectl get pod
NAME                                                READY   STATUS    RESTARTS   AGE
helloworld-go-thmmb-1-deployment-77976785f5-6cthr   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-7dckg   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-fdvjn   0/2     Pending   0          57s
helloworld-go-thmmb-1-deployment-77976785f5-gt55v   0/2     Pending   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-rwwcv   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-tbrr7   2/2     Running   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-vtnz4   0/2     Pending   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-w8pn6   2/2     Running   0          59s
      
      





Comme nous pouvons le voir, Knative met Ă  l'Ă©chelle les pods Ă  mesure que la charge de la fonction augmente et la ralentit lorsqu'il n'y a plus de charge.



Conclusion



Knative combine les meilleures fonctionnalitĂ©s d'une architecture sans serveur avec les capacitĂ©s de Kubernetes. Il Ă©volue progressivement vers une maniĂšre standard de mettre en Ɠuvre FaaS. Comme Knative fait partie de la CNCF et suscite de plus en plus d'intĂ©rĂȘt technique, nous pourrions bientĂŽt constater que les fournisseurs de cloud adoptent Knative dans leurs produits sans serveur.



Merci d'avoir lu mon article! J'espÚre que vous avez aimé.



All Articles