Kubernetes#
根据您的用例,RAPIDS 可以通过多种方式与 Kubernetes 集成。
交互式 Notebook#
对于单用户交互式会话,您可以运行包含带有 RAPIDS 库和 Jupyter 的 conda 环境的 RAPIDS docker 镜像,用于交互式使用。
您可以将其作为 Pod
直接在 Kubernetes 上运行,并通过 Service
暴露 Jupyter。例如
# rapids-notebook.yaml apiVersion: v1 kind: Service metadata: name: rapids-notebook labels: app: rapids-notebook spec: type: NodePort ports: - port: 8888 name: http targetPort: 8888 nodePort: 30002 selector: app: rapids-notebook --- apiVersion: v1 kind: Pod metadata: name: rapids-notebook labels: app: rapids-notebook spec: securityContext: fsGroup: 0 containers: - name: rapids-notebook image: "nvcr.io/nvidia/rapidsai/notebooks:25.04-cuda12.8-py3.12" resources: limits: nvidia.com/gpu: 1 ports: - containerPort: 8888 name: notebook
可选:扩展 notebook 配置以支持启动多节点 Dask 集群
部署交互式单用户 notebook 可以为启动更多资源提供一个绝佳场所。例如,您可以安装 dask-kubernetes
并使用 dask-operator 从您的 notebook 创建多节点 Dask 集群。
要做到这一点,您需要在启动您的 notebook Pod
时创建一些额外的资源。
服务账户和角色
为了能够从您的 notebook 内部与 Kubernetes API 交互并创建 Dask 资源,您需要创建一个带有附加角色的服务账户。
apiVersion: v1
kind: ServiceAccount
metadata:
name: rapids-dask
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: rapids-dask
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list"]
- apiGroups: [kubernetes.dask.org]
resources: ["*"]
verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: rapids-dask
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: rapids-dask
subjects:
- kind: ServiceAccount
name: rapids-dask
然后,您需要通过引用此服务账户来增强上面的 Pod
规范。
apiVersion: v1
kind: Pod
metadata:
name: rapids-notebook
labels:
app: rapids-notebook
spec:
serviceAccountName: rapids-dask
...
代理 Dask Dashboard 和其他服务
RAPIDS 容器预装了 jupyter-server-proxy 插件,您可以使用它通过 Jupyter URL 访问在您的 notebook 中运行的其他服务。然而,默认情况下,这仅限于代理在您的 Jupyter Pod 中运行的服务。为了访问 Kubernetes 集群中已启动的其他资源(如 Dask 集群),我们需要配置 Jupyter 以允许这样做。
首先,我们创建一个包含配置文件的 ConfigMap
。
apiVersion: v1
kind: ConfigMap
metadata:
name: jupyter-server-proxy-config
data:
jupyter_server_config.py: |
c.ServerProxy.host_allowlist = lambda app, host: True
然后,我们进一步修改我们的 Pod
规范,将此 config map 挂载到正确的位置。
apiVersion: v1
kind: Pod
...
spec:
containers
- name: rapids-notebook
...
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
我们可能还需要配置 Dask,让它知道通过代理 URL 到哪里查找 Dashboard。我们可以在我们的 Pod
中通过环境变量设置此项。
apiVersion: v1
kind: Pod
...
spec:
containers
- name: rapids-notebook
...
env:
- name: DASK_DISTRIBUTED__DASHBOARD__LINK
value: "/proxy/{host}:{port}/status"
整合所有配置
这里有一个扩展的 rapids-notebook.yaml
规范,将所有这些整合在一起。
# rapids-notebook.yaml (extended) apiVersion: v1 kind: ServiceAccount metadata: name: rapids-dask --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: rapids-dask rules: - apiGroups: [""] resources: ["pods", "services"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["pods/log"] verbs: ["get", "list"] - apiGroups: [kubernetes.dask.org] resources: ["*"] verbs: ["*"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: rapids-dask roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: rapids-dask subjects: - kind: ServiceAccount name: rapids-dask --- apiVersion: v1 kind: ConfigMap metadata: name: jupyter-server-proxy-config data: jupyter_server_config.py: | c.ServerProxy.host_allowlist = lambda app, host: True --- apiVersion: v1 kind: Service metadata: name: rapids-notebook labels: app: rapids-notebook spec: type: ClusterIP ports: - port: 8888 name: http targetPort: notebook selector: app: rapids-notebook --- apiVersion: v1 kind: Pod metadata: name: rapids-notebook labels: app: rapids-notebook spec: serviceAccountName: rapids-dask securityContext: fsGroup: 0 containers: - name: rapids-notebook image: nvcr.io/nvidia/rapidsai/notebooks:25.04-cuda12.8-py3.12 resources: limits: nvidia.com/gpu: 1 ports: - containerPort: 8888 name: notebook env: - name: DASK_DISTRIBUTED__DASHBOARD__LINK value: "/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
$ kubectl apply -f rapids-notebook.yaml
通过 NodePort
服务,这使得 Jupyter 可以在您的 Kubernetes 节点的 30002
端口上访问。或者,如果您配置了 LoadBalancer
服务类型,或者使用 ClusterIP
并使用 kubectl
在本地进行端口转发,也可以通过这种方式访问它。
$ kubectl port-forward service/rapids-notebook 8888
然后您可以在浏览器中打开 8888
端口以访问 Jupyter 并使用 RAPIDS。

Dask Operator#
Dask 提供了一个 Operator,使用户能够将 Dask 集群作为原生 Kubernetes 资源创建。这对于动态、灵活地创建、伸缩和删除 Dask 集群非常有用。通常,这与交互式会话结合使用,例如上面的 交互式 notebook 示例,或来自其他服务(如 KubeFlow Notebooks)。通过在 Kubernetes 上动态启动配置为使用 RAPIDS 的 Dask 集群,用户可以将其 notebook 会话扩展到分布在多个节点上的许多 GPU。
在 Dask Operator 页面上了解更多信息。
Helm Chart#
个人用户也可以安装 Dask Helm Chart,它提供了一个运行 Jupyter 的 Pod
以及一个由运行 Dask 调度器和工作组件的 Pod 组成的 Dask 集群。您可以定制此 Helm Chart 以将 RAPIDS 容器镜像作为 notebook 服务器和 Dask 集群组件运行,以便所有部分都能受益于 GPU 加速。
在 Dask Helm Chart 页面上了解更多信息。
Dask Gateway#
一些组织可能希望将 Dask 集群配置作为一个中心服务提供,让用户不必关注底层的平台(如 Kubernetes)。这对于降低用户权限、限制用户可消耗的资源以及以集中方式暴露服务非常有用。为此,您可以部署 Dask Gateway,它提供了一个用户可以通过编程方式与之交互的服务器,然后该服务器在 Kubernetes 上启动 Dask 集群并将连接代理回给用户。
用户可以配置他们希望 Dask 集群的样子,因此可以利用 GPU 和 RAPIDS 来构建加速集群。
KubeFlow#
如果您正在使用 KubeFlow,您可以通过在 notebook 和 pipeline 中使用 RAPIDS 容器镜像,以及使用 Dask Operator 启动 GPU 加速的 Dask 集群,从而立即集成 RAPIDS。
在 KubeFlow 页面上了解更多信息。