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

文摘   2024-11-18 19:28   浙江  



引言




在当今快速变化的云原生领域,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


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



备份:集群运维人员可在备份集群控制台一键为业务创建周期性的备份计划或单次的应用备份。与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/v1kind: StatefulSetmetadata:  name: web  namespace: default  labels:    app: nginxspec:  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


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




- 备份有状态应用 -


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


apiVersion: csdr.alibabacloud.com/v1beta1kind: ApplicationBackupmetadata:  name: <backupName>  namespace: csdrspec:  backupType: AppAndPvBackup  includedNamespaces:  - default  pvBackup:    defaultPvBackup: true  storageLocation: <backuplocationName>  ttl: 720h0m0s



等待备份状态变为Completed。



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


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


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


apiVersion: v1data:  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: ConfigMapmetadata:  name: <backupName>-resource-modifier  namespace: csdr



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


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


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


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


apiVersion: csdr.alibabacloud.com/v1beta1kind: ApplicationRestoremetadata:  name: <restoreName>  namespace: csdrspec:  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



等待恢复状态变为Completed。



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


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


apiVersion: apps/v1kind: StatefulSetmetadata:  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-1ff6bb77eb43spec:  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: Pendingstatus:  availableReplicas: 0  collisionCount: 0  currentRevision: web-7b454646b4  observedGeneration: 1  replicas: 2  updateRevision: web-7b454646b4


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






总结




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


相关阅读:


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


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


/ END /

阿里云基础设施
为了永不停机的计算服务
 最新文章