KubeDirector est un moyen facile d'exécuter des applications complexes avec état dans Kubernetes

Remarque perev. R: L'article original a été écrit par des représentants de BlueData, une entreprise fondée par des gens de VMware. Elle se spécialise dans la facilitation (plus facile, plus rapide, moins chère) du déploiement de solutions pour l'analyse de Big Data et l'apprentissage automatique dans divers environnements. L'initiative récente de la société appelée BlueK8s , dans laquelle les auteurs souhaitent assembler une galaxie d'outils Open Source "pour déployer des applications avec état et les gérer dans Kubernetes", est également appelée à y contribuer. L'article est consacré au premier d'entre eux - KubeDirector, qui, selon le plan des auteurs, aide un passionné du domaine du Big Data, qui n'a pas de formation spéciale en Kubernetes, à déployer des applications comme Spark, Cassandra ou Hadoop dans K8s. De brèves instructions sur la façon de procéder sont fournies dans l'article. Cependant, gardez à l'esprit que le projet a un état de préparation précoce - pré-alpha.



KubeDirector est un projet Open Source conçu pour simplifier le lancement de clusters à partir d'applications complexes évolutives avec état dans Kubernetes. KubeDirector est implémenté à l'aide du cadre CRD ( Custom Resource Definition ), utilise les capacités d'extension de l'API Kubernetes native et s'appuie sur leur philosophie. Cette approche offre une intégration transparente avec la gestion des utilisateurs et des ressources dans Kubernetes, ainsi qu'avec les clients et utilitaires existants.

Le projet KubeDirector récemment annoncé fait partie d'une initiative Open Source plus large pour Kubernetes appelée BlueK8s. Maintenant, je suis heureux d'annoncer la disponibilité du code KubeDirector (pré-alpha) précoce . Ce message montrera comment cela fonctionne.

KubeDirector offre les fonctionnalités suivantes:

  • Pas besoin de modifier le code pour exécuter des applications avec état autres que le cloud natif de Kubernetes. En d'autres termes, il n'est pas nécessaire de décomposer les applications existantes pour qu'elles correspondent au modèle d'architecture de microservice.
  • Prise en charge native du stockage de la configuration et de l'état spécifiques à l'application.
  • Modèle de déploiement indépendant de l'application qui minimise le temps de démarrage des nouvelles applications avec état dans Kubernetes.

KubeDirector permet aux scientifiques des données, habitués aux applications distribuées avec un traitement intensif des données, telles que Hadoop, Spark, Cassandra, TensorFlow, Caffe2, etc., de les exécuter dans Kubernetes avec une courbe d'apprentissage minimale et sans avoir besoin d'écrire du code sur Go. Lorsque ces applications sont contrôlées par KubeDirector, elles sont définies par de simples métadonnées et leur ensemble de configurations associé. Les métadonnées d'application sont définies comme une ressource KubeDirectorApp .

Pour comprendre les composants de KubeDirector, clonez le référentiel sur GitHub avec une commande comme la suivante:

 git clone http://<userid>@github.com/bluek8s/kubedirector. 

La définition de KubeDirectorApp pour l'application Spark 2.2.1 se trouve dans le kubedirector/deploy/example_catalog/cr-app-spark221e2.json :

  ~> cat kubedirector/deploy/example_catalog/cr-app-spark221e2.json 

  { "apiVersion": "kubedirector.bluedata.io/v1alpha1", "kind": "KubeDirectorApp", "metadata": { "name" : "spark221e2" }, "spec" : { "systemctlMounts": true, "config": { "node_services": [ { "service_ids": [ "ssh", "spark", "spark_master", "spark_worker" ], … 

La configuration du cluster d'applications est définie comme une ressource KubeDirectorCluster .

La définition de KubeDirectorCluster pour l'exemple de cluster Spark 2.2.1 est disponible sur kubedirector/deploy/example_clusters/cr-cluster-spark221.e1.yaml :

 ~> cat kubedirector/deploy/example_clusters/cr-cluster-spark221.e1.yaml 

 apiVersion: "kubedirector.bluedata.io/v1alpha1" kind: "KubeDirectorCluster" metadata: name: "spark221e2" spec: app: spark221e2 roles: - name: controller replicas: 1 resources: requests: memory: "4Gi" cpu: "2" limits: memory: "4Gi" cpu: "2" - name: worker replicas: 2 resources: requests: memory: "4Gi" cpu: "2" limits: memory: "4Gi" cpu: "2" - name: jupyter … 

Lancez Spark sur Kubernetes avec KubeDirector


Le démarrage de clusters Spark dans Kubernetes avec KubeDirector est simple.

Tout d'abord, assurez-vous que Kubernetes est en cours d'exécution (version 1.9 ou supérieure) à l'aide de la commande de kubectl version :

 ~> kubectl version Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T18:02:47Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.3", GitCommit:"a4529464e4629c21224b3d52edfe0ea91b072862", GitTreeState:"clean", BuildDate:"2018-09-09T17:53:03Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"} 

Déployez le service KubeDirector et des exemples de KubeDirectorApp ressources KubeDirectorApp à l'aide des commandes suivantes:

 cd kubedirector make deploy 

En conséquence, il commencera sous KubeDirector:

 ~> kubectl get pods NAME READY STATUS RESTARTS AGE kubedirector-58cf59869-qd9hb 1/1 Running 0 1m 

Affichez la liste des applications installées dans KubeDirector en exécutant kubectl get KubeDirectorApp :

 ~> kubectl get KubeDirectorApp NAME AGE cassandra311 30m spark211up 30m spark221e2 30m 

Vous pouvez maintenant démarrer le cluster Spark 2.2.1 à l'aide de l'exemple de fichier pour KubeDirectorCluster et de la commande kubectl create -f deploy/example_clusters/cr-cluster-spark211up.yaml . Vérifiez qu'il a démarré:

 ~> kubectl get pods NAME READY STATUS RESTARTS AGE kubedirector-58cf59869-djdwl 1/1 Running 0 19m spark221e2-controller-zbg4d-0 1/1 Running 0 23m spark221e2-jupyter-2km7q-0 1/1 Running 0 23m spark221e2-worker-4gzbz-0 1/1 Running 0 23m spark221e2-worker-4gzbz-1 1/1 Running 0 23m 

Spark est également apparu dans la liste des services en cours d'exécution:

 ~> kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubedirector ClusterIP 10.98.234.194 <none> 60000/TCP 1d kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d svc-spark221e2-5tg48 ClusterIP None <none> 8888/TCP 21s svc-spark221e2-controller-tq8d6-0 NodePort 10.104.181.123 <none> 22:30534/TCP,8080:31533/TCP,7077:32506/TCP,8081:32099/TCP 20s svc-spark221e2-jupyter-6989v-0 NodePort 10.105.227.249 <none> 22:30632/TCP,8888:30355/TCP 20s svc-spark221e2-worker-d9892-0 NodePort 10.107.131.165 <none> 22:30358/TCP,8081:32144/TCP 20s svc-spark221e2-worker-d9892-1 NodePort 10.110.88.221 <none> 22:30294/TCP,8081:31436/TCP 20s 

Si vous accédez au port 31533 dans votre navigateur, vous pouvez voir l'interface utilisateur de Spark Master:



C'est tout! Dans l'exemple ci-dessus, en plus du cluster Spark, nous avons également déployé le bloc-notes Jupyter .

Pour démarrer une autre application (par exemple, Cassandra), spécifiez simplement un autre fichier avec KubeDirectorApp :

 kubectl create -f deploy/example_clusters/cr-cluster-cassandra311.yaml 

Vérifiez que le cluster Cassandra a démarré:

 ~> kubectl get pods NAME READY STATUS RESTARTS AGE cassandra311-seed-v24r6-0 1/1 Running 0 1m cassandra311-seed-v24r6-1 1/1 Running 0 1m cassandra311-worker-rqrhl-0 1/1 Running 0 1m cassandra311-worker-rqrhl-1 1/1 Running 0 1m kubedirector-58cf59869-djdwl 1/1 Running 0 1d spark221e2-controller-tq8d6-0 1/1 Running 0 22m spark221e2-jupyter-6989v-0 1/1 Running 0 22m spark221e2-worker-d9892-0 1/1 Running 0 22m spark221e2-worker-d9892-1 1/1 Running 0 22m 

Kubernetes exécute désormais le cluster Spark (avec Jupyter Notebook) et le cluster Cassandra. La liste des services peut être consultée avec la commande kubectl get service :

 ~> kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubedirector ClusterIP 10.98.234.194 <none> 60000/TCP 1d kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1d svc-cassandra311-seed-v24r6-0 NodePort 10.96.94.204 <none> 22:31131/TCP,9042:30739/TCP 3m svc-cassandra311-seed-v24r6-1 NodePort 10.106.144.52 <none> 22:30373/TCP,9042:32662/TCP 3m svc-cassandra311-vhh29 ClusterIP None <none> 8888/TCP 3m svc-cassandra311-worker-rqrhl-0 NodePort 10.109.61.194 <none> 22:31832/TCP,9042:31962/TCP 3m svc-cassandra311-worker-rqrhl-1 NodePort 10.97.147.131 <none> 22:31454/TCP,9042:31170/TCP 3m svc-spark221e2-5tg48 ClusterIP None <none> 8888/TCP 24m svc-spark221e2-controller-tq8d6-0 NodePort 10.104.181.123 <none> 22:30534/TCP,8080:31533/TCP,7077:32506/TCP,8081:32099/TCP 24m svc-spark221e2-jupyter-6989v-0 NodePort 10.105.227.249 <none> 22:30632/TCP,8888:30355/TCP 24m svc-spark221e2-worker-d9892-0 NodePort 10.107.131.165 <none> 22:30358/TCP,8081:32144/TCP 24m svc-spark221e2-worker-d9892-1 NodePort 10.110.88.221 <none> 22:30294/TCP,8081:31436/TCP 24m 


PS du traducteur


Si vous êtes intéressé par le projet KubeDirector, vous devez également faire attention à son wiki . Malheureusement, il n'a pas été possible de trouver une feuille de route publique, cependant, les problèmes sur GitHub ont mis en lumière le développement du projet et les opinions de ses principaux développeurs. De plus, pour ceux qui s'intéressent à KubeDirector, les auteurs fournissent des liens vers le chat Slack et Twitter .

Lisez aussi dans notre blog:

Source: https://habr.com/ru/post/fr428451/


All Articles