
elsdoerfer/k8s-snapshots您需要做什么: 创建自定义的 SnapshotRule 资源,定义所需的快照间隔。
我能做什么: 为您的卷创建快照,并使用祖父-父亲-儿子备份方案过期旧快照。
希望帮助添加对其他后端的支持?这非常简单。请查看后端需要实现的API。
yamlcat <<EOF | kubectl apply -f - apiVersion: "k8s-snapshots.elsdoerfer.com/v1" kind: SnapshotRule metadata: name: postgres spec: deltas: P1D P30D persistentVolumeClaim: postgres-data EOF
yamlcat <<EOF | kubectl apply -f - apiVersion: "k8s-snapshots.elsdoerfer.com/v1" kind: SnapshotRule metadata: name: mysql spec: deltas: P1D P30D backend: aws disk: region: eu-west-1 volumeId: vol-0aa6f44aad0daf9f2 EOF
bashkubectl patch pv pvc-01f74065-8fe9-11e6-abdd-42010af00148 -p \ '{"metadata": {"annotations": {"backup.kubernetes.io/deltas": "P1D P30D P360D"}}}'
要备份卷,您可以创建 SnapshotRule 自定义资源(详见下文)。或者,您可以在 PersistentVolume 或 PersistentVolumeClaim 资源上添加名为 backup.kubernetes.io/deltas 的注解。
由于 PersistentVolume 通常由 Kubernetes 自动创建,您可能需要在资源定义文件中为卷声明添加注解。或者,您可以通过 kubectl edit pv 编辑 Kubernetes 创建的 PersistentVolume 并添加注解。
注解的值是一组 delta,用于定义快照的创建频率以及保留的快照数量。有关 delta 工作原理的更多信息,请参见下文。
最终,您的注解可能如下所示:
backup.kubernetes.io/deltas: PT1H P2D P30D P180D
您还可以通过 k8s-snapshots 守护进程的选项手动指定要备份的卷名称,详见下文。
使用 tarsnapper 的过期逻辑。
生成由一组 ISO 8601 持续时间格式的 delta 定义(这与 tarsnapper 不同)。PT60S 或 PT1M 表示一分钟,PT12H 或 P0.5D 表示半天,P1W 或 P7D 表示一周。每代中的备份数量由其自身和父代的 delta 隐含。
例如,给定 delta PT1H P1D P7D,第一代将包含 24 个备份,每个备份比前一个早一小时(或在可用备份中尽可能接近的近似值),第二代包含 7 个备份,每个比前一个早一天,超过 7 天的备份将被永久删除。
如果守护进程一段时间未运行,它仍会尝试尽可能接近您期望的快照方案。
最新的备份始终会保留。第一个 delta 是备份间隔。
k8s-snapshots 需要访问 Kubernetes 集群资源(以读取所需的快照配置)和云基础设施(以创建快照)。
根据您的环境,它可能能够自行配置,或者您可能需要提供一些配置选项。
使用以下示例部署文件开始:
bashcat <<EOF | kubectl create -f - apiVersion: apps/v1 kind: Deployment metadata: name: k8s-snapshots namespace: kube-system spec: replicas: 1 selector: matchLabels: app: k8s-snapshots template: metadata: labels: app: k8s-snapshots spec: containers: - name: k8s-snapshots image: elsdoerfer/k8s-snapshots:latest EOF
请参见 docs/ 文件夹获取特定平台的说明。
在启用 RBAC 的 Kubernetes 集群中,需要为 k8s-snapshots Pod 提供监视和列出 persistentvolume 或 persistentvolumeclaims 的权限。我们在 rbac.yaml 中提供了一个清单,用于设置具有最小权限集的 ServiceAccount。
bashkubectl apply -f manifests/rbac.yaml
此外,在 GKE 上,"由于 Container Engine 在创建 Role 或 ClusterRole 时检查权限的方式,您必须首先创建一个 RoleBinding,授予您要创建的角色中包含的所有权限。"
如果上述 kubectl apply 命令产生关于“尝试授予额外权限”的错误,以下命令将首先授予您的用户必要的权限,以便您可以将它们绑定到服务账户:
bashkubectl create clusterrolebinding your-user-cluster-admin-binding --clusterrole=cluster-admin --user=***
最后,通过在 spec 中添加 serviceAccountName: k8s-snapshots 来调整部署(否则将使用“default”服务账户),如下所示:
yaml<snip> spec: serviceAccountName: k8s-snapshots containers: - name: k8s-snapshots image: elsdoerfer/k8s-snapshots:v2.0 </snip>
| 环境变量 | 说明 |
|---|---|
| PING_URL | 备份完成后,我们将向此 URL 发送 GET 请求。这对于与 Cronitor 或 Dead Man's Snitch 等监控服务集成非常有用。 |
如果您的持久卷由 Kubernetes 自动配置,快照名称可能会类似 pv-pvc-01f74065-8fe9-11e6-abdd-42010af00148。如果您希望名称更友好,设置环境变量 USE_CLAIM_NAME=true。k8s-snapshots 将使用您为 PersistentVolumeClaim 指定的名称,而不是持久卷的自动生成名称。
可以要求 k8s-snapshots 为 Kubernetes 集群中不存在 PersistentVolume 对象的卷创建快照。例如,您可能在云提供商处有一个卷,通过直接引用在 Kubernetes 中使用。
为此,我们使用自定义 Kubernetes 资源 SnapshotRule。
首先,您需要创建此自定义资源。
在 Kubernetes 1.7 及更高版本上:
yamlcat <<EOF | kubectl create -f - apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: snapshotrules.k8s-snapshots.elsdoerfer.com spec: group: k8s-snapshots.elsdoerfer.com version: v1 scope: Namespaced names: plural: snapshotrules singular: snapshotrule kind: SnapshotRule shortNames: - sr EOF
在 Kubernetes 1.6 及更低版本上:
yamlcat <<EOF | kubectl create -f - apiVersion: apps/v1 kind: ThirdPartyResource metadata: name: snapshot-rule.k8s-snapshots.elsdoerfer.com description: "Defines snapshot management rules for a disk." versions: - name: v1 EOF
然后,您可以创建 SnapshotRule 资源:
yamlcat <<EOF | kubectl apply -f - apiVersion: "k8s-snapshots.elsdoerfer.com/v1" kind: SnapshotRule metadata: name: mysql spec: deltas: P1D P30D backend: aws disk: region: eu-west-1 volumeId: vol-0aa6f44aad0daf9f2 EOF
这是在 Amazon 云上备份 EBS 磁盘的示例。disk 选项根据后端需要不同的键。请参见 examples 文件夹。
您也可以将 SnapshotRule 资源指向 PersistentVolume(或 PersistentVolumeClaim)。这旨在作为添加注解的替代方案;对于某些人来说,将快照功能与资源分离可能更合适。
yamlcat <<EOF | kubectl apply -f - apiVersion: "k8s-snapshots.elsdoerfer.com/v1" kind: SnapshotRule metadata: name: mysql spec: deltas: P1D P30D persistentVolumeClaim: datadir-mysql EOF
设置自定义资源定义(参见上一节)后,使用 examples/backup-kops-etcd.yml 文件中定义的快照规则。引用 etcd 卷的卷 ID。
| 环境变量 | 说明 |
|---|---|
| LOG_LEVEL | 默认:INFO。可能的值:DEBUG、INFO、WARNING、ERROR |
| JSON_LOG | 默认:False。将日志消息输出为 JSON 对象,以便于处理。 |
| TZ | 默认:UTC。用于更改时区,例如 TZ=America/Montreal |
如果我手动为 k8s-snapshots 管理的卷创建快照会怎样?
从 v0.3 开始,当 k8s-snapshots 决定何时创建下一个快照以及删除哪些快照时,它不再考虑未被正确标记的快照。
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务