如果 rancher 是 HA 架构部署,在 HA 架构下,rancher 的数据是保存在 rke local K8S 集群中。所以在 rancher HA 架构下只需要通过 RKE 恢复 local 集群数据,即可同时恢复 rancher 的数据。

重要提示 此方法直接使用 RKE 进行集群恢复,它适用于 RKE 创建并导入的集群或者 RKE 部署的 local 集群

恢复准备

提示

  • 需要在进行操作的主机上提前安装 RKERKE 下载安装 kubectl
  • 在开始还原之前,请确保已停止旧集群节点上的所有 kubernetes 服务。
  • 建议创建三个全新节点作为集群恢复的目标节点。有关节点需求,请参阅HA 安装。您也可以使用现有节点,清除 Kubernetes 和 Rancher 配置,这将破坏这些节点上的数据请做好备份,点击了解节点初始化

准备恢复节点并复制最新快照

假设集群中一个或者多个 etcd 节点发生故障,或者整个集群数据丢失,则需要进行 etcd 集群恢复。

添加恢复节点并复制最新快照:

  1. 恢复节点可以是全新的节点,或者是之前集群中经过初始化的某个节点;

  2. 通过远程终端登录恢复节点

  3. 创建快照目录:

    mkdir -p /opt/rke/etcd-snapshots/
  4. 复制备份的最新快照/opt/rke/etcd-snapshots/ 目录

    • 如果使用 rke 0.2 之前版本做的备份,需拷贝 pki.bundle.tar.gz/opt/rke/etcd-snapshots/ 目录下;
    • 如果使用 rke 0.2 以及以后版本做的备份,拷贝 xxx..rkestate 文件到 rke 配置文件相同目录下;

设置 RKE 配置文件

创建原始 rancher-cluster.yml 文件的副本,比如:

cp rancher-cluster.yml rancher-cluster-restore.yml

对副本配置文件进行以下修改:

  • 注释 serviceetcd 的配置;

  • 删除或注释掉整个 addons:部分,Rancher 部署和设置配置已在 etcd 数据库中,恢复不再需要;

  • nodes:部分添加恢复节点,注释掉其他节点;

    例: rancher-cluster-restore.yml
    nodes:
    - address: 52.15.238.179 # `添加恢复节点`
    user: ubuntu
    role: [ etcd, controlplane, worker ]
    # 注释掉其他节点;
    # - address: 52.15.23.24
    # user: ubuntu
    # role: [ etcd, controlplane, worker ]
    # - address: 52.15.238.133
    # user: ubuntu
    # role: [ etcd, controlplane, worker ]
    # 注释掉 `addons:`部分
    # addons: |-
    # ---
    # kind: Namespace
    # apiVersion: v1
    # metadata:
    # ---
    ...

恢复 ETCD 数据

  1. 打开 shell 终端,切换到 RKE 二进制文件所在的目录,并且上一步修改的 rancher-cluster-restore.yml 文件也需要放在同一路径下。

  2. 根据系统类型,选择运行以下命令还原 etcd 数据:

    # MacOS
    ./rke etcd snapshot-restore --name <snapshot>.db --config rancher-cluster-restore.yml
    # Linux
    ./rke etcd snapshot-restore --name <snapshot>.db --config rancher-cluster-restore.yml

    RKE 将在恢复节点上创建包含已还原数据的 ETCD 容器,此容器将保持运行状态,但无法完成 etcd 初始化。

恢复集群

通过 RKE 在恢复节点节点上启动集群。根据系统类型,选择运行以下命令运行集群:

# MacOS
./rke up --config ./rancher-cluster-restore.yml
# Linux
./rke up --config ./rancher-cluster-restore.yml

查看节点状态

RKE 运行完成后会创建 kubectl 的配置文件 kube_config_rancher-cluster-restore.yml,可通过这个配置文件查询 K8S 集群节点状态:

kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml  get nodes

NAME STATUS ROLES AGE VERSION
52.15.238.179 Ready controlplane,etcd,worker 1m v1.10.5
18.217.82.189 NotReady controlplane,etcd,worker 16d v1.10.5
18.222.22.56 NotReady controlplane,etcd,worker 16d v1.10.5
18.191.222.99 NotReady controlplane,etcd,worker 16d v1.10.5

清理旧节点

通过 kubectl 从集群中删除旧节点

kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml  delete node 18.217.82.189 18.222.22.56 18.191.222.99

重启 恢复节点

恢复节点重启后,检查 Kubernetes Pods 的状态

kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml  get pods --all-namespaces

NAMESPACE NAME READY STATUS RESTARTS AGE
cattle-system cattle-cluster-agent-766585f6b-kj88m 0/1 Error 6 4m
cattle-system cattle-node-agent-wvhqm 0/1 Error 8 8m
cattle-system rancher-78947c8548-jzlsr 0/1 Running 1 4m
ingress-nginx default-http-backend-797c5bc547-f5ztd 1/1 Running 1 4m
ingress-nginx nginx-ingress-controller-ljvkf 1/1 Running 1 8m
kube-system canal-4pf9v 3/3 Running 3 8m
kube-system cert-manager-6b47fc5fc-jnrl5 1/1 Running 1 4m
kube-system kube-dns-7588d5b5f5-kgskt 3/3 Running 3 4m
kube-system kube-dns-autoscaler-5db9bbb766-s698d 1/1 Running 1 4m
kube-system metrics-server-97bc649d5-6w7zc 1/1 Running 1 4m
kube-system tiller-deploy-56c4cf647b-j4whh 1/1 Running 1 4m

直到 Rancher 服务器启动并且 DNS/负载均衡器指向新集群,cattle-cluster-agent 和 cattle-node-agentpods 将处于 Error 或者 CrashLoopBackOff 状态。

删除残留文件

集群恢复有可能会导致一些组件对应的 SA 鉴权失效,通过查看 kubectl --kubeconfig=kube_config_rancher-cluster-restore.yml get pods --all-namespaces 可以看到很多 pod 一直无法正常运行,查看 pod 日志可以看到 Authentication failed 等信息。这个时候需要删除一些旧的认证配置然后重新生成。

kubeconfig=kube_config_cluster.yml

# 重建 SA Token 密文
kubectl --kubeconfig=$kubeconfig -n kube-system get secrets | \
grep 'kubernetes.io/service-account-token'| awk '{print $1}' | \
grep -E 'coredns|flannel|metrics-server|horizontal|canal|calico' | \
xargs kubectl -n kube-system --kubeconfig=$kubeconfig delete --force --grace-period=0 secrets

kubectl --kubeconfig=$kubeconfig -n cattle-system get secrets | \
grep 'kubernetes.io/service-account-token'| awk '{print $1}' | grep -E 'rancher|cattle' | \
xargs kubectl -n cattle-system --kubeconfig=$kubeconfig delete --force --grace-period=0 secrets

kubectl --kubeconfig=$kubeconfig -n ingress-nginx get secrets | \
grep 'kubernetes.io/service-account-token'| awk '{print $1}' | \
grep -E 'nginx-ingress-serviceaccount' | \
xargs kubectl -n ingress-nginx --kubeconfig=$kubeconfig delete --force --grace-period=0 secrets

# 重建 kube-system 命名空间的 pod
kubectl -n kube-system --kubeconfig=$kubeconfig get pod | awk '{print $1}' | \
grep -E 'coredns|flannel|metrics-server|horizontal|canal|calico' | \
xargs kubectl -n kube-system --kubeconfig=$kubeconfig delete --force --grace-period=0 pod

# 重建 cattle-system 命名空间的 pod
kubectl -n cattle-system --kubeconfig=$kubeconfig get pod | awk '{print $1}' | \
grep -E 'rancher|cattle-node|cattle-cluster-agent' | \
xargs kubectl -n cattle-system --kubeconfig=$kubeconfig delete --force --grace-period=0 pod

# 重建 ingress-nginx 命名空间的 pod
kubectl -n ingress-nginx --kubeconfig=$kubeconfig get pod | awk '{print $1}' | \
grep -E 'nginx-ingress-controller' | \
xargs kubectl -n ingress-nginx --kubeconfig=$kubeconfig delete --force --grace-period=0 pod

添加其他节点

  1. 编辑 RKE 配置文件 rancher-cluster-restore.yml,添加或者取消其他节点的注释,addons 保持注释状态。

    例:rancher-cluster-restore.yml
    nodes:
    - address: 52.15.238.179 # `恢复节点`
    user: ubuntu
    role: [ etcd, controlplane, worker ]
    - address: 52.15.23.24
    user: ubuntu
    role: [ etcd, controlplane, worker ]
    - address: 52.15.238.133
    user: ubuntu
    role: [ etcd, controlplane, worker ]

    # addons: |-
    # ---
    # kind: Namespace
    ...
  2. 更新集群

    根据系统类型,选择运行以下命令更新集群:

    # MacOS
    ./rke up --config ./rancher-cluster-restore.yml
    # Linux
    ./rke up --config ./rancher-cluster-restore.yml