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