Kubernetes(K8s)容器设计模式实践案例 – 工作队列模式

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: K8s与容器设计模式 目前K8s社区推出的容器设计模式主要分为三大类:第一类,单容器管理模式;第二类,单节点多容器模式;第三类,多节点多容器模式;一类比一类更复杂。 根据复杂性的不同,本系列文章给出不同篇幅的实践案例介绍。

K8s与容器设计模式

目前K8s社区推出的容器设计模式主要分为三大类:第一类,单容器管理模式;第二类,单节点多容器模式;第三类,多节点多容器模式;一类比一类更复杂。

根据复杂性的不同,本系列文章给出不同篇幅的实践案例介绍。所有在云计算平台上运行 的应用业务都可以分成两大类,即长时运行服务和批处理业务。工作队列模式是一系列容器设计模式中第一个面向批处理业务的模式,在Kubernetes集群中,以API对象Job为基础处理批处理任务。

本文将借助示例介绍多节点多容器模式中的工作队列模式。

工作队列模式

分布式系统的一个重要作用是能够充分利用多个物理计算资源的能力,特别是在动态按需调动计算资源完成计算任务。

设想如果有大量的需要处理的任务随即的到来,对计算资源需要的容量是不确定地;显然,按照最大可能计算量和最小可能计算量设置计算节点都是不合理的。

这种情况下,可以把需要处理的任务放到一个待处理的队列里,根据需要启动计算节点从队列读取任务进行处理。在容器技术广泛应用之前,也有诸多的分布式处理系统依靠队列来处理大量计算任务,例如大数据处理系统Hadoop和Spark等。

这些系统的一个限制是实现队列处理模式大多要遵循特定的编程模式和特定的编程语言,同时搭建基础设施也大多复杂而耗时。而基于容器和Kubernetes编排技术的工作队列模式的好处在于,利用非常简单的编排脚本就可以实现工作队列模式,而用Pod作为轻量级处理节点的模式,使得动态的调度计算资源变得非常容易。

在Kubernetes中应用工作队列模式的逻辑示意图如Fig01。

tu1

在Kubernetes集群中,可以启动一个队列服务,用来存储等待处理的任务。这种队列可以用通用的消息队列RabbitMQ,ActiveMQ或Kafka来实现,也可以用Redis这类支持集合存储的内存数据库实现。

向工作队列输入待处理任务的是工作队列前端服务,这可以是一个REST服务,一个可视化的界面服务,也可以是一个可以提交任务的命令行或客户端API。

无论是何种,工作队列前端服务的作用是向工作队列添加任务。真正处理任务的是包含了应用程序的应用Pod。由于在Kubernetes中,Pod有能力支持多容器,这使得在同一个Pod中,从工作队列里读取任务的容器和处理任务的容器可以来自不同的容器镜像,其中处理应用任务的容器根据不同的任务各不相同,而读取任务的容器是可以在任何应用处理中重用的。

正如图Fig01所显示的,在这样一个工作队列模式的分布式系统中,工作队列服务、工作队列前端服务、工作队列读取容器这几个模块都是可以重用的,只有跟具体应用工作处理相关的部分要根据不同应用编写。

利用Redis作为工作队列验证工作队列模式

本文用一个简单案例来展示在k8s集群中应用工作队列模式的方法。在k8s集群中用Job这个API对象来执行批处理任务,如图Fig02所示。

tu2

我们创建一个Job用来处理工作任务,它会产生Job Controller并控制生成多个处理任务的Pod。同时,我们创建一个Redis Pod和一个Service用来存储工作任务。为了向工作队列输入任务和察看工作队列中的任务,我们创建一个redis-cli pod作为客户端操作工作队列。

本文中案例的代码

本文中使用的代码和构建镜像的Dockerfile在Github仓库https://github.com/xwangqingyuan/kube-templates/tree/master/examples/job
本文中使用的容器镜像在https://github.com/xwangqingyuan/kube-templates/tree/master/examples/job

用于操作redis队列的python代码清单。

tu3

在这个python文件中定义了RedisWQ类,用来操作redis的队列。在创建RedisWQ对象的时候,会传入所要连接的Redis的主机URL和队列名称。

在类RedisWQ中定义了lease方法,用来锁定队列中的一个任务,这样可以保证每个任务只被一个Pod处理,在处理时,任务被这个Pod锁定,其它Pod就不会再取得这个任务进行处理了。

在处理完成后,处理的Pod调用complete方法,标志这个任务已经被处理完的同时,将这个任务从队列中删除。为了保证同一个任务不被一个Pod永远锁定,在调用lease方法时,同时可以设置一个过期时间,超过这个过期时间,万一正在处理的Pod已经死掉了,队列可以自己解锁这个任务,让其它Pod来处理。

调用RedisWQ来处理任务的代码。

tu4

利用rediswq.py和work.py,我们可以构建一个容器镜像,这个镜像专门用来处理redis队列中的任务。本文作者已经构建了一个镜像在Docker hub的景象仓库xwangqingyuan/rediswq。该镜像的Dockerfile如下:

用redis准备任务工作队列

用于创建redis的Pod的yaml文件清单。

tu6

用kubectl create命令创建一个redis的Pod。

kubectl create -f /git/github.com/xwangqingyuan/kube-templates/examples/job/redis.yaml

用于创建redis服务的yaml文件清单。

用kubectl create命令创建一个redis的Service。

kubectl create -f /gitws/github.com/xwangqingyuan/kube-templates/examples/job/redis-service.yaml

用kubectl run命令启动一个redis作为客户端操作redis队列。

kubectl run -i --tty temp --image redis --command "/bin/sh"

在redis客户端用rpush命令向工作队列job中添加工作任务,我们添加5个任务。

tu8

在redis客户端用lrange命令查看工作队列job中的任务,我们可以查询到5个任务。

tu9

用rediswq镜像处理工作队列中的任务

我们在同一个k8s的namespace里,创建一个job,来处理工作队列中的任务。处理任务的Job的Yaml文件清单如下:

tu10

我们用kubectl create命令创建一个Job。

kubectl create -f /gitws/github.com/xwangqingyuan/kube-templates/examples/job/job.yaml

查看job的处理结果

首先利用kubectl describe命令查看对应job-wq-1的两个pod的名字,我们查看到分别为job-wq-1-45qeb和job-wq-1-dpnnj。

tu11

然后我们用kubectl logs命令分别察看两个pod的日志,在日志中我们可以看到两个pod的分别处理的任务。我们可以看到:job-wq-1-45qeb处理了fig, cherry和apple,而job-wq-1-dpnnj处理了date和banana。两个加起来刚好处理了所有的工作任务。

tu12

然后,我们在管理redis工作队列的客户端上,用lrange命令查看当前工作队列job的任务数量,可以发现所有任务已经被处理完了。

10.0.0.180:6379> lrange job 0 -1 (empty list or set)

总结

本文主要介绍了K8s集群中,多节点容器模式中的工作队列模式。工作队列模式,是分布式计算系统的一种基本的工作模式

通过将待处理的任务放入队列,由应用处理模块自发去队列里读取任务并处理任务,提交任务请求的模块和处理任务请求的模块之间得到了解耦。在K8s系统中,原生用Job API对象来支持批处理任务选举的目的,Job控制器可以控制同时执行任务的工作Pod数量。

由于在一个节点上启动一个Pod来处理任务要比分配一整个节点来处理任务开销小得多,基于kubernetes的工作队列模式比传统基于物理机或虚拟机的分布式工作队列处理系统更加敏捷高效。另一方面,因为Pod支持多容器组合的模式,使得工作队列任务获取模块和应用逻辑处理模块可以独立交付但组合部署,增强了工作队列模式中的模块重用性。

本文转自中文社区-Kubernetes(K8s)容器设计模式实践案例 – 工作队列模式

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
12天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
76 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
24天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
2天前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
24天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
66 12
|
2月前
|
Kubernetes Cloud Native 持续交付
容器化、Kubernetes与微服务架构的融合
容器化、Kubernetes与微服务架构的融合
49 1
|
9天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
7天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
44 12
|
12天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
28 2
|
24天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。

相关产品

  • 容器服务Kubernetes版