安装

Python 包

您可以使用 pipconda 或从源代码安装 dask-kubernetes。

Pip

Pip 可用于安装 dask-kubernetes 及其 Python 依赖项

pip install dask-kubernetes --upgrade  # Install everything from last released version

Conda

要使用 condaconda-forge 仓库安装最新版本的 dask-kubernetes

conda install dask-kubernetes -c conda-forge

从源代码安装

要从源代码安装 dask-kubernetes,请从 github 克隆仓库

git clone https://github.com/dask/dask-kubernetes.git
cd dask-kubernetes
python setup.py install

或者如果您想同时安装所有依赖项,请在本地使用 pip

pip install -e .

您也可以直接从 git main 分支安装

pip install git+https://github.com/dask/dask-kubernetes

Operator

要使用 Dask Operator,您必须安装自定义资源定义、Service Account、Roles 以及 Operator 控制器部署。

快速入门

$ helm install --repo https://helm.dask.org --create-namespace -n dask-operator --generate-name dask-kubernetes-operator
_images/operator-install.gif

使用 Helm 安装

该 Operator 具有 Helm Chart,可用于管理 Operator 的安装。该 Chart 发布在 Dask Helm repo 仓库中,可通过以下方式安装

$ helm repo add dask https://helm.dask.org
"dask" has been added to your repositories

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "dask" chart repository
Update Complete. ⎈Happy Helming!⎈

$ helm install --create-namespace -n dask-operator --generate-name dask/dask-kubernetes-operator
NAME: dask-kubernetes-operator-1666875935
NAMESPACE: dask-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Operator has been installed successfully.

然后您应该能够通过 kubectl 列出您的 Dask 集群。

$ kubectl get daskclusters
No resources found in default namespace.

我们也可以检查 Operator Pod 是否正在运行

$ kubectl get pods -A -l app.kubernetes.io/name=dask-kubernetes-operator
NAMESPACE       NAME                                        READY   STATUS    RESTARTS   AGE
dask-operator   dask-kubernetes-operator-775b8bbbd5-zdrf7   1/1     Running   0          74s

警告

请注意,Helm 不支持更新或删除 CRD。 如果将来版本中对 CRD 模板进行了更新(例如为了支持未来的 k8s 版本),您可能需要手动更新 CRD 或删除/重新安装 Dask Operator。

单个命名空间

默认情况下,控制器使用 ClusterRole 安装并监听所有命名空间。您也可以通过设置以下选项将其仅安装到单个命名空间中。

$ helm install -n my-namespace --generate-name dask/dask-kubernetes-operator --set rbac.cluster=false --set kopfArgs="{--namespace=my-namespace}"
NAME: dask-kubernetes-operator-1749875935
NAMESPACE: my-namespace
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Operator has been installed successfully.

Prometheus

Operator Helm Chart 还包含一些可选的 ServiceMonitorPodMonitor 资源,用于启用 Prometheus 抓取 Dask 组件的数据。由于并非所有集群都安装了 Prometheus Operator,这些资源默认是禁用的。您可以使用以下配置选项启用它们。

metrics:
   scheduler:
      enabled: true
      serviceMonitor:
         enabled: true
   worker:
      enabled: true
      serviceMonitor:
         enabled: true

您还需要确保您为 Dask 组件选择的容器镜像安装了 prometheus_client 库。如果您使用的是官方 Dask 镜像,可以在运行时安装它。

from dask_kubernetes.operator import KubeCluster
cluster = KubeCluster(name="monitored", env={"EXTRA_PIP_PACKAGES": "prometheus_client"})

Chart 配置参考

Dask-kubernetes-operator

用于管理 dask kubernetes operator 和 CRD 部署的 helm chart

配置

下表列出了 Dask-kubernetes-operator Chart 的可配置参数及其默认值。

参数

描述

默认值

image.name

Operator 的 Docker 镜像

"ghcr.io/dask/dask-kubernetes-operator"

image.tag

发布版本

"set-by-chartpress"

image.pullPolicy

拉取策略

"IfNotPresent"

imagePullSecrets

私有仓库的镜像拉取密钥

[]

nameOverride

覆盖发布名称(不包含随机 UUID)

""

fullnameOverride

覆盖完整发布名称

""

serviceAccount.create

为 Operator 创建要使用的 Service Account

true

serviceAccount.annotations

要添加到 Service Account 的注解

{}

serviceAccount.name

要使用的 Service Account 名称。如果未设置且 create 为 true,则使用 fullname 模板生成名称。

""

rbac.create

创建 Operator 所需的 Role/ClusterRole 并将其绑定到 Service Account

true

rbac.cluster

如果为 true,则创建 ClusterRole,否则创建命名空间范围的 Role

true

podAnnotations

Operator Pod 的额外注解

{}

podSecurityContext

Operator Pod 的安全上下文

{}

securityContext.capabilities.drop

["ALL"]

securityContext.runAsNonRoot

true

securityContext.runAsUser

1000

securityContext.allowPrivilegeEscalation

false

securityContext.readOnlyRootFilesystem

true

resources

Operator Pod 的资源

{}

volumes

Operator Pod 的卷

[]

volumeMounts

Operator 容器的卷挂载

[]

extraEnv

Operator 容器的额外环境变量

[]

nodeSelector

节点选择器

{}

tolerations

容忍度

[]

affinity

亲和性

{}

priorityClassName

优先级类

null

livenessProbe.timeoutSeconds

5

kopfArgs

启动时传递给 kopf 的命令行标志

["--all-namespaces"]

metrics.scheduler.enabled

启用调度器指标。Pip 包 [prometheus-client](https://pypi.ac.cn/project/prometheus-client/) 应存在于调度器上。

false

metrics.scheduler.serviceMonitor.enabled

启用调度器 servicemonitor。

false

metrics.scheduler.serviceMonitor.namespace

在不同的命名空间部署 servicemonitor,例如 monitoring。

""

metrics.scheduler.serviceMonitor.namespaceSelector

用于选择发现 Endpoints 对象的命名空间的 Selector。

{}

metrics.scheduler.serviceMonitor.additionalLabels

添加到 ServiceMonitor metadata 的额外标签。

{}

metrics.scheduler.serviceMonitor.interval

抓取指标的间隔。

"15s"

metrics.scheduler.serviceMonitor.jobLabel

用于从中检索作业名称的标签。

""

metrics.scheduler.serviceMonitor.targetLabels

TargetLabels 将 Kubernetes Service 上的标签转移到目标上。

["dask.org/cluster-name"]

metrics.scheduler.serviceMonitor.metricRelabelings

在摄取之前应用于样本的 MetricRelabelConfigs。

[]

metrics.worker.enabled

启用 worker 指标。Pip 包 [prometheus-client](https://pypi.ac.cn/project/prometheus-client/) 应存在于 worker 上。

false

metrics.worker.podMonitor.enabled

启用 worker podmonitor

false

metrics.worker.podMonitor.namespace

在不同的命名空间部署 podmonitor,例如 monitoring。

""

metrics.worker.podMonitor.namespaceSelector

用于选择发现 Endpoints 对象的命名空间的 Selector。

{}

metrics.worker.podMonitor.additionalLabels

添加到 PodMonitor metadata 的额外标签。

{}

metrics.worker.podMonitor.interval

抓取指标的间隔。

"15s"

metrics.worker.podMonitor.jobLabel

用于从中检索作业名称的标签。

""

metrics.worker.podMonitor.podTargetLabels

PodTargetLabels 将 Kubernetes Pod 上的标签转移到目标上。

["dask.org/cluster-name", "dask.org/workergroup-name"]

metrics.worker.podMonitor.metricRelabelings

在摄取之前应用于样本的 MetricRelabelConfigs。

[]

workerAllocation.size

null

workerAllocation.delay

null


Helm Chart 参考,由 sphinx-helm 生成 <https://sphinx-helm.readthedocs.io>`_。

使用 Manifests 安装

如果您更喜欢使用 kubectl 从静态 Manifests 安装 Operator,并使用 kustomize 等工具设置配置选项,您可以使用以下命令生成默认 Manifests

$ helm template --include-crds --repo https://helm.dask.org release dask-kubernetes-operator | kubectl apply -f -

Kubeflow

为了将 Dask Operator 与 Kubeflow 一起使用,您需要执行一些额外的安装步骤。

用户权限

Kubeflow 不知道关于我们的 Dask 自定义资源定义的任何信息,因此我们需要更新 kubeflow-kubernetes-edit 集群角色。此角色允许具有集群编辑权限的用户创建 Pod、Job 和其他资源,我们需要将 Dask 自定义资源添加到该列表中。编辑现有的 clusterrole 并在 rules 部分为 kubernetes.dask.org 添加一个新规则,允许对我们 API 命名空间中的所有自定义资源执行所有操作。

$ kubectl patch clusterrole kubeflow-kubernetes-edit --type="json" --patch '[{"op": "add", "path": "/rules/-", "value": {"apiGroups": ["kubernetes.dask.org"],"resources": ["*"],"verbs": ["*"]}}]'
clusterrole.rbac.authorization.k8s.io/kubeflow-kubernetes-edit patched

Dashboard 访问

如果您正在使用 KubeFlow 中的 Jupyter Notebook 服务,则需要执行一些额外的步骤才能访问 Dask dashboard。dashboard 将在调度器 Pod 上运行,并通过调度器 Service 访问,因此要访问它,您的 Jupyter 容器需要安装 jupyter-server-proxy 扩展。如果您正在使用 Dask Jupter Lab extension,则将自动为您安装。

默认情况下,代理只允许代理与 Jupyter 服务器运行在同一主机上的其他服务,这意味着您无法访问在另一个 Pod 中运行的调度器。因此,您需要设置一些额外的配置来告诉代理允许哪些主机。鉴于我们已经可以在 Jupyter 中执行任意代码(从而与 Kubernetes 集群中的其他服务交互),我们可以通过 c.ServerProxy.host_allowlist = lambda app, host: True 允许代理设置中的所有主机。

The dask_kubernetes.operator.KubeClusterdistributed.Client 对象都有一个 dashboard_link 属性,您可以查看该属性以找到 dashboard 的 URL,该属性也用于 Jupyter 中显示的 widget。默认链接在 KubeFlow 上不起作用,因此您需要将其更改为 "{NB_PREFIX}/proxy/{host}:{port}/status" 以确保它使用 Jupyter 代理。

要将这些配置选项应用于 Jupyter Pod,您可以创建一个 PodDefault 配置对象,该对象可以在启动 notebook 时选择。创建一个新文件,内容如下。

# configure-dask-dashboard.yaml
apiVersion: "kubeflow.org/v1alpha1"
kind: PodDefault
metadata:
name: configure-dask-dashboard
spec:
selector:
   matchLabels:
      configure-dask-dashboard: "true"
desc: "configure dask dashboard"
env:
   - name: DASK_DISTRIBUTED__DASHBOARD__LINK
      value: "{NB_PREFIX}/proxy/{host}:{port}/status"
volumeMounts:
   - name: jupyter-server-proxy-config
   mountPath: /root/.jupyter/jupyter_server_config.py
   subPath: jupyter_server_config.py
volumes:
   - name: jupyter-server-proxy-config
   configMap:
      name: jupyter-server-proxy-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: jupyter-server-proxy-config
data:
jupyter_server_config.py: |
   c.ServerProxy.host_allowlist = lambda app, host: True

然后使用 kubectl 将其应用于您的 KubeFlow 用户命名空间。例如,对于默认用户 user@example.com,它将是。

$ kubectl apply -n kubeflow-user-example-com -f configure-dask-dashboard.yaml

然后当您启动 Jupyter Notebook 服务器时,请务必勾选 configure dask dashboard 配置选项。

The KubeFlow Notebook Configuration selector showing the "configure dask dashboard" option checked

支持的版本

Python

所有 Dask 项目通常遵循 NEP 29 Python 弃用策略,其中每个 Python 次要版本都支持 42 个月。由于 Python 的发布周期为 12 个月,这确保至少支持当前版本和前两个版本。

Dask Kubernetes CI 会针对所有支持的 Python 版本测试所有 PR。

Kubernetes

对于 Kubernetes,我们遵循 年度支持 KEP。由于发布周期为 4-6 个月,这也确保至少支持当前版本和前两个版本。

Dask Kubernetes CI 会针对所有支持的 Kubernetes 版本测试所有 PR。

注意

为了缩小 CI 矩阵,我们将所有 Kubernetes 版本针对最新的 Python 进行测试,并将所有 Python 版本针对最新的 Kubernetes 进行测试。我们不对较旧的 Python 和 Kubernetes 版本进行组合测试。有关更多信息,请参阅 dask/dask-kubernetes#559