Longhorn,企业级云原生容器分布式存储 - 高可用

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Longhorn,企业级云原生容器分布式存储 - 高可用

数据局部性



数据局部性设置(data locality setting)旨在在以下情况下启用:只要有可能,至少应在与使用该卷的 pod 相同的节点上调度 Longhorn 卷的一个副本。我们将拥有本地副本的特性称为具有 data locality


例如,当集群的网络不好时,数据局部性(data locality)会很有用,因为拥有本地副本会增加卷的可用性。


数据局部性(data locality)对于分布式应用程序(例如数据库)也很有用,其中在应用程序级别而不是卷级别实现高可用性。在这种情况下,每个 Pod 只需要一个卷,因此每个卷都应该与使用它的 Pod 调度在同一节点上。此外,卷调度的默认 Longhorn 行为可能会导致分布式应用程序出现问题。问题是,如果一个 Pod 有两个副本,并且每个 Pod 副本都有一个卷,Longhorn 不知道这些卷具有相同的数据,不应调度在同一个节点上。因此 Longhorn 可以在同一节点上调度相同的副本,从而阻止它们为工作负载提供高可用性。


当数据局部性被禁用时,Longhorn 卷可以由集群中任何节点上的副本支持,并由运行在集群中任何节点上的 pod 访问。


数据局部性设置


Longhorn 目前支持两种 data locality 设置模式:


  • disabled. 这是默认选项。在与附加卷(工作负载)相同的节点上可能有也可能没有副本。
  • best-effort. 此选项指示 Longhorn 尝试将副本保留在与附加卷(工作负载)相同的节点上。Longhorn 不会停止该卷,即使它由于环境限制而无法将副本保留在附加卷(工作负载)的本地,例如:磁盘空间不足、磁盘标签不兼容等。


如何为卷设置数据局部性



可以通过三种方式为 Longhorn 卷设置 data locality


更改默认全局设置


您可以在 Longhorn UI 设置中更改 data locality 的全局默认设置。全局设置仅用作默认值,类似于副本计数(replica count)。它不会更改任何现有卷的设置。当创建卷时未指定(data locality),Longhorn 将使用全局默认设置来确定卷的 data locality


使用 Longhorn UI 更改单个卷的数据位置


您可以使用 Longhorn UI 在创建卷时设置 data locality。您还可以在 volume detail 页面中更改卷创建后的 data locality setting


使用 StorageClass 为单个卷设置数据局部性


Longhorn 还将 data locality setting 公开为 StorageClass 中的参数。您可以使用指定的 data locality setting 创建 StorageClass,然后使用 StorageClass 创建 PVC。例如,下面的 YAML 文件定义了一个 StorageClass,它告诉 Longhorn CSI driverdata locality 设置为 best-effort


kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: hyper-converged
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "2"
  dataLocality: "best-effort"
  staleReplicaTimeout: "2880" # 48 hours in minutes
  fromBackup: ""


意外分离后恢复卷



当发生意外分离(unexpected detachment)时,可能发生在 Kubernetes upgrade、Docker reboot或网络断开连接期间,如果 pod 由控制器管理(例如:deploymentstatefulsetdaemonset 等),Longhorn 会自动删除工作负载 pod。通过删除 pod,它的控制器会重新启动 podKubernetes 处理卷重新附加(reattachment)和重新挂载(remount)。


如果您不希望 Longhorn 自动删除 workload pod,您可以在 Longhorn UI 的设置 Automatically Delete Workload Pod when The Volume Is Detached Unexpectedly(卷意外分离时自动删除工作负载 Pod) 中进行设置。


对于没有控制器的 PodLonghorn 不会删除它们,因为如果 Longhorn 删除,则没有人会重新启动它们。要恢复意外分离的卷,您必须手动删除并重新创建没有控制器的 pod


使用 Longhorn 处理节点故障



当 Kubernetes 节点出现故障时会发生什么


本节旨在告知用户节点故障(node failure)期间会发生什么以及恢复期间会发生什么。

一分钟后,kubectl get nodes 将报告失败节点的 NotReady

大约五分钟后,NotReady 节点上的所有 Pod 的状态将更改为 UnknownNodeLost


StatefulSets 具有稳定的 identity,因此 Kubernetes 不会为用户强制删除 pod。请参阅有关强制删除 StatefulSet 的官方 Kubernetes 文档。

Deployments 没有稳定的 identity,但是对于 Read-Write-Once 类型的存储,由于它不能同时附加到两个节点,Kubernetes 创建的新 pod 将无法启动,因为 RWO 卷仍连接到旧 pod,位于丢失的节点上。


在这两种情况下,Kubernetes 都会自动驱逐丢失节点上的 pod(为 pod 设置删除时间戳),然后尝试用旧卷重新创建一个新的卷。因为被驱逐的 pod 会卡在 Terminating 状态,并且附加的卷不能被释放/重用(released/reused),如果没有管理(admin)或存储(storage)软件的干预,新的 pod 将卡在 ContainerCreating 状态。


节点宕机时的 Longhorn Pod 删除策略


Longhorn 提供了一个选项来帮助用户在宕机的节点上自动强制删除 StatefulSet/Deployment 的终止 pod。强制删除后,Kubernetes 将分离 Longhorn 卷并在新节点上启动替换 pod


您可以在 Longhorn UI 或 Settings reference 的 Settings 选项卡中的 Pod Deletion Policy When Node is Down(节点宕机时的 Pod 删除策略)中找到有关设置选项的更多详细信息。


卷附件恢复策略


如果您决定强制删除 pod(手动或在 Longhorn 的帮助下),Kubernetes 将需要大约 6 分钟的时间来删除与 Pod 关联的 VolumeAttachment 对象,然后最终将卷与丢失的节点分离并允许它由新 pod 使用。


6 分钟的时间段在 Kubernetes 中是硬编码的:如果丢失节点上的 pod 被强制删除,则相关卷将无法正确卸载。然后 Kubernetes 会等待这个固定的超时时间直接清理 VolumeAttachment 对象。


为了解决这个问题,我们提供了 3 种不同的卷附件恢复策略。


卷附件恢复策略never(Kubernetes 默认)


Longhorn 不会从故障节点恢复 Volume Attachment,这与 Kubernetes 的默认行为一致。用户需要强制删除终止的 pod,此时 Longhorn 将从故障节点恢复 Volume Attachment。然后允许挂起的替换 pod(replacement pod)在请求的卷可用的情况下正确启动。


卷附件恢复策略 wait(Longhorn 默认)


Longhorn 将等待恢复 Volume Attachment,直到所有终止 pod(terminating pod)删除宽限期过去。由于此时需要节点 kubelet 删除 Pod,并且 Pod 仍然可用,我们可以得出结论,故障节点 Kubelet 无法删除 Pod。此时 Longhorn 将从故障节点恢复 Volume Attachment。然后允许挂起的替换 pod(replacement pod) 在请求的卷可用的情况下正确启动。


卷附件恢复策略 immediate


只要有待处理的替换 Pod(replacement pod) 可用,Longhorn 就会从故障节点恢复 Volume Attachment。然后允许挂起的替换 pod(replacement pod)在请求的卷可用的情况下正确启动。


当发生故障的 Kubernetes 节点恢复时会发生什么


如果节点在故障后 56 分钟内重新联机,Kubernetes 将重新启动 Pod、卸载(unmount)和重新安装(re-mount)卷,而无需重新附加卷(re-attaching)和 VolumeAttachment 清理。


因为卷引擎(volume engines)会在节点宕机后关闭,所以这种直接重新安装将不起作用,因为该设备不再存在于节点上。


在这种情况下,Longhorn 将分离并重新附加卷以恢复卷引擎,以便 pod 可以安全地重新挂载/重用卷(remount/reuse)。


如果节点在故障后 5-6 分钟内没有重新上线,Kubernetes 将尝试基于 pod eviction 机制删除所有无法访问的 pod,这些 pod 将处于 Terminating 状态。有关详细信息,请参阅 pod eviction timeout。


然后,如果故障节点稍后恢复,Kubernetes 将重新启动那些终止的 pod,分离卷(detach the volumes),等待旧的 VolumeAttachment 清理,并重用重新附加和重新挂载(re-attach & re-mount)卷。通常这些步骤可能需要 1 ~ 7 分钟。

在这种情况下,分离(detaching)和重新附加(re-attaching)操作已经包含在 Kubernetes 恢复过程中。因此不需要额外的操作,Longhorn 卷将在上述步骤后可用。


对于上述所有恢复场景,Longhorn 将通过 Kubernetes 的关联(association)自动处理这些步骤。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
人工智能 关系型数据库 OLAP
光云科技 X AnalyticDB:构建 AI 时代下的云原生企业级数仓
AnalyticDB承载了光云海量数据的实时在线分析,为各个业务线的商家提供了丝滑的数据服务,实时物化视图、租户资源隔离、冷热分离等企业级特性,很好的解决了SaaS场景下的业务痛点,也平衡了成本。同时也基于通义+AnalyticDB研发了企业级智能客服、智能导购等行业解决方案,借助大模型和云计算为商家赋能。
414 17
|
2月前
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
103 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
4月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
1353 57
|
4月前
|
人工智能 负载均衡 Java
Spring AI Alibaba 发布企业级 MCP 分布式部署方案
本文介绍了Spring AI Alibaba MCP的开发与应用,旨在解决企业级AI Agent在分布式环境下的部署和动态更新问题。通过集成Nacos,Spring AI Alibaba实现了流量负载均衡及节点变更动态感知等功能。开发者可方便地将企业内部业务系统发布为MCP服务或开发自己的AI Agent。文章详细描述了如何通过代理应用接入存量业务系统,以及全新MCP服务的开发流程,并提供了完整的配置示例和源码链接。未来,Spring AI Alibaba计划结合Nacos3的mcp-registry与mcp-router能力,进一步优化Agent开发体验。
1955 15
|
4月前
|
Kubernetes Cloud Native 区块链
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
Arista cEOS 4.30.10M - 针对云原生环境设计的容器化网络操作系统
141 0
|
9月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
382 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
9月前
|
存储 人工智能 调度
容器服务:智算时代云原生操作系统及月之暗面Kimi、深势科技实践分享
容器技术已经发展成为云计算操作系统的关键组成部分,向下高效调度多样化异构算力,向上提供统一编程接口,支持多样化工作负载。阿里云容器服务在2024年巴黎奥运会中提供了稳定高效的云上支持,实现了子弹时间特效等创新应用。此外,容器技术还带来了弹性、普惠的计算能力升级,如每分钟创建1万Pod和秒级CPU资源热变配,以及针对大数据与AI应用的弹性临时盘和跨可用区云盘等高性能存储解决方案。智能运维方面,推出了即时弹性节点池、智能应用弹性策略和可信赖集群托管运维等功能,进一步简化了集群管理和优化了资源利用率。
|
8月前
|
监控 安全 Cloud Native
阿里云容器服务&云安全中心团队荣获信通院“云原生安全标杆案例”奖
2024年12月24日,阿里云容器服务团队与云安全中心团队获得中国信息通信研究院「云原生安全标杆案例」奖。
|
1月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
188 2
|
1月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
91 0