Kubernetes: просроченный сертификат
Наш кластер Kubernetes 1.6 имел сертификаты, сгенерированные, когда кластер был построен 13 апреля 2017 года.
13 декабря 2017 года наш кластер был обновлен до версии 1.8, и были сгенерированы новые сертификаты [очевидно, неполный набор сертификатов].
13 апреля 2018 года мы начали видеть это сообщение на нашей панели управления Kubernetes для api-сервера:
[authentication.go:64] Unable to authenticate the request due to an error: [x509: certificate has expired or is not yet valid, x509: certificate has expired or is not yet valid]
Пробовал указывать клиент-сертификат и клиент-ключ внутри /etc/kubernetes/kubelet.conf
в сертификатах, сгенерированных 13 декабря [apiserver-kubelet-client.crt
а также apiserver-kubelet-client.crt
], но продолжайте видеть вышеуказанную ошибку.
Пробовал указывать клиент-сертификат и клиент-ключ внутри /etc/kubernetes/kubelet.conf
на разных сертификатах, сгенерированных 13 декабря [apiserver.crt
а также apiserver.crt
] (Честно говоря, я не понимаю разницу между этими двумя наборами сертификатов / ключей), но продолжаю видеть вышеуказанную ошибку.
Пробовал указывать клиент-сертификат и клиент-ключ внутри /etc/kubernetes/kubelet.conf
в несуществующих файлах, и ни одна из служб kube* не запустится, /var/log/syslog
жаловаться на это:
Apr 17 17:50:08 kuber01 kubelet[2422]: W0417 17:50:08.181326 2422 server.go:381] invalid kubeconfig: invalid configuration: [unable to read client-cert /tmp/this/cert/does/not/exist.crt for system:node:node01 due to open /tmp/this/cert/does/not/exist.crt: no such file or directory, unable to read client-key /tmp/this/key/does/not/exist.key for system:node:node01 due to open /tmp/this/key/does/not/exist.key: no such file or directory]
Любой совет, как преодолеть эту ошибку, или даже устранить ее на более детальном уровне? Рассматривал восстановление сертификатов для api-сервера (kubeadm alpha phase certs apiserver
), основываясь на инструкциях в https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-alpha/... но не уверен, нанесу ли я больший урон.
Относительно новый для Kubernetes, и джентльмен, который настроил это, не доступен для консультации... любая помощь приветствуется. Благодарю.
11 ответов
Каждый узел в кластере Kubernetes содержит файл конфигурации для запуска kubelet... /etc/kubernetes/kubelet.conf
... и этот файл автоматически сгенерирован kubeadm. Во время этой автоматической генерации kubeadm использует /etc/kubernetes/ca.key
создать специфичный для узла файл, /etc/kubernetes/kubelet.conf
, в котором есть две очень важные части... данные клиента сертификата и данные ключа клиента. Мой оригинальный мыслительный процесс привел меня к мысли, что мне нужно найти соответствующий файл сертификата и файл ключа, обновить эти файлы, преобразовать оба в base64 и использовать эти значения в kubelet.conf
файлы через кластер... это мышление не было правильным.
Вместо этого было исправлено использование kubeadm для регенерации. kubectl.conf
на всех узлах, а также admin.conf
, controller-manager.conf
, а также scheduler.conf
на главном узле кластера. Тебе понадобиться /etc/kubernetes/pki/ca.key
на каждом узле, чтобы ваши конфигурационные файлы включали в себя действительные данные для данных клиента-сертификата и данных клиента-ключа.
Совет профессионала: воспользуйтесь --apiserver-advertise-address
параметр, чтобы ваши новые файлы конфигурации содержали правильный IP-адрес узла, на котором размещена служба kube-apiserver.
Я думаю, вам нужно заново сгенерировать сертификат apiserver /etc/kubernetes/pki/apiserver.crt
Вы можете просмотреть текущую дату истечения срока действия, как это.
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
Not Before: Dec 20 14:32:00 2017 GMT
Not After : Dec 20 14:32:00 2018 GMT
Я считаю, что это то, что вам нужно сделать, чтобы заново создать сертификат:
Создайте CSR, используя существующий закрытый ключ.
Запустите это и получите все DNS.
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep DNS
создать CSR, включив все DNS
openssl req -new -sha256 \ -key /etc/kubernetes/pki/apiserver.key \ -days 36500 \ -subj "CN=kubernetes" \ -reqexts SAN \ -config <(cat /etc/pki/tls/openssl.cnf \ <(printf "\n[SAN]\nsubjectAltName=DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local")) \ -out apiserver.csr
Подпишите запрос CSR с помощью сертификата CA.
С помощью
/etc/kubernetes/pki/ca.key
файл подписатьapiserver.csr
и создатьapiserver.crt
скопируйте новый сертификат в папку /etc/kubernetes/pki/apiserver.crt.
- перезапустите сервер API, чтобы получить новый сервер.
Примечание: я не пробовал это сам сделайте резервную копию существующего сертификата, прежде чем делать что-либо.
Надеюсь это поможет.
Эта тема также обсуждается в:
- https://github.com/kubernetes/kubeadm/issues/581
- после обновления 1.15 kubeadm автоматически обновит сертификаты для вас!
- Также 1.15 добавлена команда для проверки срока действия сертификата в kubeadm.
- Продлить кубернетес пки после истекшего срока
Kubernetes v1.15 предоставляет документы для "Управления сертификатами с помощью kubeadm":
- https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
- Проверьте срок действия сертификата:
kubeadm alpha certs check-expiration
- Автоматическое продление сертификата:
- kubeadm обновляет все сертификаты во время обновления плоскости управления.
- Ручное продление сертификата:
- Вы можете обновить свои сертификаты вручную в любое время с помощью
kubeadm alpha certs renew
команда. - Эта команда выполняет обновление, используя сертификат CA (или front-proxy-CA) и ключ, сохраненный в / etc / kubernetes / pki.
- Вы можете обновить свои сертификаты вручную в любое время с помощью
Для Kubernetes v1.14 я считаю эту процедуру наиболее полезной:
- /questions/48368263/prodlit-kubernetes-pki-posle-istekshego-sroka/48368283#48368283
- резервное копирование и повторное создание всех сертификатов:
$ cd /etc/kubernetes/pki/
$ mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} ~/
$ kubeadm init phase certs all --apiserver-advertise-address <IP>
- сделайте резервную копию и заново сгенерируйте все файлы kubeconfig:
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,mv kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
- скопируйте новый admin.conf:
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
Для тех, кто наткнется на это в будущем и будет использовать более новую версию kubernetes >1.17, это, вероятно, самый простой способ обновить ваши сертификаты.
Следующее обновляет все сертификаты, перезапускает kubelet, делает резервную копию старой конфигурации администратора и применяет новую конфигурацию администратора:
kubeadm certs renew all
systemctl restart kubelet
cp /root/.kube/config /root/.kube/.old-$(date --iso)-config
cp /etc/kubernetes/admin.conf /root/.kube/config
На k8s 1.7 я столкнулся с аналогичной проблемой (ошибка истек x509, включенная в /var/log/kube-apiserver.log) и не смог найти сертификат с истекшим сроком действия. Мы решили перезапустить только докер apiserver на главном узле. Это решило проблему.
$ sudo docker ps -a | grep apiserver
af99f816c7ec gcr.io/google_containers/kube-apiserver@sha256:53b987e5a2932bdaff88497081b488e3b56af5b6a14891895b08703129477d85 "/bin/sh -c '/usr/loc" 15 months ago Up 19 hours k8s_kube-apiserver_kube-apiserver-ip-xxxxxc_0
40f3a18050c3 gcr.io/google_containers/pause-amd64:3.0 "/pause" 15 months ago Up 15 months k8s_POD_kube-apiserver-ip-xxxc_0
$ sudo docker restart af99f816c7ec
af99f816c7ec
$
Для версии 1.21.5 это мое решение:
шаг 1:
ssh к главному узлу, затем проверьте сертификаты на шаге 2.
шаг 2:
запустите эту команду:kubeadm certs check-expiration
root@kube-master-1:~# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[check-expiration] Error reading configuration from the Cluster. Falling back to default configuration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 21, 2022 16:05 UTC <invalid> no
apiserver Oct 21, 2022 16:05 UTC <invalid> ca no
!MISSING! apiserver-etcd-client
apiserver-kubelet-client Oct 21, 2022 16:05 UTC <invalid> ca no
controller-manager.conf Oct 21, 2022 16:05 UTC <invalid> no
!MISSING! etcd-healthcheck-client
!MISSING! etcd-peer
!MISSING! etcd-server
front-proxy-client Oct 21, 2022 16:05 UTC <invalid> front-proxy-ca no
scheduler.conf Oct 21, 2022 16:05 UTC <invalid> no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Oct 19, 2031 16:05 UTC 8y no
!MISSING! etcd-ca
front-proxy-ca Oct 19, 2031 16:05 UTC 8y no
и увидеть, что все они истекли вчера.
шаг 3:
бэкап из всех существующих сертификатов:
root@kube-master-1:~# cp -R /etc/kubernetes/ssl /etc/kubernetes/ssl.backup
root@kube-master-1:~# cp /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.backup
root@kube-master-1:~# cp /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.backup
root@kube-master-1:~# cp /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.backup
root@kube-master-1:~# cp /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.backup
шаг 4:
чтобы обновить все, запустите эту команду:kubeadm certs renew all
root@kube-master-1:~# kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W1023 15:15:16.234334 2175921 utils.go:69] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]
certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.
шаг 5: последняя строка шага 4 сообщает нам важное примечание:
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates
для завершения этого запуска:
kubectl -n kube-system delete pod -l 'component=kube-apiserver'
kubectl -n kube-system delete pod -l 'component=kube-controller-manager'
kubectl -n kube-system delete pod -l 'component=kube-scheduler'
kubectl -n kube-system delete pod -l 'component=etcd'
Шаг 6: затем перезагрузите главный узел.
шаг 7: увидеть результат:
root@kube-master-1:~# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
W1023 15:15:23.141925 2177263 utils.go:69] The recommended value for "clusterDNS" in "KubeletConfiguration" is: [10.233.0.10]; the provided value is: [169.254.25.10]
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 23, 2023 07:15 UTC 364d no
apiserver Oct 23, 2023 07:15 UTC 364d ca no
apiserver-kubelet-client Oct 23, 2023 07:15 UTC 364d ca no
controller-manager.conf Oct 23, 2023 07:15 UTC 364d no
front-proxy-client Oct 23, 2023 07:15 UTC 364d front-proxy-ca no
scheduler.conf Oct 23, 2023 07:15 UTC 364d no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Oct 19, 2031 16:05 UTC 8y no
front-proxy-ca Oct 19, 2031 16:05 UTC 8y no
все они продлены до 2023 года
Если вы уже обновили сертификаты или они были обновлены автоматически, вам придется перезапустить kube-apiserver на всех основных узлах.
Идите к мастерам и ищите
docker ps | grep -i kube-apiserver
Убей их
Для меня это решило это.
Для среды microk8s может возникнуть эта ошибка. Тогда вся ваша установка kubernetes не будет работать, когда это так. Это произошло со мной после обновления и перезагрузки моего выделенного сервера Ubuntu.
Невозможно подключиться к серверу: x509: срок действия сертификата истек или еще не действителен: текущее время 2022-04-02T16:38:24Z после 2022-03-16T14:24:02Z
Решение для этого — попросить microk8s обновить свои внутренние сертификаты, включая сертификаты kubernetes.
Для этого вы можете использовать:
sudo microk8s.refresh-certs
И перезагрузите сервер. Это сработало для меня.
Вы можете использовать эту команду для проверки даты истечения срока действия
kubectl get secret remote-certs -o json | jq -r '.data | ."remote.ca.crt"' | base64 -d | openssl x509 -noout -text | grep -A 2 -i validity
Действительность Не раньше: 2 декабря 17:19:35 2021 GMT Не позже: 2 декабря 17:29:35 2022 GMT
Проверить срок действия сертификата:kubeadm alpha certs check-expiration
Версия и ниже
Используйте эту ссылку: https://github.com/kubernetes/kubeadm/issues/581
Версия
1.15
и до версии
kubeadm alpha certs renew all
Версия
1.17
и выше
kubeadm certs renew all
Примечание:
После обновления сертификатов ошибка: "Вы должны быть авторизованы на сервере (Неавторизованный)": [Не забудьте сделать резервную копию старых сертификатов, конфигов]
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Если возникнут какие-либо проблемы, перейдите по ссылке ниже:https://www.ibm.com/docs/en/fci/1.1.0?topic=kubernetes-renewing-cluster-certificates.
У меня была эта проблема (microk8s - ubuntu 20.04.3), и обновление времени исправило ее:
sudo timedatectl set-ntp off
sudo timedatectl set-ntp on