如何备份和恢复kubernetes主节点?

如何备份和恢复kubernetes主节点?,kubernetes,backup,restore,Kubernetes,Backup,Restore,有一个k8s单主节点,我需要备份它并在具有不同ip地址的不同服务器上进行恢复。我在谷歌上搜索了这个话题,找到了一个解决方案- 一切看起来都很容易;因此,我按照说明获得了证书副本和etcd数据库快照。然后,我使用第二个脚本在另一台服务器上恢复节点。这次不太顺利。它给了我一系列与证书和服务器本地ip地址不匹配相关的错误 据我所知,当kubernetes集群初始化时,它会创建一组分配给原始服务器ip地址的证书,我不能将其备份并在其他地方还原 那么,如何备份k8s主节点并将其还原?请确保在kubead

有一个k8s单主节点,我需要备份它并在具有不同ip地址的不同服务器上进行恢复。我在谷歌上搜索了这个话题,找到了一个解决方案-

一切看起来都很容易;因此,我按照说明获得了证书副本和etcd数据库快照。然后,我使用第二个脚本在另一台服务器上恢复节点。这次不太顺利。它给了我一系列与证书和服务器本地ip地址不匹配相关的错误

据我所知,当kubernetes集群初始化时,它会创建一组分配给原始服务器ip地址的证书,我不能将其备份并在其他地方还原


那么,如何备份k8s主节点并将其还原?

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

执行以下步骤:

  • 替换
    /etc/kubernetes
  • 备份
    /etc/kubernetes/pki
  • 识别
    /etc/kubernetes/pki
    中具有旧IP地址的证书 作为alt名称-第一步
  • 删除他们每个人的证书和密钥(对我来说只是 apiserver和etcd/peer)
  • 使用kubeadm alpha阶段证书重新生成证书-2nd步骤
  • 在引用的kube系统命名空间中标识configmap 旧IP-第三步
  • 手动编辑那些配置映射
  • 重新启动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
/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
$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...
2.

/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
/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
$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...
。。。 3.

/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
/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
$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...
请看这里:

更新:


在更换主节点和更改IP期间,您无法联系api服务器以在步骤4中更改configmaps。此外,如果您有单主机k8s,工作节点之间的群集连接将中断,直到新主机启动

要确保在更换主节点期间主节点和工作节点之间的连接,必须创建

证书是为{您的旧IP在这里}签名的,安全通信不能发生在{您的新IP在这里}

您可以提前在证书中添加更多IP


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

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

执行以下步骤:

  • 替换
    /etc/kubernetes
  • 备份
    /etc/kubernetes/pki
  • 识别
    /etc/kubernetes/pki
    中具有旧IP地址的证书 作为alt名称-第一步
  • 删除他们每个人的证书和密钥(对我来说只是 apiserver和etcd/peer)
  • 使用kubeadm alpha阶段证书重新生成证书-2nd步骤
  • 在引用的kube系统命名空间中标识configmap 旧IP-第三步
  • 手动编辑那些配置映射
  • 重新启动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
/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
$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...
2.

/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
/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
$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...
。。。 3.

/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
/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
$ kubectl -n kube-system get cm -o yaml | less
...
$ kubectl -n kube-system edit cm ...
请看这里:

更新:


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

要确保在更换主节点期间主节点和工作节点之间的连接,必须创建

证书是为{您的旧IP在这里}签名的,安全通信不能发生在{您的新IP在这里}

您可以提前在证书中添加更多IP


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

谢谢你的回答。因此,主要的想法是替换证书。如果我这样做,工作节点会发生什么?它们会发生吗与主机的连接松动?我已经更新了我的答案。请让我知道这是否有帮助。对于未来的社区,您可以升级并接受它。“此外,如果您有单个主机k8s,则工作节点之间的群集连接将中断,因为新主机将启动。”因此,基本上更改证书将破坏群集?我已排除了它们(工作节点)在主节点恢复后重新连接并继续工作。让我解释我的担忧。我有一个主节点和几个工作节点。主节点发生了一些问题,我丢失了它。我用我拥有的备份文件创建了一个新的主节点。在恢复一个新的主节点后,我需要重新创建证书并更新一些配置。问题是会发生什么n工作节点?我犯了一个错误,我写了“自”而不是“直到”。因此,基本上在加入新的主节点后,您必须登录到每个工作节点并更新kubelet配置以指向新的Kubernetes主节点。此文件通常位于/etc/Kubernetes/kubelet.conf。在进行此更改后重新启动kubelet服务。然后,您的群集将启动,节点之间的连接将启用d、 你需要一些额外的信息吗?还有一个问题-在kubelet配置中更新什么?我需要在workers的/etc/kubernetes/kubelet.conf中只更改主节点的ip地址吗?谢谢!谢谢