Kubernetes备份和还原

时间:2019-02-06 11:43:45

标签: kubernetes cron

如何备份kubernetes集群并将其还原到另一个集群?  我在Azure上设置了kubenetes群集,我想每天00.00.00进行备份

3 个答案:

答案 0 :(得分:0)

您可以在网络上找到一些有关备份的资源。选择适合您情况的策略很重要。

一般来说,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-backup或{{3} }

您还可以在此kaptaind.中找到很好的解释,并且有一节介绍了如何使用Kubernetes CronJob或此article通过少量调整自动执行单个主备份,您可以轻松地迁移到其他云。如果您遇到任何问题,请随时提出问题,我将尽力提供帮助-仅添加更多信息,例如您如何创建集群,它是托管服务以及内部包含哪些应用程序。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

有两种解决方案。

解决方案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 Backup插件

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