diff --git a/content/zh-cn/docs/tasks/job/fine-parallel-processing-work-queue.md b/content/zh-cn/docs/tasks/job/fine-parallel-processing-work-queue.md index 8f6c0d5637..0042a26b63 100644 --- a/content/zh-cn/docs/tasks/job/fine-parallel-processing-work-queue.md +++ b/content/zh-cn/docs/tasks/job/fine-parallel-processing-work-queue.md @@ -1,23 +1,22 @@ --- title: 使用工作队列进行精细的并行处理 content_type: task -min-kubernetes-server-version: v1.8 weight: 30 --- -在这个例子中,我们会运行一个 Kubernetes Job,其中的 Pod 会运行多个并行工作进程。 +在此示例中,你将运行一个 Kubernetes Job,该 Job 将多个并行任务作为工作进程运行, +每个任务在单独的 Pod 中运行。 -1. **启动存储服务用于保存工作队列。** 在这个例子中,我们使用 Redis 来存储工作项。 - 在上一个例子中,我们使用了 RabbitMQ。 +1. **启动存储服务用于保存工作队列。** 在这个例子中,你将使用 Redis 来存储工作项。 + 在[上一个例子中](/zh-cn/docs/tasks/job/coarse-parallel-processing-work-queue), + 你使用了 RabbitMQ。 在这个例子中,由于 AMQP 不能为客户端提供一个良好的方法来检测一个有限长度的工作队列是否为空, - 我们使用了 Redis 和一个自定义的工作队列客户端库。 + 你将使用 Redis 和一个自定义的工作队列客户端库。 在实践中,你可能会设置一个类似于 Redis 的存储库,并将其同时用于多项任务或其他事务的工作队列。 +你将需要一个容器镜像仓库,可以向其中上传镜像以在集群中运行。 +此示例使用的是 [Docker Hub](https://hub.docker.com/), +当然你可以将其调整为别的容器镜像仓库。 + +此任务示例还假设你已在本地安装了 Docker,并使用 Docker 来构建容器镜像。 + ## 启动 Redis -对于这个例子,为了简单起见,我们将启动一个单实例的 Redis。 +对于这个例子,为了简单起见,你将启动一个单实例的 Redis。 了解如何部署一个可伸缩、高可用的 Redis 例子,请查看 [Redis 示例](https://github.com/kubernetes/examples/tree/master/guestbook) @@ -97,9 +112,9 @@ You could also download the following files directly: - [`worker.py`](/examples/application/job/redis/worker.py) 现在按回车键,启动 Redis 命令行界面,然后创建一个存在若干个工作项的列表。 ```shell -# redis-cli -h redis +redis-cli -h redis +``` +```console redis:6379> rpush job2 "apple" (integer) 1 redis:6379> rpush job2 "banana" @@ -158,9 +175,9 @@ redis:6379> lrange job2 0 -1 ``` -因此,这个键为 `job2` 的列表就是我们的工作队列。 +因此,这个键为 `job2` 的列表就是工作队列。 -## 创建镜像 +## 创建容器镜像 {#create-an-image} -现在我们已经准备好创建一个我们要运行的镜像。 +现在你已准备好创建一个镜像来处理该队列中的工作。 -我们会使用一个带有 Redis 客户端的 Python 工作程序从消息队列中读出消息。 +你将使用一个带有 Redis 客户端的 Python 工作程序从消息队列中读出消息。 -这里提供了一个简单的 Redis 工作队列客户端库,名为 rediswq.py ([下载](/examples/application/job/redis/rediswq.py))。 +这里提供了一个简单的 Redis 工作队列客户端库,名为 `rediswq.py` +([下载](/zh-cn/examples/application/job/redis/rediswq.py))。 你也可以下载 [`worker.py`](/examples/application/job/redis/worker.py)、 [`rediswq.py`](/examples/application/job/redis/rediswq.py) 和 -[`Dockerfile`](/examples/application/job/redis/Dockerfile) 文件。然后构建镜像: +[`Dockerfile`](/examples/application/job/redis/Dockerfile) 文件。然后构建容器镜像。 +以下是使用 Docker 进行镜像构建的示例: ```shell docker build -t job-wq-2 . @@ -234,52 +253,40 @@ your private repository](/docs/concepts/containers/images/). 你需要将镜像 push 到一个公共仓库或者 [配置集群访问你的私有仓库](/zh-cn/docs/concepts/containers/images/)。 - -如果你使用的是 [Google Container Registry](https://cloud.google.com/tools/container-registry/), -请先用你的 project ID 给你的镜像打上标签,然后 push 到 GCR。请将 `` 替换为你自己的 project ID。 - -```shell -docker tag job-wq-2 gcr.io//job-wq-2 -gcloud docker -- push gcr.io//job-wq-2 -``` - ## 定义一个 Job -这是 Job 定义: +以下是你将创建的 Job 的清单: {{% code_sample file="application/job/redis/job.yaml" %}} +{{< note >}} -请确保将 Job 模板中的 `gcr.io/myproject` 更改为你自己的路径。 +请确保将 Job 清单中的 `gcr.io/myproject` 更改为你自己的路径。 +{{< /note >}} 在这个例子中,每个 Pod 处理了队列中的多个项目,直到队列中没有项目时便退出。 因为是由工作程序自行检测工作队列是否为空,并且 Job 控制器不知道工作队列的存在, 这依赖于工作程序在完成工作时发出信号。 工作程序以成功退出的形式发出信号表示工作队列已经为空。 -所以,只要有任意一个工作程序成功退出,控制器就知道工作已经完成了,所有的 Pod 将很快会退出。 -因此,我们将 Job 的完成计数(Completion Count)设置为 1。 +所以,只要有**任意**一个工作程序成功退出,控制器就知道工作已经完成了,所有的 Pod 将很快会退出。 +因此,我们需要将 Job 的完成计数(Completion Count)设置为 1。 尽管如此,Job 控制器还是会等待其它 Pod 完成。 ```shell +# 这假设你已经下载并编辑了清单 kubectl apply -f ./job.yaml ``` -稍等片刻,然后检查这个 Job。 +稍等片刻,然后检查这个 Job: ```shell kubectl describe jobs/job-wq-2 @@ -313,14 +324,14 @@ Labels: controller-uid=b1c7e4e3-92e1-11e7-b85e-fa163ee3c11f Annotations: Parallelism: 2 Completions: -Start Time: Mon, 11 Jan 2016 17:07:59 -0800 +Start Time: Mon, 11 Jan 2022 17:07:59 +0000 Pods Statuses: 1 Running / 0 Succeeded / 0 Failed Pod Template: Labels: controller-uid=b1c7e4e3-92e1-11e7-b85e-fa163ee3c11f job-name=job-wq-2 Containers: c: - Image: gcr.io/exampleproject/job-wq-2 + Image: container-registry.example/exampleproject/job-wq-2 Port: Environment: Mounts: @@ -353,9 +364,9 @@ Working on lemon ``` -你可以看到,其中的一个 Pod 处理了若干个工作单元。 +你可以看到,此 Job 中的一个 Pod 处理了若干个工作单元。 @@ -374,10 +385,10 @@ want to consider one of the other -如果你有持续的后台处理业务,那么可以考虑使用 `ReplicaSet` 来运行你的后台业务, +如果你有持续的后台处理业务,那么可以考虑使用 ReplicaSet 来运行你的后台业务, 和运行一个类似 [https://github.com/resque/resque](https://github.com/resque/resque) 的后台处理库。