恢复销毁的 kubeadm master

问题描述

我使用 kubeadm 1.20 创建了一个 1-master 2-workers 的 kubernetes 集群并备份了 etcd。我故意销毁了master,看看如何让集群恢复到运行状态。

Kubernetes version: 1.20
Installation method: kubeadm
Host OS: windows 10 pro
Guest OS: ubuntu 18 on virtual Box 6
CNI and version: weave-net
CRI and version: docker 19

我部分成功,因为我在销毁 master 之前创建的 secret 在 etcd 恢复后可见,所以这部分似乎有效。

然而,根据 coredns pod 的日志,coredns pod 未被授权向 api 服务器发出请求:

[INFO] plugin/ready: Still waiting on: "kubernetes"
E1229 21:42:25.892580       1 reflector.go:178] pkg/mod/k8s.io/client-go@v0.18.3/tools/cache/reflector.go:125: Failed to list *v1.Namespace: Unauthorized
E1229 21:42:29.680620       1 reflector.go:178] pkg/mod/k8s.io/client-go@v0.18.3/tools/cache/reflector.go:125: Failed to list *v1.Endpoints: Unauthorized
[INFO] plugin/ready: Still waiting on: "kubernetes"
E1229 21:42:39.492521       1 reflector.go:178] pkg/mod/k8s.io/client-go@v0.18.3/tools/cache/reflector.go:125: Failed to list *v1.Service: Unauthorized

我猜这与服务帐户令牌有关,因此我缺少一个步骤来授权 pod 在替换 etcd db 后对 api-server 进行身份验证。

我错过了什么?

解决方法

如果您只备份 Etcd 的内容,那么 kubeadm 将生成用于签署 ServiceAccount JWT 的新证书。旧令牌将不再验证。由于在日常维护期间通常不会这样做,因此我认为 SA 控制器不知道重新发行令牌。如果您删除所有底层机密,它应该重新发布。