K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。

【阅读原文】戳:K8s业务迁移最佳实践: 灵活管理资源备份与调整策略,实现高效简便的应用恢复

引言

 

 

 

在当今快速变化的云原生领域,Kubernetes(K8s)集群的运维面临着诸多挑战,其中灾备与业务迁移尤为关键。无论是为了应对突发情况而对集群进行备份与异地恢复,还是在执行如主备业务同步、从传统数据中心(IDC)向云端迁移、乃至混合云场景的云端转移,都离不开一个高效可靠的资源备份与恢复机制。

 

在这两大场景中,一个共通的痛点凸显:跨集群的业务恢复往往伴随着环境差异,导致恢复过程需手动调整资源,这不仅大幅增加了操作的复杂度,还可能延长业务恢复时间(RTO),影响服务连续性。

 

面对这一挑战,ACK备份中心支持丰富的资源调整策略,在数据恢复阶段即可自动适配目标集群环境,确保业务无缝重启。这一创新方案极大简化了灾备与迁移过程中的繁琐操作,降低了操作门槛,同时加速了业务恢复速度,为追求高可用性和灵活性的K8s集群管理提供了强有力的支持。

 

 

 

 

ACK备份中心简介

 

 

 

针对K8s集群中运行的业务,ACK推出备份中心一站式容器化业务灾备及迁移方案。

 

备份中心概述:

 

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/backup-center-overview?spm=a2c4g.11186623.0.i5

 

集群运维人员可以通过备份、制定资源调整策略(可选)、恢复这三个流程。


image.png

 

 

备份:集群运维人员可在备份集群控制台一键为业务创建周期性的备份计划或单次的应用备份。与ETCD备份相比,备份中心支持命名空间、标签、资源类型等维度,选择需要备份的应用;对于有状态应用,支持同时备份业务挂载的存储卷数据。而对于有完善gitops流程的企业,也可以通过备份中心的数据保护功能做仅针对存储卷数据的备份。

 

备份完成并上传至备份仓库关联的OSS Bucket后,备份中心不会对云端存储的备份做任何的修改。

 

制定资源调整策略与恢复:备份中心支持的集群修改方式大致可分成三类,分别为:

 

默认修改:无需任何配置,由组件在恢复时默认执行。如资源删除uid等临时信息的通用修改、恢复存储卷时FlexVolume到CSI的变更、API Version的自动升级、跨云场景的一些已知兼容等。

 

常用修改:能通过对恢复任务的字段的配置简单实现。如命名空间、存储类和镜像仓库地址的映射,以及为兼容网络插件做的svc与ing的注释(annotations)复写等。

 

通用修改:更多灵活的修改需求,需要依赖velero的resource modifier功能实现。具体来说,通过编写配置项(ConfigMap)实现指定的字段变更,变更支持add, delete, replace等json patch操作。

 

其中,默认修改仅针对必须调整的资源及字段,以保证资源的成功部署。对于大部分原地恢复的灾备场景,都无需指定额外的资源调整策略。

 

常用修改与通用修改都为运维人员的可选配置,作用为:

 

在重启业务时兼容新的集群或云资源环境。这对于混合云等异地恢复场景有重要意义,比如解决镜像上云后地址变化以及不同云厂商底层云资源差异带来的问题。

 

允许对业务的运行逻辑做自定义的变更。出于稳定性等需求,业务迁移时往往需要考虑配置文件修改、副本数调整、端口是否强制变更、负载均衡是否复用及复用时是否强制监听等等。常用的资源调整只需要在恢复步骤中修改配置项实现,而更灵活通用的调整需要在该步骤中预先创建、编写ConfigMap。

 

制定资源调整策略后,与备份类似,集群运维人员可在目标集群的控制台一键对某个备份记录进行恢复,包括集群资源与存储卷数据。

 

 

 

 

集群资源调整最佳实践

 

 

 

接下来,本文将模拟一个有状态应用从自建K8s集群迁移至ACK的最佳实践。示例中将展示如何通过配置修改应用恢复的命名空间和镜像仓库地址,并通过resouce modifier功能删除nodeAffinity。

 

 

 

- 有状态应用部署示例 -

 

 

自建集群由阿里云ECS节点搭建而成,已安装开源版本的阿里云CSI存储插件。

 

将自建集群接入ACK One注册集群,并安装备份中心组件migrate-controller。

 

ACK One注册集群概述:

 

https://help.aliyun.com/zh/ack/overview-9?spm=a2c4g.11186623.0.0.1c416218Ugyqe5

 

创建的有状态应用使用龙蜥社区提供的公开nginx镜像,调度在打标了is_idc的节点上。

 

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  serviceName: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: is_idc
                operator: Exists
      containers:
      - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/nginx/html/
          name: www
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      labels:
        app: nginx
      name: www
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: alicloud-disk-topology-alltype
      volumeMode: Filesystem

 

创建出的有状态应用与对应存储卷如图:

image.png

image.png

 

 

 

- 备份有状态应用 -

 

 

示例使用以下yaml部署立即备份任务,其中为已经关联了OSS Bucket的备份仓库名称,需要预先创建。

 

apiVersion: csdr.alibabacloud.com/v1beta1
kind: ApplicationBackup
metadata:
  name: <backupName>
  namespace: csdr
spec:
  backupType: AppAndPvBackup
  includedNamespaces:
  - default
  pvBackup:
    defaultPvBackup: true
  storageLocation: <backuplocationName>
  ttl: 720h0m0s

 

image.png

 

等待备份状态变为Completed。

 

 

 

- 制定自定义资源调整策略 -

 

 

自定义资源调整策略主要包括conditions和pataches两个部分。conditions用于指定需要修改的资源,patches用于指定具体字段和修改方式。

 

在本示例中,将同时修改StatefulSet和Pod两种类型的资源,具体修改内容为删除节点亲和性配置。

 

apiVersion: v1
data:
  modifier: |
    version: v1
    resourceModifierRules:
    - conditions:
        groupResource: statefulsets.apps
        namespaces:
        - default
        labelSelector:
          matchLabels:
            app: nginx
      patches:
      - operation: remove
        path: "/spec/template/spec/affinity/nodeAffinity"
    - conditions:
        groupResource: pods
        resourceNameRegex: "^web.*$"
        namespaces:
        - default
        labelSelector:
          matchLabels:
            app: nginx
      patches:
      - operation: remove
        path: "/spec/affinity"
kind: ConfigMap
metadata:
  name: <backupName>-resource-modifier
  namespace: csdr

 

 

 

- 恢复调整后的有状态应用 -

 

 

切换至ACK集群,安装备份中心组件migrate-controller后,关联相同的备份仓库,等待备份同步至新集群。

 

除上述自定义调整策略外,在恢复任务中还通过namespaceMapping和imageRegistryMapping字段配置了命名空间和镜像仓库地址的映射。

 

除指定此前创建的调整策略外,恢复时将备份中default命名空间下的资源(含存储卷数据)恢复到default1命名空间;将龙蜥社区的镜像仓库地址改成ACR镜像地址(需已提前完成镜像同步)。

 

apiVersion: csdr.alibabacloud.com/v1beta1
kind: ApplicationRestore
metadata:
  name: <restoreName>
  namespace: csdr
spec:
  backupName: <backupName>
  namespaceMapping:
    default: default1
  imageRegistryMapping:
    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis: registry.cn-beijing.aliyuncs.com/<acrRegistry>
  resourceModifier:
    kind: ConfigMap
    name: <backupName>-resource-modifier

 

image.png


 

等待恢复状态变为Completed。

 

 

 

- 验证恢复已按要求调整 -

 

可见template中容器镜像的镜像仓库地址、所在命名空间均已调整,节点亲和性配置也已删除。其余新增字段为K8s控制器自动填充。

 

apiVersion: apps/v1
kind: StatefulSet
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      # 已省略
  generation: 1
  labels:
    app: nginx
    velero.io/backup-name: <backupName>
    velero.io/restore-name: <restoreName>
  name: web
  namespace: default1
  resourceVersion: "119622"
  uid: d23878ea-0b9f-40ba-b61b-1ff6bb77eb43
spec:
  persistentVolumeClaimRetentionPolicy:
    whenDeleted: Retain
    whenScaled: Retain
  podManagementPolicy: OrderedReady
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  serviceName: nginx
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      affinity: {}
      containers:
      - image: registry.cn-beijing.aliyuncs.com/<acrRegistry>/nginx:1.14.1-8.6
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /usr/share/nginx/html/
          name: www
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
  volumeClaimTemplates:
  - apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
      name: www
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: alicloud-disk-topology-alltype
      volumeMode: Filesystem
    status:
      phase: Pending
status:
  availableReplicas: 0
  collisionCount: 0
  currentRevision: web-7b454646b4
  observedGeneration: 1
  replicas: 2
  updateRevision: web-7b454646b4

 

有状态应用在无打标的ACK集群节点上正常拉起,并由快照恢复出新盘用于挂载。


image.png

image.png

 

 

 

 

总结

 

 

 

面对Kubernetes集群备份与恢复过程中环境差异带来的挑战,阿里云ACK备份中心通过其灵活多样的资源调整策略,确保了业务的平滑迁移与无缝重启。

 

相关阅读:

 

1.《阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案》

 

2.《云端迁移:备份中心助力企业跨云迁移K8s容器服务平台》





我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。

欢迎关注 “阿里云基础设施”同名微信微博知乎

获取关于我们的更多信息~

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
34 16
|
8天前
|
缓存 前端开发 安全
数据同步原理
数据同步原理
36 10
数据同步原理
|
12天前
|
机器学习/深度学习 计算机视觉 Python
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力本文提出了一种简单且高效的卷积神经网络(ConvNets)注意力模块——SimAM。与现有模块不同,SimAM通过优化能量函数推断特征图的3D注意力权重,无需添加额外参数。SimAM基于空间抑制理论设计,通过简单的解决方案实现高效计算,提升卷积神经网络的表征能力。代码已在Pytorch-SimAM开源。
【YOLOv11改进 - 注意力机制】SimAM:轻量级注意力机制,解锁卷积神经网络新潜力
|
6天前
|
机器学习/深度学习 算法
魔搭案例开源获奖
赵卫东老师在第七届CCF开源创新大赛教学案例赛道中荣获特等奖。他的案例设计注重理论与实践结合,采用阿里魔搭平台和英特尔OpenVINO等先进技术,提升课程的实用性与前瞻性。该案例已开源,并在教学中取得显著成效。赵卫东老师一直坚持“学以致用、产教融合”的理念,多次在教学比赛中获奖。
55 7
|
5天前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
11天前
|
消息中间件 存储 监控
消息队列通信的优缺点
【10月更文挑战第29天】消息队列通信具有诸多优点,如解耦性强、异步通信、缓冲削峰等,能够有效地提高系统的灵活性、可扩展性和稳定性。但同时也存在一些缺点,如系统复杂性增加、性能开销、数据一致性挑战和实时性受限等。在实际应用中,需要根据具体的业务需求和场景,权衡其优缺点,合理地选择和使用消息队列通信机制,以实现系统的高效运行和优化。
|
11天前
|
人工智能 前端开发 IDE
通义灵码一周年测评:@workspace 和 @terminal 新功能体验分享
作为一名前端开发工程师,我近期体验了通义灵码的@workspace和@terminal新功能。@workspace通过智能解析项目结构,帮助快速上手新项目;@terminal则提供内置命令行环境,简化代码调试和系统管理。这两项功能显著提升了开发效率和代码管理的便捷性,是前端开发的得力助手。
63 9
通义灵码一周年测评:@workspace 和 @terminal 新功能体验分享
|
11天前
|
存储 缓存
中断向量表的大小会影响系统性能吗?
【10月更文挑战第28天】中断向量表的大小对系统性能有着重要的影响。在设计和实现计算机系统时,需要根据系统的具体需求和硬件环境,合理地确定中断向量表的大小,以平衡系统的可扩展性、中断响应时间、内存使用效率和系统稳定性等多方面的因素,从而优化系统的整体性能。
|
7天前
|
安全 网络协议 网络安全
企业网站建设时如何保障网站网络安全
企业网站建设时如何保障网站网络安全?
38 15
|
8天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
40 1