더듬이

[Kubespawner] kubernetes pkl 인증서 갱신 본문

Kubernetes

[Kubespawner] kubernetes pkl 인증서 갱신

dbhang 2021. 3. 31. 19:42

예전에 끔찍한 일이 한번 있었다.

kubespawner에서 컨테이너를 생성하는데 생전 처음보는 에러가 생성되었다.

SSL인증서가 만료되었다고 하는 말에 SSL 인증서 쓰는게 뭐있지... 하고 생각만했었다.

 

 

에러 로그 확인

 

HTTPSConnectionPool(host=hostVM, port=6443): Max retries exceeded with url: /api/v1/namespaces (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')])")))

 

해당 문제를 검색해보니  kubernetes cluster내부에서 통신시에 사용하는 ssl 인증서가 만료되어 발생한 문제였다.

그래서 인증서 갱신을 할때 사용하는 kubectl 명령어로 인증서를 갱신하려했지만.....

 

 

어떤 kubectl 명령어를 사용해도 아래와 같은 에러가발생했었다.

The connection to the serve
r hostvm:6443 was refused - did you specify the right host or port?

하.. 쿠버네티스 API 인증서도 만료.... 이때부터 눈물이 앞을 가렸다....

 

인증서 유효기간 확인 

이제 남은건 kubernetes cluster 구성할때 이후로 한번도 써보지않은 kubeadm으로 인증서를 갱신하는 방법이다.

kubeadm alpha certs check-expiration

를 통해 인증서 남은 날짜를 확인하고  

 

 

인증서 백업

일단 이전 인증서들을 백업하자. 

mkdir /home/myuser/kube-backup/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} /home/myuser/kube-backup/pki
 
 
mkdir /home/myuser/kube-backup/conf_dir
mv /etc/kubernetes/*.conf /home/myuser/kube-backup/conf_dir

 

인증서 갱신! 

이후 아래 명령어를 통해 모든 인증서를 갱신한다.

kubeadm init phase certs all

그러면 아래와 같이 인증서들이 새로 생긴다. 

[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [master-node kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs 
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [master-node localhost] and IPs []
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [master-node localhost] and IPs []
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key

 

이제 다시 인증서 정보를 검색해보면 인증서 기간이연장된 것이 보인다.  

kubeadm alpha certs check-expiration

 

config 파일에서 인증서 사용되는 필드 변경

내 master node는 예전에 한번 갱신해줘서 admin.conf 가 27일 남았지만

아마 만료 이후에 새로 인증서 갱신한 사람들은 만료되었다고 떳을 것이다 .

admin.conf 등의 config 파일들은 새로 갱신된 인증값들에 맞춰 따로 갱신해야한다. 

W1209 11:22:11.438102   94815 validation.go:28] Cannot validate kube-proxy config - no validator is available
W1209 11:22:11.441018   94815 validation.go:28] Cannot validate kubelet config - no validator is available
CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jan 06, 2021 01:06 UTC   27d                                     no
apiserver                  Dec 09, 2021 02:21 UTC   364d            ca                      no
apiserver-etcd-client      Dec 09, 2021 02:21 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Dec 09, 2021 02:21 UTC   364d            ca                      no
controller-manager.conf    Jan 06, 2021 01:06 UTC   27d                                     no
etcd-healthcheck-client    Dec 09, 2021 02:21 UTC   364d            etcd-ca                 no
etcd-peer                  Dec 09, 2021 02:21 UTC   364d            etcd-ca                 no
etcd-server                Dec 09, 2021 02:21 UTC   364d            etcd-ca                 no
front-proxy-client         Dec 09, 2021 02:21 UTC   364d            front-proxy-ca          no
scheduler.conf             Jan 06, 2021 01:06 UTC   27d                                     no
 
CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Dec 07, 2030 02:21 UTC   9y              no
etcd-ca                 Dec 07, 2030 02:21 UTC   9y              no
front-proxy-ca          Dec 07, 2030 02:21 UTC   9y              no

 

아래 명령을 통해서 config 파일들을 새로 생성한다. 

 

kubeadm init phase kubeconfig all

 

아래 메시지와  같이 나오면 갱신 성공이다. 

 

W0331 19:09:50.508040   13442 version.go:102] falling back to the local client version: v1.16.3
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/admin.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Using existing kubeconfig file: "/etc/kubernetes/scheduler.conf"

 

새로운 인증서 kubernetes에 적용! 

이제 새로운 인증값들을 kuberntes에서 사용하도록 해주면 된다. 

먼저 kubelet이 읽어오는 config 파일을 새로 생성한 admin.conf 파일로 교체!

cp /etc/kubernetes/admin.conf ~/.kube/config
systemctl restart kubelet

이렇게 한다음에 kubectl 명령어를 사용하면!

 

error: You must be logged in to the server (Unauthorized)

ㅎ... 현재 kube-system들의 pod들이 예전 인증 정보를 가지고 있기에 Unauthorized error가 발생한다. 

docker restart를 통해서 전부 재실행 해준다. (이때 pod들이 자동 재시작 설정안되어 있으면 일일히 다시 켜줘야한다...)

이젠 진짜로 kubectl 커맨드도 작동되고 pods 생성도 잘된다....

NAMESPACE             NAME                                                   READY   STATUS    RESTARTS   AGE
admin-20              admin-2d20                                             1/1     Running   0          41d
admin-30              admin-2d30                                             1/1     Running   0          41d
kube-system           coredns-6955765f44-l7l8s                               1/1     Running   22         337d
kube-system           coredns-6955765f44-ngb4s                               1/1     Running   22         337d
kube-system           etcd-master-node                                       1/1     Running   27         337d
kube-system           kube-apiserver-master-node                             1/1     Running   36         337d
kube-system           kube-controller-manager-master-node                    1/1     Running   167        337d
kube-system           kube-proxy-k4966                                       1/1     Running   18         140d
kube-system           kube-proxy-zdzzv                                       1/1     Running   6          140d
kube-system           kube-scheduler-master-node                             1/1     Running   150        337d
kube-system           metrics-server-7779997b4-zjf42                         1/1     Running   7          138d
kube-system           weave-net-fw5r6                                        2/2     Running   19         337d
kube-system           weave-net-wt54n                                        2/2     Running   60         337d

 

아무래도 처음부터 kubenretes cluster를 구성해보면 PKL인증서를 쓴다는 것을 바로 알 수 있는 문제 였고 명령어 한줄만 입력하면 발생하지 않을 문제였는데 Kubernets라는 수박을 할짝거리기만 해서 생긴 문제인것 같다.