Kubeadm не может подписать сертификат при обновлении - PullRequest
0 голосов
/ 20 сентября 2019

Во время обновления Kubernetes с 1.14 до 1.15 с помощью kubespray у моей команды была проблема блокировки со следующим сообщением на шаге «Обновление первого мастера»:

[upgrade/apply] FATAL: couldn''t upgrade control plane.
kubeadm has tried to recover everything into the earlier state.
Errors faced: [failed to renew certificates for component "kube-apiserver":
failed to renew certificate apiserver-kubelet-client:
unable to sign certificate:
must specify at least one ExtKeyUsage,
rename /etc/kubernetes/tmp/kubeadm
-backup-manifests-2019-09-19-09-06-27/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml: no such file or directory]'

При попытке изолировать задачу и вручную запуститьКомандная строка kubeadm приводит к тому же сообщению об ошибке:

#/usr/local/bin/kubeadm upgrade apply -y v1.15.3 --config=/etc/kubernetes/kubeadm-config.yaml --ignore-preflight-errors=all --allow-experimental-upgrades --allow-release-candidate-upgrades --etcd-upgrade=false -v 6 

или даже попытке просто вручную обновить сертификат:

/etc/kubernetes/pki# kubeadm alpha certs renew apiserver-kubelet-client -v 9
I0919 14:42:11.515503   18597 initconfiguration.go:105] detected and using CRI socket: /var/run/dockershim.sock
I0919 14:42:11.515897   18597 interface.go:384] Looking for default routes with IPv4 addresses
I0919 14:42:11.515916   18597 interface.go:389] Default route transits interface “eth0”
I0919 14:42:11.516284   18597 interface.go:196] Interface eth0 is up
(...)
I0919 14:42:11.516835   18597 feature_gate.go:216] feature gates: &{map[]}
failed to renew certificate apiserver-kubelet-client: unable to sign certificate: must specify at least one ExtKeyUsage

Решение было найдено в конце концов и опубликовано ниже.

1 Ответ

1 голос
/ 20 сентября 2019

Проблема исходит от kubeadm, который использует старые сертификаты, когда ему нужно обновить их.Но если эти исходные сертификаты слишком старые или были сгенерированы вручную, они могут не включать некоторые обязательные поля, которые должны быть там.

В сообщении об ошибке ExtKeyUsage относится к полю X509v3 Extended Key Usage.

Вы можете проверить это, просмотрев свои сертификаты: задействованы 2 сертификата: apiserver-kubelet-client.crt и front-proxy-client.crt

Они расположены на главных хостах в /etc/kubernetes/pki.

Вы можете проверить их с помощью

# openssl x509 -in apiserver-kubelet-client.crt -text -noout

Если они не содержат следующего (ближе к концу), тогда kubeadm не сможет полностью обновить сертификат

(...)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Client Authentication

TL; DR;

Решение состоит в том, чтобы просто создать новые сертификаты с помощью следующей процедуры

######### Backup your certificates (just in case)
master01:/etc/kubernetes/pki# cp -a /etc/kubernetes/pki /root/backup_cert/
######### Delete incomplete certificates
master01:/etc/kubernetes/pki# rm apiserver-kubelet-client.*
master01:/etc/kubernetes/pki# rm front-proxy-client.*
######### Then recreate them
master01:/etc/kubernetes/pki# kubeadm init phase certs apiserver-kubelet-client 
master01:/etc/kubernetes/pki# kubeadm init phase certs front-proxy-client

Теперь вы можете перезапустить процедуру обновления, которая должна быть в порядке.(Примечание: если ваш кластер был оставлен в состоянии, когда ваш первый мастер имеет состояние SchedulingDisabled, то не забудьте отменить привязку хоста, потому что kubespray playbook не исправит это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...