【问题标题】:Kubernetes backup and restoreKubernetes 备份和恢复
【发布时间】:2019-06-30 08:41:41
【问题描述】:

如何备份 kubernetes 集群并在另一个集群上恢复它们​​。? 我在 Azure 上设置了 kubenetes 集群,我想每天 00.00.00 进行备份

【问题讨论】:

标签: kubernetes cron


【解决方案1】:

有两个解决方案。

解决方案 1 - 我拼凑的 Bash 脚本几乎可以使用 kubectl 导出所有内容。

#!/bin/bash

# NAMESPACED EXPORTS
for ns in $(kubectl get ns --no-headers | cut -d " " -f1); do
  kubectl --namespace="${ns}" get -o=json bindings,cm,ep,ev,limits,pvc,po,podtemplates,rc,quota,secrets,sa,svc,controllerrevisions,ds,deploy,rs,sts,localsubjectaccessreviews,hpa,cj,jobs,leases,ev,ds,deploy,ing,netpol,rs,pods,netpol,pdb,roles,rolebindings | \
    jq '.items[] |
    select(.type!="kubernetes.io/service-account-token") |
    del(
        .spec.clusterIP,
        .metadata.uid,
        .metadata.selfLink,
        .metadata.resourceVersion,
        .metadata.creationTimestamp,
        .metadata.generation,
        .status,
        .spec.template.spec.securityContext,
        .spec.template.spec.dnsPolicy,
        .spec.template.spec.terminationGracePeriodSeconds,
        .spec.template.spec.restartPolicy
    )' >> "./${ns}.json"
done

# NON-NAMESPACED EXPORTS
kubectl get -o=json cs,ns,no,pv,mutatingwebhookconfigurations,validatingwebhookconfigurations,crds,apiservices,tokenreviews,selfsubjectaccessreviews,selfsubjectrulesreviews,subjectaccessreviews,csr,psp,nodes,psp,clusterrolebindings,clusterroles,pc,sc,volumeattachments | \
    jq '.items[] |
    select(.type!="kubernetes.io/service-account-token") |
    del(
        .spec.clusterIP,
        .metadata.uid,
        .metadata.selfLink,
        .metadata.resourceVersion,
        .metadata.creationTimestamp,
        .metadata.generation,
        .status,
        .spec.template.spec.securityContext,
        .spec.template.spec.dnsPolicy,
        .spec.template.spec.terminationGracePeriodSeconds,
        .spec.template.spec.restartPolicy
    )' >> "./cluster_non-namespaced_export.json"

解决方案 2 - 使用 Helm 备份插件

helm plugin install https://github.com/maorfr/helm-backup
helm backup {NAMESPACE}

然后恢复:

helm backup --restore {NAMESPACE}.tgz

或者如果你像我一样懒惰,自动循环每个 ns

for ns in $(kubectl get ns --no-headers | cut -d " " -f1); do
  helm backup $ns
done

【讨论】:

    【解决方案2】:

    我喜欢使用这个脚本: https://gist.github.com/irraz/d23ea066b08c4ff2e5652bd4d62e937e

    基本上它以json格式导出,带有jq的元数据被删除

    【讨论】:

      【解决方案3】:

      您可以在网络上找到一些有关备份的资源。选择适用于您的场景的策略非常重要。

      一般而言,Kubernetes 将其状态存储在 etcd 中,GKE、AKS 和 EKS 等托管集群也会负责您的 etcd(和主节点),因此您无法直接访问它。由于您没有提供足够的详细信息,因此我无法提供任何特别建议,因此我将简要介绍一些场景。另外,请记住,跨云提供商迁移持久卷可能会很棘手(上次我检查 Velero 不支持这一点 - 但不确定当前状态)。

      一种简单的方法是获取要备份的对象的 yaml(也适用于编辑)

      kubectl get *object_name* -n *namespace* --export -o yam
      

      例如kubectl get daemonset.apps/fluentd-gcp-v3.2.0 -n kube-system --export -o yaml 而不是仅仅将它应用在其他地方。如果您想要高级选项,例如通过标记 cron 计划、自动备份或基于事件的快照来判断,您将不得不使用更高级的工具 - Shouichi - Heptio Velero 、kube-backupkaptaind. 提到的示例

      您还可以在此 article 中找到很好的解释,其中有一节是关于使用 Kubernetes CronJob 或此 one 自动执行单个主备份,只需稍加调整即可轻松迁移到不同的云。如果您遇到任何问题,请随时提出,我会尽力提供帮助 - 只需添加更多信息,例如您是如何创建集群的、它是托管服务以及里面有哪些应用程序。

      【讨论】:

      • 嗨,感谢重播,但我也想移动数据。
      • 您好,对于磁盘,您可以使用一些外部工具,例如 this 与数据库一样,您可以使用工具进行数据库备份。这是explained 如何使用 mongodb 做到这一点。这是你需要的吗?
      • 现在,您可以使用 Restic Integrtation 使用 Velero 备份 PVC。在不同的集群中安排每日备份和恢复。这正是这个问题的答案:velero.io/docs/master/migration-case
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2011-07-02
      • 2021-08-14
      • 2014-07-24
      • 2013-12-03
      • 2014-08-10
      相关资源
      最近更新 更多