在Kubernetes集群中,工作负载(Workload)是指在集群上运行的各种应用程序和服务实例。您可以对工作负载进行部署、扩展、更新和恢复,以确保Pod的稳定性和服务的连续性。本文介绍多种不同的工作负载场景,包括无状态应用Deployment、有状态应用StatefulSet、守护进程DaemonSet、任务Job、批处理任务CronJob等。
Pod(容器组)
Pod是Kubernetes中的最小部署单元,它封装了一个或多个容器(Container),以及共享存储(Volume)、网络和配置信息。在实际使用场景中,我们很少直接创建Pod,而是通过Controller来管理Pod,例如Deployment和StatefulSet等。
无状态负载(Deployment)和有状态应用(StatefulSet)
Deployment
在Kubernetes中,最初是通过ReplicaSet Controller指定Pod的副本数量(Replica)、标签选择器(LabelSelector)和Pod模板。后续由Deployment Controller通过管理ReplicaSet间接管理一组Pod,进一步增强了控制和管理能力。
Deployment适用于对数据持久化和请求顺序不敏感的场景,例如Web服务器、微服务架构服务等。
典型场景 | 场景描述 |
无状态Web服务 | 前端Web服务,这类服务时常需要弹性地处理不同时期的访问量。Deployment Controller支持水平扩展、升级和回滚。 |
微服务架构服务 | 多微服务的系统需要分别部署各个服务,每个服务都有独立的生命周期和扩展需求。Deployment Controller支持独立管理每个微服务的部署。 |
StatefulSet
在Deployment中,每个Pod都是独立且无状态的,不存在相互依赖关系。但在某些场景中,Deployment控制器并不能满足需求,例如在分布式数据库场景中,Pod之间存在状态信息和依赖关系,例如主备模式。这种情况下,使用StatefulSet能够更有效地管理有状态且互相关联的Pod。
StatefulSet适用于需要持久化存储和有序部署实例的场景,例如数据库、分布式存储系统等。
典型场景 | 场景描述 |
有状态数据库 | 有状态数据库通常需要持久化存储,并且希望在Pod重新调度后能够保留相同的网络标识和数据。例如,MySQL数据库中的每个实例都有具体的数据和配置,重启时也需要保持原状。 |
分布式消息队列服务 | 分布式消息队列依赖于集群中每个节点的有序状态和持久化日志。例如,Apache Kafka需要每个Broker节点的数据高度一致,并且要求日志存储在持久卷中以防止数据丢失。 |
Deployment和StatefulSet的区别
您可以根据Deployment和StatefulSet的区别进行选型。
对比项 | Deployment | StatefulSet |
适用场景 | 面向无状态应用,例如Web服务器、API服务等。适用于需要快速扩展和滚动更新的场景。 | 面向有状态应用,例如数据库、分布式文件系统等。适用于需要稳定持久化存储和有序部署的场景。 |
持久化存储 | 所有副本Pod共享一个持久化存储声明,当Pod重新调度或被更新时会重新挂载相同的PVC,继续访问相同的数据。 | 每个Pod拥有独立持久化存储卷声明和固定命名,确保数据持久性和一致性。当Pod重启或重新调度时持久化存储保持不变。 |
网络标识 | Pod没有固定标识,Pod名和Pod IP地址是动态生成的。每次重建之后它们都会发生变化。 | Pod拥有固定标识其格式为 |
更新策略 |
|
|
服务发现 | 使用不同类型的Service实现服务发现,同时对Pod入口流量进行负载均衡,详情请参见Service快速入门。 | 每个Pod有一个唯一的固定DNS名称,可以通过StatefulSet管理的Headless Service来进行稳定的服务发现,使得可以直接访问到每个Pod。 |
守护进程集(DaemonSet)
DaemonSet支持在集群的每个节点上运行一个副本的Pod,用于部署需要在每个节点上都运行的后台服务或监控进程,例如日志收集、资源监控、网络插件等。当节点加入或移出集群时,DaemonSet会自动创建或删除相应的Pod。
DaemonSet适用于确保同一类型的守护进程在Kubernetes集群中的每个节点上运行。
典型场景 | 场景描述 |
日志收集 | DaemonSet适合用于日志收集工具,例如ACK集群中安装的Logtail组件。这些工具通常需要在每个节点上运行,能够收集和处理节点上的所有日志文件,并将其转发到集中式的日志管理系统。 |
监控代理 | 在每个节点部署监控代理如Prometheus的Node Exporter或Datadog Agent,收集资源使用指标,从而保障集群节点的状态与性能实时监控。 |
普通任务(Job)和定时任务(CronJob)
在Kubernetes中,Job和CronJob是分别用于运行一次性任务和定期任务的Controller,用于处理无需持续运行的工作负载,例如批处理任务、数据处理作业等。
Job是一种用于控制一批处理任务的控制器。当任务完成后,这些Pod将自动终止,适用于数据处理、备份等一次性任务的场景。
CronJob是一种用于管理Job的控制器,它通过Cron表达式定义调度时间,支持复杂的分、小时、日、月和周组合,适用于周期性任务,如定时备份数据库和定期清理日志文件。
管理工作负载对象
在ACK中,您可以使用API、命令行工具(如kubectl)和控制台来管理工作负载,从而高效地部署、监控和扩展应用服务。
控制台
您可以通过容器服务管理控制台高效、便捷地、白屏化地创建、管理和监控工作负载。以下是各类工作负载的控制台管理操作。
命令行
您可以获取集群KubeConfig并通过kubectl工具连接集群,与集群进行交互,执行各类管理任务,如应用部署、资源管理和集群监控等。
API
您可以通过OpenAPI来创建、更新、删除以及监控工作负载等。详细信息,请参见使用Kubernetes API。
常见问题
如果您在使用工作负载时遇到问题,请参见应用FAQ进行排查。
相关文档
工作负载的配置推荐,请参见工作负载推荐配置。
如何实现Pod的自动扩展,请参见弹性伸缩概述。
了解Pod不同调度方式,请参见调度概述。
如何访问应用服务,实现服务发现和负载均衡,请参见Service快速入门。
外部流量如何访问集群内部的服务,请参见Ingress概述。
如何保障Pod数据的持久性,请参见存储基础知识。
如何在ACK集群中实现免密拉取容器镜像,请参见免密拉取容器镜像。
如何在ACK集群中实现跨域拉取海外源容器镜像,请参见跨域加速拉取容器镜像。