인프런 커뮤니티 질문&답변

rooney님의 프로필 이미지

작성한 질문수

그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}

인증서만료(?) 로 인한 kubelet 실행 실패

작성

·

1.5K

1

안녕하세요

ova 이미지(1.22)를 이용하여 실습환경을 재구성하였으나, 인증서 만료로 인한 문제인지 kubelet 실행이 되지 않는 상황입니다.

로그 확인 시 아래와 같은 로그가 확인되어, kubeadm 명령을 통해 인증서 renew 를 진행하였으나 문제는 동일합니다.

Jun 9 23:46:29 m-k8s kubelet: E0609 23:46:29.935776 1235 bootstrap.go:265] part of the existing bootstrap client certificate in /etc/kubernetes/kubelet.conf is expired: 2023-05-20 00:32:02 +0000 UTC

Jun 9 23:46:29 m-k8s kubelet: E0609 23:46:29.935812 1235 server.go:294] "Failed to run kubelet" err="failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory"

인증서와 bootstrap-kubelet.conf 파일이 연관이 있는 것 인지 또한 궁금합니다.

위 이슈에 대한 원인, 해결방안등을 설명해주시면 감사하겠습니다.

감사합니다.

 

 

답변 4

0

조훈(Hoon Jo)님의 프로필 이미지
조훈(Hoon Jo)
지식공유자

인증서와 관련해서 다음을 보시면 도움이 되실 것 같습니다.

https://kubernetes.io/docs/setup/best-practices/certificates/

rooney님의 프로필 이미지
rooney
질문자

설명해주신 내용과 참고 링크들이 이번 이슈와 관련하여 공부하고 이해하는데 많은 도움이 됐습니다.

이렇게 빨리 답변주실거라곤 생각도 못했는데..

번개같은 속도로 답변주셔서 너무너무너무 감사합니다.

조훈최고!

0

조훈(Hoon Jo)님의 프로필 이미지
조훈(Hoon Jo)
지식공유자

[root@m-k8s ~]# 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'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jun 07, 2033 00:33 UTC   9y                                      no      
apiserver                  Jun 07, 2033 00:33 UTC   9y              ca                      no      
apiserver-etcd-client      Jun 07, 2033 00:33 UTC   9y              etcd-ca                 no      
apiserver-kubelet-client   Jun 07, 2033 00:33 UTC   9y              ca                      no      
controller-manager.conf    Jun 07, 2033 00:33 UTC   9y                                      no      
etcd-healthcheck-client    Jun 07, 2033 00:33 UTC   9y              etcd-ca                 no      
etcd-peer                  Jun 07, 2033 00:33 UTC   9y              etcd-ca                 no      
etcd-server                Jun 07, 2033 00:33 UTC   9y              etcd-ca                 no      
front-proxy-client         Jun 07, 2033 00:33 UTC   9y              front-proxy-ca          no      
scheduler.conf             Jun 07, 2033 00:33 UTC   9y                                      no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Jun 07, 2033 00:32 UTC   9y              no      
etcd-ca                 Jun 07, 2033 00:32 UTC   9y              no      
front-proxy-ca          Jun 07, 2033 00:32 UTC   9y              no 

0

조훈(Hoon Jo)님의 프로필 이미지
조훈(Hoon Jo)
지식공유자

1-3번으로 조치 완료 하였습니다.

다시 내려받아서 진행하시면 될 것 같습니다. :)


image

0

조훈(Hoon Jo)님의 프로필 이미지
조훈(Hoon Jo)
지식공유자

안녕하세요

좋은 질문에 감사드립니다.

1.인증서 이슈

우선 kubeadm renew 명령으로 인증서는 갱신되나 (/etc/kubernetes/pki) 이들이 각 컴포넌트(api,etcd,controller,scheduler)에 적용되지 않습니다.

따라서 다음의 방법들을 조치해야 합니다.

1-1) Manual

renew 이후에 각 컴포넌트에 모두 맞도록 하나하나 끼워 넣는 방법입니다.

expired 되지 않았다면, 노드 버전을 올리는 것으로 조치할 수 있으나...이미 expired 된 경우에는 manual 조치해야 할 것으로 보여집니다.

다만 alpha 시절에는 kubeadm 명령줄로 지원되었으나, 현재에는 config를 작성해야 합니다.

alpha 시절은 다음과 같으며..

https://www.ibm.com/docs/en/fci/1.1.0?topic=kubernetes-renewing-cluster-certificates
현재는

cluster config를 만들어서 넣어야 합니다. (--org 등 명령이 outdate 되었습니다)

https://www.reddit.com/r/kubernetes/comments/z10co9/kubeadm_creating_additional_user_for_the_cluster/

저라면 인증서를 찾아서 개별 컴포넌트 파일에 모두 맞춰서 넣을 것 같습니다.


1-2) Vagrant up으로 배포하기

이 방법이 조치라고 볼 수 없긴 한데 1-1이 현실적으로 매우 복잡하니 , 대안이 될 수는 있을 것 같습니다.

현재 랩탑이 안된다면 되는 곳에서 추출해서 넣으실 수 있습니다.

1-3) 1-2주 정도 기다리기

이 방법은 즉각적인 조치라고 볼 수는 없긴 한데...1년은 좀 짧으니 더 긴 기간으로 다시 만들고 올리도록 하겠습니다.

 

2.kubelet bootstrap

아마 추측으로 드리는 부분이긴 한데...동작에 관심이 있으신거 같아서 다음의 내용을 공유드립니다.

다른 오픈소스 제품들도 유사하지만 소스 코드에 주석 및 쉬운 구성으로 설명되어 있어서 다음의 내용을 참고하시는게 좋을 것 같습니다.

간략하게 말씀드리자면, 저희가 알고 있는 부트스트랩처럼 init 해주는 역할을 본다고 보시면 될 것 같습니다.

// Bootstrap is a bootstrapping interface for kubelet, targets the initialization protocol

type Bootstrap interface {

GetConfiguration() kubeletconfiginternal.KubeletConfiguration

BirthCry()

StartGarbageCollection()

ListenAndServe(kubeCfg kubeletconfiginternal.KubeletConfiguration, tlsOptions server.TLSOptions, auth server.AuthInterface, tp trace.TracerProvider)

ListenAndServeReadOnly(address net.IP, port uint)

ListenAndServePodResources()

Run(<-chan kubetypes.PodUpdate)

RunOnce(<-chan kubetypes.PodUpdate) ([]RunPodResult, error)

https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet.go#L232

 

rooney님의 프로필 이미지

작성한 질문수

질문하기