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

Я считаю, что это то, что вам нужно сделать, чтобы заново создать сертификат:

  1. Создайте 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
  1. Подпишите запрос CSR с помощью сертификата CA.

    С помощью /etc/kubernetes/pki/ca.key файл подписать apiserver.csr и создать apiserver.crt

  2. скопируйте новый сертификат в папку /etc/kubernetes/pki/apiserver.crt.

  3. перезапустите сервер API, чтобы получить новый сервер.

Примечание: я не пробовал это сам сделайте резервную копию существующего сертификата, прежде чем делать что-либо.

Надеюсь это поможет.

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


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

kubeadm alpha certs check-expiration
  • Автоматическое продление сертификата:
    • kubeadm обновляет все сертификаты во время обновления плоскости управления.
  • Ручное продление сертификата:
    • Вы можете обновить свои сертификаты вручную в любое время с помощью kubeadm alpha certs renew команда.
    • Эта команда выполняет обновление, используя сертификат CA (или front-proxy-CA) и ключ, сохраненный в / etc / kubernetes / pki.

Для Kubernetes v1.14 я считаю эту процедуру наиболее полезной:

$ 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

Убей их контейнеры и подождите 10-15 секунд, он должен начать работать.

Для меня это решило это.

Для среды 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
Другие вопросы по тегам