破壊されたkubeadmマスターを復元する

Dec 30 2020

kubeadm 1.20を使用して1マスター2ワーカーのkubernetesクラスターを作成し、etcdをバックアップしました。クラスターを実行状態に戻す方法をテストするために、意図的にマスターを破棄しました。

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

マスターを破棄する前に作成したシークレットがetcdの復元後に表示されるという点で部分的に成功しているため、その部分は機能しているようです。

ただし、corednsポッドのログに基づいて、corednsポッドがAPIサーバーにリクエストを送信することは許可されていません。

[INFO] plugin/ready: Still waiting on: "kubernetes"
E1229 21:42:25.892580       1 reflector.go:178] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:125: Failed to list *v1.Namespace: Unauthorized
E1229 21:42:29.680620       1 reflector.go:178] pkg/mod/k8s.io/[email protected]/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/[email protected]/tools/cache/reflector.go:125: Failed to list *v1.Service: Unauthorized

私はそれがサービスアカウントトークンと関係があると推測しているので、etcddbの置き換え後にポッドがapi-serverに対して認証することを承認するためのステップが欠けています。

何が足りないのですか?

回答

2 coderanger Dec 30 2020 at 13:38

Etcdのコンテンツのみをバックアップした場合、kubeadmはServiceAccountJWTの署名に使用される新しい証明書を生成します。古いトークンは検証されなくなりました。これは通常、定期的なメンテナンス中には行われないため、SAコントローラーがトークンを再発行することを認識していないと思います。ただし、基になるシークレットをすべて削除すると、再発行が実行されます。