5 - 备份和恢复


    RKE集群可以设置成自动创建etcd快照,在灾难发生时可以通过这些快照进行恢复,这些快照保存在本地目录。

    v0.2.0版本可用

    RKE还可以将快照上传到S3兼容的后端。此外pki.bundle.tar.gz文件不再需要,因为v0.2.0使用xxxx.rkestate存储Kubernetes集群状态

    rke etcd snapshot-save命令将从集群中的每个etcd节点保存etcd快照,快照保存在/opt/rke/etcd-snapshots中。运行该命令时,将创建一个附加容器来获取快照。快照完成后,容器将自动删除。

    在v0.2.0之前,RKE保存了证书的备份,名为pki.bundle.tar.gz,也保存在/opt/rke/etcd-snapshots中。在v0.2.0之前的版本中,系统恢复需要快照和pki包文件。

    2、本地手动快照示例

    快照将保存在: /opt/rke/etcd-snapshots

    3、手动快照上传到S3示例

    1. rke etcd snapshot-save --config cluster.yml --name <snapshot-name> \
    2. --s3 --access-key <S3_ACCESS_KEY> --secret-key <S3_SECRET_KEY> \
    3. --bucket-name <s3-bucket-name> --s3-endpoint <s3.amazonaws.com>

    快照将保存在:/opt/rke/etcd-snapshots,同时也将上传到S3。

    需要使用额外的配置选项启用etcd-snapshot服务,默认情况下,etcd-snapshot服务为具有etcd角色的每个节点获取快照,并将它们存储到本地磁盘/opt/rke/etcd-snapshot目录中。如果有配置S3相关参数,快照也将被上传到S3存储后端。

    当集群启用了etcd-snapshot服务时,可以查看etcd-roll-snapshot容器日志,以确认是否自动创建备份。

    1. docker logs etcd-rolling-snapshots
    2. time="2018-05-04T18:39:16Z" level=info msg="Initializing Rolling Backups" creation=1m0s retention=24h0m0s
    3. time="2018-05-04T18:40:16Z" level=info msg="Created backup" name="2018-05-04T18:40:16Z_etcd" runtime=108.332814ms
    4. time="2018-05-04T18:41:16Z" level=info msg="Created backup" name="2018-05-04T18:41:16Z_etcd" runtime=92.880112ms
    5. time="2018-05-04T18:42:16Z" level=info msg="Created backup" name="2018-05-04T18:42:16Z_etcd" runtime=83.67642ms

    根据您的RKE版本,用于配置自动定时快照的选项可能有所不同。

    • v0.2.0以及之后版本
    1. services:
    2. etcd:
    3. backup_config:
    4. interval_hours: 12
    5. retention: 6
    6. access_key: S3_ACCESS_KEY
    7. secret_key: S3_SECRET_KEY
    8. bucket_name: s3-bucket-name
    9. region: ""
    10. endpoint: s3.amazonaws.com
    • v0.2.0之前

    选项描述Snapshot默认情况下,禁用定时快照服务。要启用该服务,需要在etcd服务中将其设置为trueCreation默认情况下,快照服务将每隔5分钟创建一次(5m0s)。Retention默认情况下,所有快照保留24小时。

    1. services:
    2. etcd:
    3. snapshot: true
    4. creation: 5m0s
    5. retention: 24h

    重要提示: rke 0.1.x与rke 0.2.x因为的改变,如果集群是通过rke 0.1.x做的备份,那么无法直接使用rke 0.2.x进行数据恢复。如果集群状态正常,可以在恢复之前运行rke up —config cluster.yml进行集群状态更新。如果集群状态不正常,那只能通过rke 0.1.x进行恢复。

    警告: 恢复etcd快照会删除当前的etcd集群并将其替换为新集群。在运行该rke etcd snapshot-restore命令之前,应备份集群中的所有重要数据。

    1、rke etcd snapshot-restore选项

    2、从本地快照还原示例

    当从本地快照恢复etcd时,假设快照位于/opt/rke/etcd-snapshots中。在rke v0.2.0之前的版本中,pki.bundle.tar.gz文件也应该在相同的位置, 从v0.2.0开始,不再需要这个文件,因为v0.2.0改变了Kubernetes集群状态的存储方式

    当从S3中的快照恢复etcd时,命令需要S3信息,以便连接到S3后端并检索快照。

    1. rke etcd snapshot-restore --config cluster.yml --name snapshot-name \
    2. --s3 --access-key S3_ACCESS_KEY --secret-key S3_SECRET_KEY \
    3. --bucket-name s3-bucket-name --s3-endpoint s3.amazonaws.com

    在本例中,Kubernetes集群部署在两个AWS节点上。

    1、备份etcd集群

    以Kubernetes集群的本地快照为例。从v0.2.0开始,您还可以使用S3选项将此快照直接上传到S3后端。

    1. rke etcd snapshot-save --name snapshot.db --config cluster.yml

    2、将快照存储在S3

    从v0.2.0开始,不再需要这个步骤,因为RKE在运行rke etcd snapshot-save命令时,可以通过添加S3选项自动从S3上传和下载快照。

    node2上获取etcd快照之后,我们建议将该备份保存在持久性位置。其中一个选项是保存快照文件和pki.bundle.tar.gz文件到S3。

    1. # If you're using an AWS host and have the ability to connect to S3
    2. root@node2:~# s3cmd mb s3://rke-etcd-backup
    3. root@node2:~# s3cmd /opt/rke/etcd-snapshots/snapshot.db /opt/rke/etcd-snapshots/pki.bundle.tar.gz s3://rke-etcd-backup/

    为了模拟失败场景,我们关闭node2

      在恢复etcd并运行rke up之前,我们需要检索保存在S3上的备份到一个新节点,例如: node3。从v0.2.0开始,您可以在运行restore命令时直接从S3检索快照,所以这一步是针对那些没有使用集成S3选项而在外部存储快照的用户。

      4、通过备份恢复etcd到新节点上

      在更新和恢复etcd之前,您需要编辑cluster.yml配置文件,添加新节点并设置为etcd角色,注释掉所有旧节点。

      1. - address: 10.0.0.1
      2. hostname_override: node1
      3. user: ubuntu
      4. role:
      5. - controlplane
      6. - worker
      7. # - address: 10.0.0.2
      8. # hostname_override: node2
      9. # user: ubuntu
      10. # role:
      11. # - etcd
      12. - address: 10.0.0.3
      13. hostname_override: node3
      14. user: ubuntu
      15. role:
      16. - etcd

      将新节点添加到cluster.yml之后。运行rke etcd snapshot-restore从备份启动etcd。快照和pki.bundle.tar.gz文件需要预先放在/opt/rke/etcd-snapshot目录中。

      从v0.2.0开始,如果您想直接从S3检索快照,请添加S3选项

      1. rke etcd snapshot-restore --name snapshot.db --config cluster.yml

      最后,我们需要恢复集群上的操作是让Kubernetes API指向新的etcd,方法是使用新的cluster.yml再次运行rke up

      1. rke up --config cluster.yml

      通过检查集群上的pod,来确认Kubernetes集群是否正常工作。

      1. > kubectl --kubeconfig=kube_configxxx.yml get pods
      2. NAME READY STATUS RESTARTS AGE
      3. nginx-65899c769f-kcdpr 1/1 Running 0 17s
      4. nginx-65899c769f-pc45c 1/1 Running 0 17s
      5. nginx-65899c769f-qkhml 1/1 Running 0 17s

      v0.1.9开始,在恢复成功和失败时都会删除rke-bundle-cert容器。要调试任何问题,您需要查看从rke生成的日志文件

      v0.1.8以及早期版本中,rke-bundle-cert容器是etcd恢复失败后遗留下来的。如果您在还原etcd快照时遇到问题,那么在尝试进行另一次还原之前,您可以在每个etcd节点上执行以下操作:

      etcd备份或恢复成功时,通常会删除rke-bundle-cert容器。无论什么时候出现问题,都会留下rke-bundle-cert容器。您可以查看日志或检查容器,看看问题出在哪里。

      1. docker container logs --follow rke-bundle-cert