工作负载概述

在Kubernetes集群中,工作负载(Workload)是指在集群上运行的各种应用程序和服务实例。您可以对工作负载进行部署、扩展、更新和恢复,以确保Pod的稳定性和服务的连续性。本文介绍多种不同的工作负载场景,包括无状态应用Deployment、有状态应用StatefulSet、守护进程DaemonSet、任务Job、批处理任务CronJob等。

Pod(容器组)

Pod是Kubernetes中的最小部署单元,它封装了一个或多个容器(Container),以及共享存储(Volume)、网络和配置信息。在实际使用场景中,我们很少直接创建Pod,而是通过Controller来管理Pod,例如Deployment和StatefulSet等。

image

无状态负载(Deployment)和有状态应用(StatefulSet)

Deployment

在Kubernetes中,最初是通过ReplicaSet Controller指定Pod的副本数量(Replica)、标签选择器(LabelSelector)和Pod模板。后续由Deployment Controller通过管理ReplicaSet间接管理一组Pod,进一步增强了控制和管理能力。

image

Deployment适用于对数据持久化和请求顺序不敏感的场景,例如Web服务器、微服务架构服务等。

典型场景

场景描述

无状态Web服务

前端Web服务,这类服务时常需要弹性地处理不同时期的访问量。Deployment Controller支持水平扩展、升级和回滚。

微服务架构服务

多微服务的系统需要分别部署各个服务,每个服务都有独立的生命周期和扩展需求。Deployment Controller支持独立管理每个微服务的部署。

StatefulSet

在Deployment中,每个Pod都是独立且无状态的,不存在相互依赖关系。但在某些场景中,Deployment控制器并不能满足需求,例如在分布式数据库场景中,Pod之间存在状态信息和依赖关系,例如主备模式。这种情况下,使用StatefulSet能够更有效地管理有状态且互相关联的Pod。

image

StatefulSet适用于需要持久化存储和有序部署实例的场景,例如数据库、分布式存储系统等。

典型场景

场景描述

有状态数据库

有状态数据库通常需要持久化存储,并且希望在Pod重新调度后能够保留相同的网络标识和数据。例如,MySQL数据库中的每个实例都有具体的数据和配置,重启时也需要保持原状。

分布式消息队列服务

分布式消息队列依赖于集群中每个节点的有序状态和持久化日志。例如,Apache Kafka需要每个Broker节点的数据高度一致,并且要求日志存储在持久卷中以防止数据丢失。

Deployment和StatefulSet的区别

您可以根据Deployment和StatefulSet的区别进行选型。

对比项

Deployment

StatefulSet

适用场景

面向无状态应用,例如Web服务器、API服务等。适用于需要快速扩展和滚动更新的场景。

面向有状态应用,例如数据库、分布式文件系统等。适用于需要稳定持久化存储和有序部署的场景。

持久化存储

所有副本Pod共享一个持久化存储声明,当Pod重新调度或被更新时会重新挂载相同的PVC,继续访问相同的数据。

每个Pod拥有独立持久化存储卷声明和固定命名,确保数据持久性和一致性。当Pod重启或重新调度时持久化存储保持不变。

网络标识

Pod没有固定标识,Pod名和Pod IP地址是动态生成的。每次重建之后它们都会发生变化。

Pod拥有固定标识其格式为<StatefulSet名>-<序号>,例如web-0web-1等。当Pod发生重启,其名称也不会改变。

更新策略

  • Rolling Update(滚动更新):

    滚动更新过程中,旧版Pod会逐步被新版Pod替换,确保更新过程中服务是可用的。

  • Recreate(重建策略):

    旧版本的Pod会在新版本的Pod被创建之前被清除。这将导致服务在更新过程中存在短暂的中断,适用于旧版本Pod和新版本Pod不能共存的场景。

  • RollingUpdate(滚动更新):

    更新是按Pod序号进行的,即一个Pod更新完成并且就绪后,才会更新下一个Pod。

  • OnDelete

    需要手动删除Pod,触发该Pod的更新,适用于需要严格控制更新的场景。

服务发现

使用不同类型的Service实现服务发现,同时对Pod入口流量进行负载均衡,详情请参见Service快速入门

每个Pod有一个唯一的固定DNS名称,可以通过StatefulSet管理的Headless Service来进行稳定的服务发现,使得可以直接访问到每个Pod。

守护进程集(DaemonSet)

DaemonSet支持在集群的每个节点上运行一个副本的Pod,用于部署需要在每个节点上都运行的后台服务或监控进程,例如日志收集、资源监控、网络插件等。当节点加入或移出集群时,DaemonSet会自动创建或删除相应的Pod。

image

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进行排查。

相关文档