【发布时间】:2019-06-30 08:41:41
【问题描述】:
如何备份 kubernetes 集群并在另一个集群上恢复它们。? 我在 Azure 上设置了 kubenetes 集群,我想每天 00.00.00 进行备份
【问题讨论】:
标签: kubernetes cron
如何备份 kubernetes 集群并在另一个集群上恢复它们。? 我在 Azure 上设置了 kubenetes 集群,我想每天 00.00.00 进行备份
【问题讨论】:
标签: kubernetes cron
有两个解决方案。
解决方案 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
for ns in $(kubectl get ns --no-headers | cut -d " " -f1); do
helm backup $ns
done
【讨论】:
我喜欢使用这个脚本: https://gist.github.com/irraz/d23ea066b08c4ff2e5652bd4d62e937e
基本上它以json格式导出,带有jq的元数据被删除
【讨论】:
您可以在网络上找到一些有关备份的资源。选择适用于您的场景的策略非常重要。
一般而言,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 或 kaptaind. 提到的示例
您还可以在此 article 中找到很好的解释,其中有一节是关于使用 Kubernetes CronJob 或此 one 自动执行单个主备份,只需稍加调整即可轻松迁移到不同的云。如果您遇到任何问题,请随时提出,我会尽力提供帮助 - 只需添加更多信息,例如您是如何创建集群的、它是托管服务以及里面有哪些应用程序。
【讨论】: