kubernetes - 如何备份和恢复 Kubernetes 主节点?
问题描述
有一个k8s单主节点,我需要在不同ip地址的不同服务器上备份和恢复。我用谷歌搜索了这个主题并找到了解决方案 - https://elastisys.com/2018/12/10/backup-kubernetes-how-and-why/
一切看起来都很简单;所以,我按照说明获得了证书的副本和 etcd 数据库的快照。然后我使用第二个脚本在不同的服务器上恢复节点。这次并不顺利。它给了我一堆与证书和服务器的本地 IP 地址不匹配有关的错误。
据我了解,当 kubernetes 集群初始化时,它会创建一组分配给原始服务器 ip 地址的证书,我不能只备份它并在其他地方恢复。
那么,如何备份一个k8s主节点并恢复呢?
解决方案
确保您在 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 ....
。
推荐阅读
- marklogic - 搜索语法以获取 Marklogic 中没有该字段的文档
- ruby-on-rails - 如何在 Windows 上正确安装 bootsnap
- c# - 为什么 MVC 基类的实现与 WebForms 截然不同?
- matlab - 如何使用路径信息找到两个节点之间的最短路径?
- c# - 如何使用类在 c# 中的链表中创建然后声明链表?
- python - 如何将列表转换为html
- 在 django 模板中使用 for 循环
- javascript - 如何调查为什么 setTimeout 函数在我的代码中不起作用?
- google-forms - Google 表单中的多项选择下拉列表
- javascript - 在 Elasticsearch 中,为什么我的多行脚本不起作用?
- android - 我怎样才能循环通过一堆按钮来减少代码?