エラーメッセージ
x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
別の表記
- x509: certificate signed by unknown authority (possibly because of "x509: ECDSA verification failure" while trying to verify candidate authority certificate "Example Root CA")
kubectl は「Unable to connect to the server: tls: failed to verify certificate: 」の後にこのテキストを出力します。ECDSA の CA では、内側の理由が「crypto/rsa: verification error」ではなく「x509: ECDSA verification failure」になります。引用符で囲まれた名前は CA のコモンネームです。
kubectl and other Go clients — a CA with the right name but the wrong key (e.g. a kubeconfig from before kubeadm reset)
このエラーの意味
Go は信頼設定の中から、名前がサーバー証明書の発行者(kubeadm のクラスターでは「kubernetes」)と一致する CA を見つけて試しましたが、その CA の鍵では署名を検証できませんでした。kubeconfig にある CA と、API サーバーの証明書に実際に署名した CA という、2 つの異なる CA が同じ名前を持っています。これは、古い ~/.kube/config を残したままクラスターを再構築した(kubeadm reset と init)場合の典型的な結果です。
発生する理由
kubeadm でクラスターを作り直した
よくあるkubeadm init は、実行するたびに「kubernetes」という名前の新しい CA を生成します。以前のクラスターの kubeconfig には、同じ名前の古い CA が埋め込まれたままです。
古い ~/.kube/config や KUBECONFIG のエントリ
よくある複数のローカルクラスター(kind、minikube、k3d)を同じコンテキスト名で作り直すと、古い CA のデータが残ります。
クラスターの CA がローテーションされた
ときどきCA のローテーション後、新しい CA バンドルを受け取っていないクライアントは、kubeconfig が更新されるまでこのように失敗します。
修正方法
- 1.
CA の鍵が異なることを確認する
名前が同じで公開鍵のハッシュ値が異なれば、kubeconfig に別のクラスターの CA が入っていることが証明されます。
bash # Same name, different key? Compare the public keys of the two CAs kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' \ | base64 -d | openssl x509 -noout -pubkey | openssl sha256 sudo openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -pubkey | openssl sha256 # on a control-plane node - 2.
新しいクラスターの kubeconfig を使う
kubeadm init の後に /etc/kubernetes/admin.conf をコピーし(またはユーザーの kubeconfig を再生成し)、埋め込まれた CA が新しいクラスターと一致するようにしてください。
bash # After kubeadm init/reset: replace the old kubeconfig with the new admin.conf mkdir -p "$HOME/.kube" sudo cp /etc/kubernetes/admin.conf "$HOME/.kube/config" sudo chown "$(id -u):$(id -g)" "$HOME/.kube/config" - 3.
どの kubeconfig が有効になっているかを確認する
KUBECONFIG には複数のファイルを列挙できます。その場合、コンテキストを定義している最初のファイルが優先されます。
bash # Make sure no other kubeconfig overrides it echo "$KUBECONFIG"; kubectl config current-context