连接到现有的Kubernetes Dask集群

时间:2020-03-13 17:16:55

标签: python kubernetes dask kubernetes-helm dask-kubernetes

我使用Helm创建了一个Dask集群。

NAME                               READY   STATUS    RESTARTS   AGE
dask01-jupyter-aaa-aaaa            1/1     Running   0          3d19h
dask01-scheduler-bbb-bbbb          1/1     Running   0          3d19h
dask01-worker-ccc-cccc             1/1     Running   0          3d19h
dask01-worker-ddd-dddd             1/1     Running   0          3d19h
dask01-worker-eee-eeee             1/1     Running   0          3d19h

我可以运行基本的Dask工作负载。

import dask.array as da

array = da.ones((1000, 1000, 1000), chunks=(100, 100, 10))

现在,我想以某种方式将其连接到客户端:

from dask import distributed

cluster = None # TODO: configure KubeCluster somehow https://kubernetes.dask.org/en/latest/
client = distributed.Client(cluster)

如果我想launch a cluster可以使用:

from dask_kubernetes import KubeCluster

cluster = KubeCluster.from_yaml('worker-spec.yml')

但是如何连接到现有集群?

2 个答案:

答案 0 :(得分:1)

Dask Helm Chart和ID LOCATION COUNTER1 1 3 1 2 3 1 3 2 2 4 2 2 5 3 3 6 1 4 7 3 5 8 3 5 9 3 5 是两个单独的项目,它们以不同的方式工作。它们不兼容。

如果您正在使用作为舵图的一部分创建的Jupyter笔记本,则已经为您配置了所有内容,您可以使用默认选项创建Dask客户端。

dask-kubernetes

如果要使用其他Python环境(例如本地计算机上的环境),则必须指定调度程序的远程地址。这将取决于您如何配置Helm Chart。

例如,如果您通过负载平衡器公开了调度程序,则需要将客户端指向它。

from distributed import Client
client = Client()

如果您获得Helm Chart部署的状态,它将在打印的注释中显示有关如何连接到调度程序的信息。

from distributed import Client
client = Client('tcp://<load balancer ip>:8786')

答案 1 :(得分:0)

如果您已经安装了Dask Helm软件包,则可以使用kubectl检索TCP连接地址以传递给distributed.Client。例如,如果您选择使用dask-abc分布式的Helm发布名称。在helm install中-请参见here-在设置集群时,可以遵循Dask Helm and Kubernetes docs并将kubectl get servicesjsonpath一起使用以过滤此命令的输出并仅检索Dask调度程序服务的IP地址(将命名为dask-abc-scheduler)。

Here是将kubectl get podsjsonpath一起使用以获取容器名称的类似示例(请参阅以pods=$(开头的行)。您必须使用--watch标志等到服务的IP地址可用(请参阅here Note 部分)

$ export RELEASE_NAME=dask-abc

# wait until load balancer EXTERNAL_IP is available
$ kubectl get services --wait $RELEASE_NAME-scheduler

# get Dask scheduler address
$ dask_scheduler=$(kubectl get services \
      $RELEASE_NAME-scheduler \
      --output=jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ echo $dask_scheduler

然后,上面打印的dask_scheduler地址可以在您的Python代码传递给distributed.Client()的网址中使用

> client_connection_url = "tcp://<dask-scheduler>:8786"
> client = distributed.client(client_connection_url)
> print(client)
.
.
.
.