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

本文涉及的产品
容器镜像服务 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搭建和管理企业级网站应用
相关文章
|
8天前
|
人工智能 Kubernetes 安全
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
赋能加速AI应用交付,F5 BIG-IP Next for Kubernetes方案解读
47 13
|
8天前
|
Kubernetes 算法 调度
阿里云 ACK FinOps成本优化最佳实践
本文源自2024云栖大会梁成昊演讲,讨论了成本优化策略的选择与实施。文章首先介绍了成本优化的基本思路,包括优化购买方式、调整资源配置等基础策略,以及使用弹性、资源混部等高级策略。接着,文章详细探讨了集群优化和应用优化的具体方法,如使用抢占式实例降低成本、通过资源画像识别并优化资源配置,以及利用智能应用弹性策略提高资源利用效率。
|
8天前
|
Kubernetes 容灾 调度
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
|
8天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
29天前
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
45 1
|
28天前
|
Kubernetes 监控 安全
容器化技术:Docker与Kubernetes的实战应用
容器化技术:Docker与Kubernetes的实战应用
|
29天前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
47 0
|
29天前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
62 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。