注意事项 佩雷夫 答:原始文章是由BlueData的代表撰写的,BlueData是一家由VMware人士创立的公司。 她专注于使各种环境下的大数据分析和机器学习部署解决方案更容易(更轻松,更快速,更便宜)。 公司最近发起了一项名为BlueK8s的计划 ,在此计划中,作者希望组建大量的开放源代码工具,以“在Kubernetes中部署有状态的应用程序并对其进行管理”,为此做出了贡献。 本文专门针对其中的第一个-KubeDirector,据作者所述,它帮助没有在Kubernetes中接受特殊培训的大数据领域的发烧友在K8s中部署Spark,Cassandra或Hadoop之类的应用程序。 本文提供了有关如何执行此操作的简要说明。 但是,请记住,该项目具有早期准备状态-前Alpha。
KubeDirector是一个开源项目,旨在简化Kubernetes中复杂的可扩展有状态应用程序中集群的启动。 KubeDirector使用
自定义资源定义 (CRD)框架实现,使用本机Kubernetes API扩展功能,并依赖于它们的理念。 这种方法提供了与Kubernetes中的用户和资源管理以及现有客户端和实用程序的透明集成。
最近宣布的 KubeDirector项目是Kubernetes一项名为BlueK8s的大型开源计划的一部分。 现在,我很高兴地宣布早期(pre-alpha)
KubeDirector代码的可用性。 这篇文章将展示其工作原理。
KubeDirector提供以下功能:
- 除了来自Kubernetes的原生云之外,无需修改代码即可运行有状态应用程序。 换句话说,不需要分解现有应用程序以匹配微服务架构模式。
- 对存储特定于应用程序的配置和状态的本机支持。
- 与应用程序无关的部署模式,可最大程度地缩短Kubernetes中新的有状态应用程序的启动时间。
KubeDirector允许习惯于具有密集数据处理功能的分布式应用程序的数据科学家(例如Hadoop,Spark,Cassandra,TensorFlow,Caffe2等)在Kubernetes中运行它们,而学习曲线却很少,而无需在Go上编写代码。 当这些应用程序由KubeDirector控制时,它们是由简单的元数据和相关的配置集定义的。 应用程序元数据定义为
KubeDirectorApp
资源。
要了解KubeDirector的组件,请
使用以下命令在
GitHub上克隆存储库:
git clone http://<userid>@github.com/bluek8s/kubedirector.
Spark 2.2.1应用程序的
KubeDirectorApp
定义位于
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" ], …
应用程序集群配置定义为
KubeDirectorCluster
资源。
Spark 2.2.1群集示例的
KubeDirectorCluster
定义位于
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 …
使用KubeDirector在Kubernetes上启动Spark
使用KubeDirector在Kubernetes中启动Spark集群很容易。
首先,使用
kubectl version
命令确保Kubernetes正在运行(1.9或更高
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"}
使用以下命令部署KubeDirector服务和示例
KubeDirectorApp
资源
KubeDirectorApp
:
cd kubedirector make deploy
结果,它将以KubeDirector开始:
~> kubectl get pods NAME READY STATUS RESTARTS AGE kubedirector-58cf59869-qd9hb 1/1 Running 0 1m
通过运行
kubectl get KubeDirectorApp
查看在KubeDirector中安装的应用程序列表:
~> kubectl get KubeDirectorApp NAME AGE cassandra311 30m spark211up 30m spark221e2 30m
现在,您可以使用
KubeDirectorCluster
的示例文件和
kubectl create -f deploy/example_clusters/cr-cluster-spark211up.yaml
启动Spark 2.2.1集群。 检查它是否已经开始:
~> 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也出现在正在运行的服务列表中:
~> 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
如果在浏览器中访问端口31533,则可以看到Spark Master UI:

仅此而已! 在上面的示例中,除了Spark集群,我们还部署了
Jupyter Notebook 。
要启动另一个应用程序(例如,Cassandra),只需使用
KubeDirectorApp
指定另一个文件:
kubectl create -f deploy/example_clusters/cr-cluster-cassandra311.yaml
验证Cassandra集群已启动:
~> 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现在运行Spark集群(使用Jupyter Notebook)和Cassandra集群。 服务列表可以通过
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
如果您对KubeDirector项目感兴趣,则还应注意
其wiki 。 不幸的是,无法找到公开的路线图,但是,
GitHub上的
问题阐明了该项目的进展及其主要开发人员的观点。 此外,对于那些对KubeDirector感兴趣的人,作者提供了
Slack chat和
Twitter的链接。
另请参阅我们的博客: