Продлить кубернетес пки после истекшего срока

Моя 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

что сделал работу для меня и спасибо за ваши советы:)

Эта тема также обсуждается в:


Kubernetes v1.15 предоставляет документацию для "Управления сертификатами с помощью kubeadm":

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 или любой другой контейнерный сервис.

Другие вопросы по тегам