View a markdown version of this page

恢复 Amazon EKS 集群 - Amazon Backup
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

恢复 Amazon EKS 集群

您可以使用 Amazon Backup 控制台或 CLI 恢复 EKS 集群备份。EKS 备份是复合恢复点,包括 EKS 集群状态和永久卷备份。

Amazon Backup 支持多种还原体验,包括精细的命名空间级恢复。恢复是非破坏性的,不会覆盖目标 EKS 集群中任何现有的 Kubernetes 对象。恢复也不会覆盖目标 EKS 集群的 Kubernetes 版本。

EKS 备份必须恢复到目标 EKS 集群,即已预先配置的 Amazon EKS 集群。作为恢复工作流程的一部分,您可以选择创建一个新的 EKS 集群,该集群 Amazon Backup 将代表您创建。

注意

Amazon Backup 将提供一组有限的选项,用于在还原过程中创建新的 EKS 集群。对于所有 EKS 集群创建功能,客户可以使用 EKS 控制台或 API 创建新的 E KS 集群,然后选择该集群作为恢复目标。

Amazon EKS 的恢复功能

还原类型 还原目标 恢复行为
恢复现有集群 恢复到源 EKS 集群或现有 EKS 集群 将所有 Kubernetes 资源和永久卷恢复到现有的 EKS 集群。所有恢复都是非破坏性的,现有对象不会被覆盖。对于跳过的对象,您可以订阅 SNS 通知
新集群恢复 在 EKS 还原过程中创建一个新的 Amazon EKS 集群 恢复会创建新的 EKS 集群,并将所有 Kubernetes 资源和永久卷还原到新创建的集群
命名空间恢复 现有的 Amazon EKS 集群 仅恢复指定的命名空间,其 Kubernetes 资源和相应的永久存储恢复是非破坏性的,并且不会覆盖现有对象。所有集群范围内的资源也将恢复。对于跳过的对象,您可以订阅 SNS 通知
永久存储恢复 依赖于永久存储 将单个永久存储作为独立还原进行恢复。参见 Amazon EBS、Amazon S3、Amazon EFS 的恢复行为。

权限

所需的权限取决于还原类型和目标目标。

恢复前的注意事项

在开始 EKS 恢复任务之前,请查看以下内容。如果您要恢复已跨账户或区域复制的 EKS 备份,请务必在恢复之前检查这些注意事项,以防止恢复失败。

  1. IAM 角色:恢复到其他集群时,源集群中使用的 IAM 角色(例如 Pod 身份、IRSA)。 OIDC 提供商(配置等)必须作为目标集群存在于账户/区域中。

  2. 确保 EKS 版本和兼容性:您要恢复的对象的 API 版本应为相同版本(或尽可能接近),并且在新集群中受支持。 Amazon Backup 将尽力在 EKS 版本之间进行恢复,但是在明显不同的版本之间进行恢复时可能会出现兼容性问题。

  3. 匹配的存储类别:要恢复现有 EKS 集群,请确保在恢复之前安装相应的 CSI 存储驱动程序插件

  4. S3 存储桶:使用 S3 存储桶恢复 EKS 集群时,请确保您的 S3 存储桶具有版本控制且可在目标账户或区域中访问。

  5. 映像存储库:恢复 EKS 集群时,请确保目标 EKS 集群的账户或区域可以访问在还原过程中引用的映像。检查您的注册表是否具有足够的跨区域/账户策略权限。

  6. 安全组:如果在还原过程中创建新的 EKS 集群,则应在目标账户和区域中为 ALB、Pod 身份、EKS 节点组等预先创建安全组

  7. EBS 可用区域和节点:用于恢复 EBS 卷的可用区应映射到现有 EKS 节点的可用区

  8. Non-destructive 恢复:所有 EKS 恢复都将是非破坏性的,并且不会覆盖目标还原的 Kubernetes 对象。

  9. 启用 EKS 审核日志:启用 EKS 审核日志,以便在恢复之前进行其他日志记录和故障排除。您还可以订阅 SNS 通知,以便在恢复时通知已跳过或失败的对象。

  10. 新的 EKS 集群创建还原缓冲区:在还原期间创建新的 EKS 集群时,在 EKS 集群达到可用状态之后但在创建任何其他 EKS 资源之前 Amazon Backup 引入 15 分钟的缓冲区。此缓冲区可确保在创建依赖资源之前完全初始化所有底层 EKS 组件。

  11. 启动模板中的用户数据:使用启动模板创建节点组时,请勿spec.cluster在启动模板的用户数据部分中指定。Amazon EKS 会自动注入集群身份参数(apiServerEndpointcertificateAuthority、和serviceIpv4Cidr),并将它们与用户数据中定义的任何其他配置合并。

  12. Amazon EKS 自动模式和已恢复的 Amazon EBS 卷:如果集群启用了 Amazon EKS 自动模式,则自动模式仅附加eks:eks-cluster-name标签与集群名称匹配的 Amazon EBS 卷。 Amazon Backup 不会在已还原的卷上更新此标签,因此,即使还原任务成功,引用已还原卷的 pod 在ContainerCreating还原到其他集群时仍可能FailedAttachVolume出现错误。要解决此问题,请使用以下命令使用目标集群的名称手动标记每个已恢复的 Amazon EBS 卷:aws ec2 create-tags --resources vol-123456abcdef --tags Key=eks:eks-cluster-name,Value=destination-cluster-name

EKS 配置

恢复复合 Amazon 时 Amazon Backup,您可以选择还原类型和目标目标。您可以选择恢复到源 EKS 集群、现有 EKS 集群或创建新的 EKS 集群作为还原目标。对于新的 EKS 集群,您可以选择使用与备份集群相同的现有基础设施设置(例如 VPC、子网),也可以配置新的基础设施设置。 Amazon Backup 旨在执行不覆盖现有资源的非破坏性恢复。

对于命名空间恢复,您最多可以指定 5 个命名空间进行选择性恢复。我们还将恢复所有集群范围的资源。

作为一项高级设置,你可以选择更改 Kubernetes 对象的还原顺序。默认情况下, Amazon Backup 将按以下顺序恢复所有 Kubernetes 对象:

集群范围的 Kubernetes 资源

  1. 自定义资源定义

  2. 命名空间(命名空间本身,而不是该命名空间内的资源)

  3. StorageClasses

  4. PersistentVolumes

命名空间范围的 Kubernetes 资源

  1. PersistentVolumeClaims

  2. 密文

  3. ConfigMaps

  4. ServiceAccounts

  5. LimitRanges

  6. 容器组(pod)

  7. ReplicaSets

永久存储配置

作为 Amazon EKS 复合备份还原的一部分,第二步将是配置您的永久存储配置。这将根据作为 EKS 集群一部分备份的永久存储而有所不同。

对于 Amazon EBS 快照,您需要提供一个可用区,用于恢复和创建 Amazon EBS 卷。 Amazon Backup 然后将尝试在与选定相同的可用区中创建 EKS 容器,这样您的卷就可以作为还原的一部分重新安装到 EKS 集群。

作为恢复的一部分, Amazon Backup 会将您的 Amazon EBS 卷和 Amazon S3 存储桶重新安装到已恢复的 EKS 集群中。Amazon EFS 文件系统还原为随机前缀,需要在恢复后手动创建接入点才能重新安装到 EKS 集群。 Amazon Backup 不会代表您创建接入点或挂载目标,请参阅此处的接入点和挂载目标指南。

亚马逊 EKS 恢复程序

按照以下步骤使用 Amazon Backup 控制台恢复 Amazon EKS 备份,或者 Amazon CLI:

Console
恢复您的 Amazon EKS 集群
  1. 打开 Amazon Backup 控制台,网址为https://console.aws.amazon.com/backup。

  2. 在导航窗格中,选择备份保管库。

  3. 选择包含您的 Amazon EKS 备份的备份保管库,然后为 Amazon EKS 备份选择恢复点。

  4. 选择还原。

  5. 在 “还原选项” 窗格中,选择您的还原类型:

    • 恢复完整的 EKS 集群-恢复整个 Amazon EKS 复合恢复点

    • 选择要恢复的命名空间-最多还原五个特定的命名空间

  6. 配置目标目的地:

    • 要恢复集群,请选择创建新集群或使用现有集群

    • 对于新集群,请指定集群名称、Kubernetes 版本、VPC 配置、IAM 角色、子网、其他安全组、节点组设置、fargate 配置文件和 Pod 身份 IAM 角色

    • 对于现有集群,请从下拉列表中选择目标集群

    • 要恢复命名空间,请指定目标集群和命名空间名称

  7. (可选)为 Kubernetes 资源的自定义还原顺序配置高级设置。

  8. 为作业选择 IAM 还原角色。如果不使用默认角色,请确保所选角色包含 iam: PassRole 权限。

    注意

    如果您的账户中启用了角色管理器,请为您 Amazon Backup 选择默认服务角色,“自定义” 选项可用。有关更多信息,请参阅《IAM 用户指南》中的 IAM 角色创建。

  9. 选择还原备份。

Amazon CLI

将aws backup start-restore-job命令与 Amazon EKS-specific 元数据一起使用。

所需的元数据取决于您的还原类型。所有还原操作都需要该clusterName参数。

通过以下方式恢复 Amazon EKS 恢复点 Amazon CLI

使用 StartRestoreJob。在 Amazon EKS 恢复期间,您可以指定以下元数据:

必填元数据:

  • clusterName-要还原到的集群的名称

可选元数据:

  • newCluster-(true/false) 我们是否应该在还原期间创建一个新的 EKS 集群。如果 newCluster 为 “true”,则以下元数据字段适用:

    • eksClusterVersion-如果要在还原期间增加集群版本,则需要集群的 K8s 版本

    • clusterRole-要附加到已创建的 EKS 集群的 IAM 角色 ARN

    • controlPlaneScalingTier-新集群的控制平面扩展层。如果省略此字段,则恢复将使用备份中捕获的层;如果未捕获任何层,则恢复使用标准控制平面。要将已配置的控制平面恢复为标准版,请指定standard。有关可用的等级值,请参阅 Amazon EKS 预配置控制平面。

    • encryptionConfigProviderKeyArn-指定 KMS 密钥 ARN 以加密目标集群。这可以是源集群中的 KMS 密钥,也可以是不同的 KMS 密钥。执行跨区域或跨账户还原时,必须提供不同的 KMS 密钥。如果源集群未加密,则完全省略此元数据。

    • clusterVpcConfig-创建的 EKS 集群的 VPC/Networking 配置。此字段包含以下嵌套字段:

      • vpcId-与您的集群关联的 VPC

      • subnetIds [Required]-与您的集群关联的子网

      • securityGroupIds [Required]-与您的集群关联的其他安全组

    • computeConfig-使用 Amazon EKS 自动模式创建的集群的计算配置。此字段有以下嵌套字段:

      • nodeRoleArn-Amazon EKS 自动模式附加到节点的 IAM 角色 ARN。如果省略,则还原将使用源集群中的节点角色。执行跨账户还原时,您必须在目标账户中提供节点角色。否则,恢复将失败。

    • nodeGroups-要在 EKS 集群上创建的托管节点组。 NodeGroups 用于还原的节点组必须与备份时的所有节点组相同,并且具有匹配的节点GroupId。

      • nodeGroupId [Required]-节点组的 ID

      • subnetIds [Required]-为与您的节点组关联的 Auto Scaling 组指定的子网

      • instanceTypes-如果未使用启动模板部署节点组,则这是与该节点组关联的实例类型

      • nodeRole [Required]-与您的节点组关联的 IAM 角色

      • securityGroupIds-允许 SSH 访问节点的安全组 ID

      • remoteAccessEc2SshKey-为与托管节点组中的节点进行 SSH 通信提供访问权限的 Amazon EC2 SSH 密钥名称

      • launchTemplateId-指定用于创建节点组的启动模板 ID。这可以是源集群的启动模板 ID,也可以是不同的启动模板 ID。如果源集群的启动模板包含指向源集群本身的硬编码终端节点,则必须提供不同的启动模板 ID。如果源集群不使用启动模板,则完全省略此元数据。

      • launchTemplateVersion-启动与指定启动模板 ID 关联的模板版本。

    • fargateProfiles-要在 EKS 集群上创建的 Fargate 配置文件。用于恢复的 Fargate 配置文件必须具有自备份时起的所有相同的 Fargate 配置文件并具有匹配的名称。

      • name [Required]-Fargate 个人资料的名称

      • subnetIds-要启动 Pod 的子网的 ID

      • podExecutionRoleArn [Required]-Pod 执行角色的 IAM 角色 ARN,用于与 Fargate 配置文件中的选择器匹配的 Pod

    • podIdentityAssociations-要在 EKS 集群上创建的 Pod 身份关联

      • associationId-Pod 身份关联的 ID

      • roleArn-Pod 身份关联的 IAM 角色 ARN

  • kubernetesRestoreOrder-改写 Kubernetes 清单的恢复顺序。此顺序将优先于默认的服务恢复顺序。这遵循以下格式: group/version/kind 或 version/kind

    例如:["v1/persistentvolumes","v1/pods","customresource/v2/custom"]

  • namespaceLevelRestore-(true/false) 如果要执行命名空间级别恢复

  • namespaces-如果命名空间为 “true”,则需要恢复的命名空间LevelRestore 列表。最多可以提供 5 个命名空间进行恢复。

    例如:["ns-1","ns-2","ns-3","ns-4","ns-5"]

  • restoreKubernetesManifestsOnly-(true/false) 如果您只想恢复 Kubernetes 清单文件而不想要恢复永久存储系统(EBS、S3、EFS 等)

  • nestedRestoreJobs-恢复复合恢复点中 PersistentVolume 存储系统所有嵌套恢复点的元数据配置。这是一张地图 RecoveryPointArn:那个恢复点 RestoreMetadata 的地图

还原到现有集群

aws backup start-restore-job \ --recovery-point-arn "arn:aws:backup:us-west-2:123456789012:recovery-point:composite:eks/my-cluster-20240115" \ --iam-role-arn "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole" \ --metadata '{"clusterName":"existing-cluster","newCluster":"false"}' \ --resource-type "EKS"

将特定命名空间恢复到现有集群:

aws backup start-restore-job \ --recovery-point-arn "arn:aws:backup:us-west-2:123456789012:recovery-point:composite:eks/my-cluster-20240115" \ --iam-role-arn "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole" \ --metadata '{"clusterName":"existing-cluster","newCluster":"false","namespaceLevelRestore":"true","namespaces":"[\"ns-1\",\"ns-2\",\"ns-3\",\"ns-4\",\"ns-5\"]"}' \ --resource-type "EKS"

将嵌套的永久卷恢复到现有集群:

aws backup start-restore-job \ --recovery-point-arn "arn:aws:backup:us-west-2:123456789012:recovery-point:composite:eks/my-cluster-20240115" \ --iam-role-arn "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole" \ --metadata '{"clusterName":"existing-cluster","newCluster":"false","namespaceLevelRestore":"true","nestedrestorejobs":"{\"arn:aws:ec2:us-west-2::snapshot/snap-abc123\":\"{\\\"AvailabilityZone\\\":\\\"us-west-2a\\\"}\",\"arn:aws:backup:us-west-2:123456789012:recovery-point:fa71a304-2555-4c37-8128-f154b9578032\":\"{\\\"DestinationBucketName\\\":\\\"bucket-name\\\"}\"}"}' \ --resource-type "EKS"

恢复到新集群

aws backup start-restore-job \ --recovery-point-arn "arn:aws:backup:us-west-2:123456789012:recovery-point:composite:eks/my-cluster-20240115" \ --iam-role-arn "arn:aws:iam::123456789012:role/AWSBackupDefaultServiceRole" \ --metadata '{"clusterName":"new-cluster","newCluster":"true","clusterRole":"arn:aws:iam::123456789012:role/EKSClusterRole","eksClusterVersion":"1.33","controlPlaneScalingTier":"tier-2xl","encryptionConfigProviderKeyArn":"arn:aws:kms:us-west-2:123456789012:key/ecb2b326-784d-4ec0-8d07-20ab826b5a13","clusterVpcConfig":"{\"vpcId\":\"vpc-1234\",\"subnetIds\":[\"subnet-1\",\"subnet-2\",\"subnet-3\"],\"securityGroupIds\":[\"sg-123\"]}","nodeGroups":"[{\"nodeGroupId\":\"nodegroup-1\",\"subnetIds\":[\"subnet-1\",\"subnet-2\",\"subnet-3\"],\"nodeRole\":\"arn:aws:iam::123456789012:role/EKSNodeGroupRole\",\"instanceTypes\":[\"t3.small\"],\"launchTemplateId\":\"lt-0b13949aae3f2b867\",\"launchTemplateVersion\":\"1\"}]","fargateProfiles":"[{\"name\":\"fargate-profile-1\",\"subnetIds\":[\"subnet-1\",\"subnet-2\",\"subnet-3\"],\"podExecutionRoleArn\":\"arn:aws:iam::123456789012:role/EKSFargateProfileRole\"}]","computeConfig":"{\"nodeRoleArn\":\"arn:aws:iam::123456789012:role/EKSAutoModeNodeRole\"}"}' \ --resource-type "EKS"

启动恢复作业后,使用describe-restore-job来监视进度:

aws backup describe-restore-job --restore-job-id restore-job-id

您可以为失败和跳过的对象订阅通知事件以进行恢复。有关更多信息,请参阅带有的通知选项 Amazon Backup。

Amazon EKS 恢复状态消息

恢复任务完成后,您可能会看到以下状态消息。该表显示了可能的场景及其相应的作业状态值:

场景 作业状态 消息示例
所有对象都已成功恢复 COMPLETED —
一个或多个对象未能恢复 COMPLETED “一个或多个 Kubernetes 对象无法恢复。要获得有关这些失败的通知,请启用 SNS 事件通知。”
无法完成恢复 FAILED (错误详情)

还原期间跳过了对象

以下 Kubernetes 对象是在尽力恢复的基础上进行的。如果恢复失败,则会将其移至已跳过的列表中。这些对象由系统管理并由 Kubernetes 或 Amazon EKS 重新创建:

  • FlowSchemas 带apf.kubernetes.io/autoupdate-spec: "true"注释

  • PriorityLevelConfigurations 带apf.kubernetes.io/autoupdate-spec: "true"注释

  • eks-exempt FlowSchema (EKS-managed,引用受保护的豁免 PriorityLevelConfiguration)

  • default命名空间中的kubernetes服务(API 服务器端点)

  • kube-system命名空间中的kube-dns服务 (CoreDNS)

在恢复过程中,总是会跳过以下 Kubernetes 对象。这些对象包括节点基础架构和网络组件。它们引用特定于集群的状态。当目标集群中的节点和服务变为活动状态时,Kubernetes 控制器会自动重新创建这些对象。如果您从备份中恢复这些对象,它们可能会导致冲突或错误。之所以发生这些冲突,是因为恢复的对象引用了目标集群上不存在的资源。

  • 端点 (v1/endpoints)-定义服务 IP 地址的网络端点。端点控制器会根据服务选择器自动管理这些内容。

  • EndpointSlices (discovery.k8s.io/v1/endpointslices)- EndpointSlice 控制器自动管理这些对象。

  • IPAddresses (networking.k8s.io/v1/ipaddresses)-Kubernetes 网络管理这些集群内部 IP 分配。

  • CSInodes (storage.k8s.io/v1/csinodes)-当 CSI 驱动程序在节点上注册时,kubelet 会自动创建这些对象。

  • VolumeAttachments (storage.k8s.io/v1/volumeattachments)-当 Pod 需要音量时, attach/detach 控制器会自动创建这些对象。

目标集群上已经存在的对象也会被跳过。EKS 恢复是非破坏性的 — 现有对象永远不会被覆盖或删除。

要在还原期间接收有关跳过或失败对象的通知,请订阅 SNS 事件通知。有关更多信息,请参阅带有的通知选项 Amazon Backup。

跨集群还原的 OIDC 和 IRSA 注意事项

将 Amazon EKS 备份还原到与源不同的集群时,引用 IAM 服务账户角色 (IRSA) 的 Kubernetes 对象会保留源集群的 OIDC 提供程序终端节点。这些引用存在于服务账户注释和 IAM 信任策略中。 Amazon Backup 在还原期间不会自动更新它们。

如果您的工作负载使用 IRSA,则跨集群还原需要:

  • 目标集群必须配置 OIDC 提供商。

  • Kubernetes 服务账户引用的所有 IAM 角色都必须更新其信任策略,以包含目标集群的 OIDC 提供商终端节点。

  • 服务账户注释 (eks.amazonaws.com/role-arn) 仍将引用原始角色——验证这些角色与目标账户中的有效角色相匹配。

如果不满足这些依赖关系,则 pod 在还原后将无法担任 IAM 角色,恢复任务可能会在验证期间报告失败。

建议:对于需要跨集群或跨账户还原可移植性的工作负载,我们建议使用 EKS Pod Identity 而不是 IRSA。EKS Pod Identity 不依赖于特定于集群的 OIDC 提供商,它简化了跨集群还原方案。