Сообщение об ошибке
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. Если у CA в kubeconfig то же имя, что и у настоящего, текст продолжается так: «(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-сервера по CA кластера, сохранённому в kubeconfig (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.
Посмотрите на CA и сервер в kubeconfig
Декодируйте 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-серверу в обход прокси
Добавьте хост или сеть API-сервера в NO_PROXY, а не отключайте проверку TLS (insecure-skip-tls-verify).
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)