首页 > 解决方案 > 如何备份和恢复 Kubernetes 主节点?

问题描述

有一个k8s单主节点,我需要在不同ip地址的不同服务器上备份和恢复。我用谷歌搜索了这个主题并找到了解决方案 - https://elastisys.com/2018/12/10/backup-kubernetes-how-and-why/

一切看起来都很简单;所以,我按照说明获得了证书的副本和 etcd 数据库的快照。然后我使用第二个脚本在不同的服务器上恢复节点。这次并不顺利。它给了我一堆与证书和服务器的本地 IP 地址不匹配有关的错误。

据我了解,当 kubernetes 集群初始化时,它会创建一组分配给原始服务器 ip 地址的证书,我不能只备份它并在其他地方恢复。

那么,如何备份一个k8s主节点并恢复呢?

标签: kubernetesbackuprestore

解决方案


确保您在 kubeadm init 命令 ( --ignore-preflight-errors=DirAvailable--var-lib-etcd) 中添加了一个额外的标志,以确认我们要使用预先存在的数据。

执行以下步骤:

  • 替换所有配置文件中的IP地址/etc/kubernetes
  • 备份/etc/kubernetes/pki
  • 识别/etc/kubernetes/pki具有旧 IP 地址作为替代名称的证书-第一步
  • 删除他们每个人的证书和密钥(对我来说只是 apiserver 和 etcd/peer)
  • 使用 kubeadm alpha 阶段证书重新生成证书-第二步
  • 识别 kube-system 命名空间中引用旧 IP 的 configmap -第 3
  • 手动编辑这些配置图
  • 重启 kubelet 和 docker(强制重新创建所有容器)

1.

/etc/kubernetes/pki# for f in $(find -name "*.crt"); do openssl x509 -in $f -text -noout > $f.txt; done
/etc/kubernetes/pki# grep -Rl 12\\.34\\.56\\.78 .
./apiserver.crt.txt
./etcd/peer.crt.txt
/etc/kubernetes/pki# for f in $(find -name "*.crt"); do rm $f.txt; done

2.

/etc/kubernetes/pki# rm apiserver.crt apiserver.key
/etc/kubernetes/pki# kubeadm alpha phase certs apiserver
...
/etc/kubernetes/pki# rm etcd/peer.crt etcd/peer.key
/etc/kubernetes/pki# kubeadm alpha phase certs etcd-peer

... 3。

$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...

看看这里:master-backup

更新:

在更换主节点和更改 IP 期间,您无法联系 api-server 以更改步骤 4 中的配置映射。此外,如果您有单个主节点,则工作节点之间的 k8s 集群连接将被中断,直到新的主节点启动。

为了确保在主节点更换期间主节点和工作节点之间的连接,您必须创建HA 集群

证书是为 {your-old-IP-here} 签名的,因此 {your-new-ip-here} 无法进行安全通信

不过,您可以事先在证书中添加更多 IP...

api-server 证书是为主机名 kubernetes 签名的,因此您可以将其作为别名添加到新 IP 地址中,/etc/hosts然后执行 k ubectl --server=https://kubernetes:6443 ....


推荐阅读