测试

运行 dask-kubernetes 的测试套件不需要现有的 Kubernetes 集群,但需要 Dockerkubectlhelm

首先以可编辑模式安装 dask-kubernetes - 这将确保 pytest 可以导入 dask-kubernetes

$ pip install -e .

您还需要安装测试依赖项

$ pip install -r requirements-test.txt

测试使用 pytest 运行

$ pytest
============================================== test session starts ==============================================
platform darwin -- Python 3.8.8, pytest-6.2.2, py-1.10.0, pluggy-0.13.1 --
cachedir: .pytest_cache
rootdir: /Users/jtomlinson/Projects/dask/dask-kubernetes, configfile: setup.cfg
plugins: anyio-2.2.0, asyncio-0.14.0, kind-21.1.3
collected 64 items

...
================= 56 passed, 1 skipped, 6 xfailed, 1 xpassed, 53 warnings in 404.19s (0:06:44) ==================

注意

运行 pytest 从源编译自定义资源定义 (CRD),使用 k8s-crd-resolver 进行测试,然后将其卸载。您可能需要手动再次安装它们。

Kind

为了针对真实的 Kubernetes 集群测试 dask-kubernetes,我们使用 pytest-kind 插件。

Kind 是 Kubernetes in Docker 的缩写,它将在您系统上的单个 Docker 容器中创建一个完整的 Kubernetes 集群。Kubernetes 随后将利用底层 containerd 运行时启动额外的容器,因此您的 Kubernetes Pod 不会出现在您的 docker ps 输出中。

默认情况下,我们在 setup.cfg 中设置了 --keep-cluster 标志,这意味着 Kubernetes 容器将在 pytest 运行之间持久存在,以避免创建/销毁时间。因此,当您完成 dask-kubernetes 的工作后,您可能希望手动移除该容器。

$ docker stop pytest-kind-control-plane
$ docker rm pytest-kind-control-plane

当您首次运行测试时,会创建一个名为 .pytest-kind/pytest-kind/kubeconfig 的配置文件,用于与容器中运行的 Kubernetes 集群进行身份验证。如果您希望出于调试目的自行检查集群,可以将环境变量 KUBECONFIG 设置为指向该文件,然后像往常一样使用 kubectlhelm

$ export KUBECONFIG=.pytest-kind/pytest-kind/kubeconfig
$ kubectl get nodes
NAME                        STATUS   ROLES                  AGE   VERSION
pytest-kind-control-plane   Ready    control-plane,master   10m   v1.20.2
$ helm list
NAME    NAMESPACE       REVISION        UPDATED STATUS  CHART   APP VERSION

Docker 镜像

在测试套件中有一个 fixture,它从 这个 Dockerfile 创建一个名为 dask-kubernetes:dev 的 Docker 镜像。这个镜像将被导入到 kind 集群中,然后在所有创建的 Dask 集群中使用。这是官方的 Dask Docker 镜像,但安装了 daskdistributed 的最新主干版本。建议您也在本地开发环境中安装这些项目的最新开发版本。

随着时间的推移,此镜像可能会过时,因此您可能需要定期删除它,以确保使用最新的代码更改重新创建它。

$ docker rmi dask-kubernetes:dev

代码检查和格式化

为了接受对 dask-kubernetes 的拉取请求 (Pull Requests),我们要求它们通过 black 格式化和 flake8 代码检查。

为了节省开发者时间,我们支持使用 pre-commit,它会在您每次尝试本地提交代码时运行 blackflake8

$ pip install pre-commit
$ pre-commit install

测试操作符控制器 PRs

有时您可能希望在操作符控制器更改的 PR 合并之前试用它们。

为此,您需要构建一个自定义 Docker 镜像并将其推送到您的 k8s 集群可以拉取的仓库。

自定义镜像需要基于控制器的最新稳定版本,并将开发分支安装到其中。您可以使用 pip 直接从 GitHub 仓库执行此操作,或者复制本地文件并进行安装。

FROM ghcr.io/dask/dask-kubernetes-operator:<latest stable release>

RUN pip install git+https://github.com/dask/dask-kubernetes.git@refs/pull/<PR>/head
$ docker build -t <image>:<tag> .
$ docker push -t <image>:<tag> .

然后您可以使用 helm 并指定您的自定义镜像来安装控制器。

$ helm install --repo https://helm.dask.org \
    --create-namespace \
    -n dask-operator \
    --generate-name \
    dask-kubernetes-operator \
    --set image.name=<image> \
    --set image.tag=<tag>