连接到现有Kubernetes Dask群集

2024-04-26 04:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

使用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')

但如何连接到现有集群


Tags: fromimport集群arrayrunningkubernetesdaskdistributed
2条回答

如果您已经安装了Dask-Helm包,那么可以使用kubectl检索要传递给distributed.Client的TCP连接地址。例如,如果您选择使用dask-abc分发的头盔发布名称。在helm install-请参见here-设置集群时,您可以跟随Dask Helm and Kubernetes docs并使用kubectl get services^{}来过滤此命令的输出,并仅检索Dask调度程序服务(将命名为dask-abc-scheduler)的IP地址

Here是使用kubectl get podsjsonpath来获取POD名称的类似示例(请参见以pods=$(开头的行)。您必须使用 watch标志等待服务的IP地址可用(请参阅here中的注释部分)

$ 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()的url中使用

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

Dask-Helm图表和dask-kubernetes是两个以不同方式工作的独立项目。它们不能兼容在一起

如果您使用的是Jupyter笔记本,它是作为Helm图表的一部分创建的,那么一切都已经为您配置好了,您可以使用默认选项创建Dask客户端

from distributed import Client
client = Client()

如果希望使用不同的Python环境,例如本地计算机上的环境,则必须指定调度程序的远程地址。这取决于您如何配置舵图

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

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

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

helm status <depoyment name>

相关问题 更多 >