エラーメッセージ
Unable to connect to the server: tls: failed to verify certificate: x509: certificate signed by unknown authority
kubectl 1.37 は、この行の前に、失敗した API ディスカバリのリクエストもエラーレベルの行として記録します。その行には「Couldn't get current server API group list」が含まれ、同じ TLS エラーも出力されます。kubeconfig の CA が本物の CA と同じ名前の場合、テキストは「(possibly because of … while trying to verify candidate authority certificate \"kubernetes\")」と続きます。
kubectl (client-go) — the API server's certificate does not chain to the kubeconfig's certificate-authority-data
このエラーの意味
kubectl は API サーバーの証明書を、システムのパブリックなルート証明書ではなく、kubeconfig に保存されたクラスターの CA(certificate-authority または certificate-authority-data)に照らして検証します。「Unknown authority」は、提示された証明書がその CA までつながらないことを意味します。kubeconfig に CA がないか、別のクラスターの CA が入っているか、手元と API サーバーの間にある何かが独自の証明書を提示しているかのいずれかです。
発生する理由
kubeconfig にクラスターの CA がない、または別のクラスターの CA が入っている
よくある手作業で編集した kubeconfig、誤ったクラスターのエントリを指すマージ済みのコンテキスト、別の証明書を返すロードバランサーに変更されたサーバー URL などが該当します。
TLS インスペクションを行うプロキシが API サーバーへの接続を再署名している
よくあるkubectl は HTTPS_PROXY を使います。企業のプロキシは独自の証明書を提示しますが、その証明書はクラスターの CA が発行したものではありません。
マネージドクラスターのエンドポイントが変わった
ときどきEKS、GKE、AKS のクラスターを作り直した場合(またはクラスターの CA をローテーションした場合)、kubeconfig の古いエントリには、もう一致しない CA が残ります。
修正方法
- 1.
kubeconfig の CA とサーバーを確認する
certificate-authority-data をデコードし、そのサブジェクトと日付を、API サーバーの証明書の発行者と比較してください。
bash kubectl config view --minify --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' \ | base64 -d | openssl x509 -noout -subject -enddate kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' - 2.
正しいクラスターの CA を埋め込む
クラスターのエントリにクラスターの CA(kubeadm では /etc/kubernetes/pki/ca.crt)を設定し、kubeconfig に埋め込んでください。
bash # kubeadm clusters: the cluster CA is /etc/kubernetes/pki/ca.crt on a control-plane node kubectl config set-cluster my-cluster --server=https://k8s.example.com:6443 \ --certificate-authority=ca.crt --embed-certs=true - 3.
マネージドクラスターの kubeconfig を再生成する
各クラウドの CLI は、現在のエンドポイントと CA を含む新しいクラスターのエントリを書き込みます。
bash # Managed clusters: regenerate the kubeconfig entry from the provider aws eks update-kubeconfig --name my-cluster --region eu-central-1 gcloud container clusters get-credentials my-cluster --region europe-west1 az aks get-credentials --resource-group rg --name my-cluster - 4.
API サーバーにはプロキシを経由せずに接続する
TLS の検証を無効にする(insecure-skip-tls-verify)のではなく、API サーバーのホストまたはネットワークを NO_PROXY に追加してください。
bash # kubectl honours HTTPS_PROXY; exclude the API server so a TLS-inspecting proxy is bypassed export NO_PROXY=k8s.example.com,10.0.0.0/8
関連するエラー
x509: certificate signed by unknown authority (possibly because of "crypto/rsa:…kubectl and other Go clientsUnable to connect to the server: tls: failed to verify certificate: x509: certi…kubectl (client-go)x509: certificate signed by unknown authorityGo crypto/x509Error response from daemon: Get "https://registry.example.com:5000/v2/": tls: f…Docker Engine (dockerd)