Продлить кубернетес пки после истекшего срока
Моя PKI kubernetes истекла (сервер API, если быть точным), и я не могу найти способ его обновить. Я получаю ошибку
May 27 08:43:51 node1 kubelet[8751]: I0527 08:43:51.922595 8751 server.go:417] Version: v1.14.2
May 27 08:43:51 node1 kubelet[8751]: I0527 08:43:51.922784 8751 plugins.go:103] No cloud provider specified.
May 27 08:43:51 node1 kubelet[8751]: I0527 08:43:51.922800 8751 server.go:754] Client rotation is on, will bootstrap in background
May 27 08:43:51 node1 kubelet[8751]: E0527 08:43:51.925859 8751 bootstrap.go:264] Part of the existing bootstrap client certificate is expired: 2019-05-24 13:24:42 +0000 UTC
May 27 08:43:51 node1 kubelet[8751]: F0527 08:43:51.925894 8751 server.go:265] failed to run Kubelet: unable to load bootstrap
kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory
Документация по https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/ описывает, как обновить, но работает только в том случае, если срок действия сервера API не истек. Я пытался сделать
kubeadm alpha cert renew all
и выполнить перезагрузку, но это привело к отказу всего кластера, поэтому я сделал откат к снимку (мой кластер работает на VMware).
Кластер работает, и все контейнеры работают, но я не могу получить к нему доступ через kubectl, поэтому не могу развернуть или запросить. Любая документация или руководство о том, как обновить, очень помогло бы
13 ответов
Таким образом, решение было (сначала резервная копия)
$ 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>
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,mv kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
затем
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
что сделал работу для меня и спасибо за ваши советы:)
Эта тема также обсуждается в:
- https://github.com/kubernetes/kubeadm/issues/581
- после обновления 1.15 kubeadm автоматически обновит сертификаты за вас!
- также 1.15 добавил команду для проверки истечения срока действия сертификата в kubeadm
- Kubernetes: просроченный сертификат
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 я считаю эту процедуру наиболее полезной:
Я использовал Kubernetes v15.1 и обновил свои сертификаты, как описано выше, но все равно получал ту же ошибку. /Etc/kubernetes/kubelet.conf еще со ссылкой на сообщение истек / старый "клиент-сертификат-данные".
После некоторого исследования я обнаружил, что kubeadm не обновляет файл /etc/kubernetes/kubelet.conf, если для сертификата-возобновление не задано значение true. Обратите внимание на ошибку в kubeadm версии ниже 1.17 (https://github.com/kubernetes/kubeadm/issues/1753).
kubeadm обновляется только в том случае, если обновление кластера было выполнено с сертификатом-возобновлением =true. Поэтому мне пришлось вручную удалить /etc/kubernetes/kubelet.conf и восстановить его с помощьюkubeadm init phase kubeconfig kubelet
что, наконец, устранило мою проблему.
Попробуйте продлить сертификат через kubeadm init phase certs
команда.
Вы можете проверить срок действия сертификатов с помощью следующей команды:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text
openssl x509 -in /etc/kubernetes/pki/apiserver-kubelet-client.crt -noout -text
Во-первых, убедитесь, что у вас есть самая последняя резервная копия инвентаризации сертификатов k8s. /etc/kubernetes/pki/*
,
удалять apiserver.*
а также apiserver-kubelet-client.*
файлы сертификатов в /etc/kubernetes/pki/
каталог.
Возникать новые сертификаты через kubeadm init phase certs
команда:
sudo kubeadm init phase certs apiserver
sudo kubeadm init phase certs apiserver-kubelet-client
Запустить снова kubelet
а также docker
демоны:
sudo systemctl restart docker; sudo systemctl restart kubelet
Вы можете найти более подробную информацию в официальной документации K8s.
Это обновит все сертификаты под /etc/kubernetes/ssl
kubeadm alpha certs renew all --config=/etc/kubernetes/kubeadm-config.yaml
и сделайте это, чтобы перезапустить связь с сервером:
kill -s SIGHUP $(pidof kube-apiserver)
kill -s SIGHUP $(pidof kube-controller-manager)
kill -s SIGHUP $(pidof kube-scheduler)
[root@nrchbs-slp4115 ~]# kubectl get apiservices |egrep metrics
v1beta1.metrics.k8s.io kube-system/metrics-server True 125m
[root@nrchbs-slp4115 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 20d
metrics-server ClusterIP 10.99.2.11 <none> 443/TCP 125m
[root@nrchbs-slp4115 ~]# kubectl get ep -n kube-system
NAME ENDPOINTS AGE
kube-controller-manager <none> 20d
kube-dns 10.244.0.5:53,10.244.0.6:53,10.244.0.5:53 + 3 more... 20d
kube-scheduler <none> 20d
metrics-server 10.244.2.97:443 125m
[root@nrchbs-slp4115 ~]#
Чтобы помочь кому-либо еще с настройкой Multi-Master, поскольку я искал ответ после того, как первый мастер был обновлен на втором, я сделал это, я нашел это из другого вопроса:
kubeadm обновляется только в том случае, если обновление кластера было выполнено с сертификатом-возобновлением =true. Поэтому мне пришлось вручную удалить /etc/kubernetes/kubelet.conf и восстановить его с помощью kubeadm init phase kubeconfig kubelet, что, наконец, устранило мою проблему.
В моем случае у меня такая же проблема после обновления сертификата. Мой кластер был построен с помощью Kubespray. Мой кубелет перестал работать, и он говорил, что у меня нет
/etc/kubernetes/bootstrap-kubelet.conf
файл, поэтому я посмотрел, что делает этот конфиг.
--bootstrap-kubeconfig string
| Path to a kubeconfig file that will be used to get client certificate for kubelet. If the file specified by --kubeconfig does not exist, the bootstrap kubeconfig is used to request a client certificate from the API server. On success, a kubeconfig file referencing the generated client certificate and key is written to the path specified by --kubeconfig. The client certificate and key file will be stored in the directory pointed by --cert-dir.
Я понял, что этот файл может быть не нужен.
Примечание, что я обновил k8s 1.19 с помощью:
kubeadm alpha certs renew apiserver-kubelet-client
kubeadm alpha certs renew apiserver
kubeadm alpha certs renew front-proxy-client
... и этого было недостаточно.
Решение было
cp -r /etc/kubernetes /etc/kubernetes.backup
kubeadm alpha kubeconfig user --client-name system:kube-controller-manager > /etc/kubernetes/controller-manager.conf
kubeadm alpha kubeconfig user --client-name system:kube-scheduler > /etc/kubernetes/scheduler.conf
kubeadm alpha kubeconfig user --client-name system:node:YOUR_MASTER_HOSTNAME_IS_HERE --org system:nodes > /etc/kubernetes/kubelet.conf
kubectl --kubeconfig /etc/kubernetes/admin.conf get nodes
Я использую config.yaml
настроить Мастера так, что для меня ответ был:
sudo -i
mkdir -p ~/k8s_backup/etcd
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} ~/k8s_backup
cd /etc/kubernetes/pki/etcd
mv {healthcheck-client.crt,healthcheck-client.key,peer.crt,peer.key,server.crt,server.key} ~/k8s_backup/etcd/
kubeadm init phase certs all --ignore-preflight-errors=all --config /etc/kubernetes/config.yaml
cd /etc/kubernetes
mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/k8s_backup
kubeadm init phase kubeconfig all --config /etc/kubernetes/config.yaml --ignore-preflight-errors=all
На всякий случай перезагружаюсь
shutdown now -r
Лучшее решение, как написал Ким Нильсен.
$ 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>
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
$ kubeadm init phase kubeconfig all
$ reboot
С помощью следующей команды вы можете проверить, когда истечет срок действия новых сертификатов:
$ kubeadm alpha certs check-expiration --config=/etc/kubernetes/kubeadm-config.yaml
или же
$ kubeadm certs check-expiration --config=/etc/kubernetes/kubeadm-config.yaml
Однако, если у вас более одного мастера, вам необходимо скопировать эти файлы на них.
Войдите на второй мастер и сделайте (бэкап):
$ 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} ~/
$ cd /etc/kubernetes/
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} ~/
Затем войдите в систему на первом мастере (где вы создали новые сертификаты) и выполните следующие команды (node2 должен быть изменен на IP-адрес второго мастера):
$ rsync /etc/kubernetes/pki/*.crt -e ssh root@node2:/etc/kubernetes/pki/
$ rsync /etc/kubernetes/pki/*.key -e ssh root@node2:/etc/kubernetes/pki/
$ rsync /etc/kubernetes/*.conf -e ssh root@node2:/etc/kubernetes/
В моих кластерах все три узла плоскости управления отключены.
Я решил это так:
cp -a /etc/ /etc-saved
kubeadm certs renew all
rm /etc/kubernetes/kubelet.conf
kubeadm init phase kubeconfig all
reboot
Выполнение этого на всех трех узлах решило проблему.
kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) >/etc/kubernetes/kubelet.conf
Обновление kubelet.conf помогает мне решить эту проблему.
Я могу решить эту проблему с помощью следующих шагов:
openssl req -new -key <existing.key> -sub "/CN=system:node:<HOST_NAME>/O=system:nodes" -out new.csr
- <existing.key> — использовать из kubelet.conf
- <HOST_NAME> - имя хоста в нижнем регистре (ссылайтесь на сертификат с истекшим сроком действия с помощью команды openssl ex:
openssl x509 -in old.pem -text -noout
)
openssl x509 -req -in new.csr -CA <ca.crt> -CAkey <ca.key> -CAcreateserial -out new.crt -days 365
- <ca.crt> - от главного узла
- <ca.key> - от
- new.crt - обновленный сертификат заменяется сертификатом с истекшим сроком действия.
После замены перезапустите kubelet и docker или любой другой контейнерный сервис.