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: