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)自动处理这些步骤。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
14天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
56 2
|
11天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
13天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
6天前
|
Kubernetes Cloud Native Docker
云原生之旅:从传统架构到容器化服务的演变
随着技术的快速发展,云计算已经从简单的虚拟化服务演进到了更加灵活和高效的云原生时代。本文将带你了解云原生的概念、优势以及如何通过容器化技术实现应用的快速部署和扩展。我们将以一个简单的Python Web应用为例,展示如何利用Docker容器进行打包和部署,进而探索Kubernetes如何管理这些容器,确保服务的高可用性和弹性伸缩。
|
7天前
|
运维 Cloud Native 云计算
云原生之旅:Docker容器化实战
本文将带你走进云原生的世界,深入理解Docker技术如何改变应用部署与运维。我们将通过实际案例,展示如何利用Docker简化开发流程,提升应用的可移植性和伸缩性。文章不仅介绍基础概念,还提供操作指南和最佳实践,帮助你快速上手Docker,开启云原生的第一步。
|
12天前
|
Cloud Native API 持续交付
云原生之旅:从容器到微服务的演进之路
【10月更文挑战第39天】在这篇文章中,我们将一起探索云原生技术的奥秘。通过浅显易懂的语言和生动的比喻,我们将了解云原生技术如何改变软件开发的世界。文章将带领读者从容器的基本概念出发,逐步深入到微服务架构的实践,揭示这些技术如何助力现代应用的快速迭代与可靠部署。准备好,让我们启程进入云原生的精彩世界吧!
|
14天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
22天前
|
Kubernetes Cloud Native 微服务
云原生之旅:从容器到微服务
【10月更文挑战第29天】在这篇文章中,我们将一起探索云原生的奥秘。云原生不仅仅是一种技术,更是一种文化和方法论。我们将从容器技术开始,逐步深入到微服务架构,最后探讨如何在云平台上实现高效的服务部署和管理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的技能。让我们一起踏上这段激动人心的云原生之旅吧!
|
22天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
47 2
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
下一篇
无影云桌面