카테고리 없음

kubeadm을 사용한 인증서 관리

미니대왕님 2024. 8. 20. 09:51

kubeadm을 사용한 인증서 관리

 

kubeadm으로 생성된 클라이언트 인증서는 1년 후에 만료된다. 이 페이지는 kubeadm으로 인증서 갱신을 관리하는 방법을 설명하며, kubeadm 인증서 관리와 관련된 다른 작업에 대해서도 다룬다.

 

사용자 정의 인증서 사용

기본적으로, kubeadm은 클러스터를 실행하는 데 필요한 모든 인증서를 생성한다. 사용자는 자체 인증서를 제공하여
이 동작을 무시할 수 있다.

이렇게 하려면, --cert-dir 플래그 또는 kubeadm ClusterConfiguration  certificatesDir 필드에 지정된 디렉터리에 배치해야 한다. 기본적으로 /etc/kubernetes/pki 이다.

kubeadm init 을 실행하기 전에 지정된 인증서와 개인 키(private key) 쌍이 존재하면, kubeadm은 이를 덮어 쓰지 않는다. 이는 예를 들어, 기존 CA를 /etc/kubernetes/pki/ca.crt  /etc/kubernetes/pki/ca.key 에 복사할 수 있고, kubeadm은 이 CA를 사용하여 나머지 인증서에 서명한다는 걸 의미한다.

외부 CA 모드

ca.key 파일이 아닌 ca.crt 파일만 제공할 수도 있다(이는 다른 인증서 쌍이 아닌 루트 CA 파일에만 사용 가능함). 다른 모든 인증서와 kubeconfig 파일이 있으면, kubeadm은 이 조건을 인식하고 "외부 CA" 모드를 활성화한다. kubeadm은 디스크에 CA 키없이 진행한다.

대신, --controllers=csrsigner 사용하여 controller-manager를 독립적으로 실행하고 CA 인증서와 키를 가리킨다.

PKI 인증서와 요구 조건은 외부 CA를 사용하도록 클러스터 설정에 대한 지침을 포함한다.

 

인증서 만료 확인

check-expiration 하위 명령을 사용하여 인증서가 만료되는 시기를 확인할 수 있다.

kubeadm certs check-expiration

출력 결과는 다음과 비슷하다.

만료일이 25. Jun , 21 ->  25년 Agu. 19 [로컬 테스트]

[root@m-k8s vagrant]# 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 21, 2025 02:14 UTC   305d            ca                      no      
apiserver                  Jun 21, 2025 02:14 UTC   305d            ca                      no      
apiserver-etcd-client      Jun 21, 2025 02:14 UTC   305d            etcd-ca                 no      
apiserver-kubelet-client   Jun 21, 2025 02:14 UTC   305d            ca                      no      
controller-manager.conf    Jun 21, 2025 02:14 UTC   305d            ca                      no      
etcd-healthcheck-client    Jun 21, 2025 02:14 UTC   305d            etcd-ca                 no      
etcd-peer                  Jun 21, 2025 02:14 UTC   305d            etcd-ca                 no      
etcd-server                Jun 21, 2025 02:14 UTC   305d            etcd-ca                 no      
front-proxy-client         Jun 21, 2025 02:14 UTC   305d            front-proxy-ca          no      
scheduler.conf             Jun 21, 2025 02:14 UTC   305d            ca                      no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Jun 19, 2034 02:14 UTC   9y              no      
etcd-ca                 Jun 19, 2034 02:14 UTC   9y              no      
front-proxy-ca          Jun 19, 2034 02:14 UTC   9y              no      
[root@m-k8s vagrant]#

 

[이슈사항]~~

이 명령은 /etc/kubernetes/pki 폴더의 클라이언트 인증서와 kubeadm이 사용하는 KUBECONFIG 파일(admin.conf, controller-manager.conf  scheduler.conf)에 포함된 클라이언트 인증서의 만료/잔여 기간을 표시한다.

또한, kubeadm은 인증서가 외부에서 관리되는지를 사용자에게 알린다. 이 경우 사용자는 수동으로 또는 다른 도구를 사용해서 인증서 갱신 관리를 해야 한다.

[root@m-k8s vagrant]# ll  /etc/kubernetes/pki
total 56
-rw-r--r--. 1 root root 1281 Jun 21 11:14 apiserver.crt
-rw-r--r--. 1 root root 1155 Jun 21 11:14 apiserver-etcd-client.crt
-rw-------. 1 root root 1675 Jun 21 11:14 apiserver-etcd-client.key
-rw-------. 1 root root 1675 Jun 21 11:14 apiserver.key
-rw-r--r--. 1 root root 1164 Jun 21 11:14 apiserver-kubelet-client.crt
-rw-------. 1 root root 1675 Jun 21 11:14 apiserver-kubelet-client.key
-rw-r--r--. 1 root root 1099 Jun 21 11:14 ca.crt
-rw-------. 1 root root 1679 Jun 21 11:14 ca.key
drwxr-xr-x. 2 root root  162 Jun 21 11:14 etcd
-rw-r--r--. 1 root root 1115 Jun 21 11:14 front-proxy-ca.crt
-rw-------. 1 root root 1675 Jun 21 11:14 front-proxy-ca.key
-rw-r--r--. 1 root root 1119 Jun 21 11:14 front-proxy-client.crt
-rw-------. 1 root root 1679 Jun 21 11:14 front-proxy-client.key
-rw-------. 1 root root 1675 Jun 21 11:14 sa.key
-rw-------. 1 root root  451 Jun 21 11:14 sa.pub

경고:

kubeadm 은 외부 CA가 서명한 인증서를 관리할 수 없다.
kubelet.conf 는 위 목록에 포함되어 있지 않은데, 이는 kubeadm이 자동 인증서 갱신을 위해 /var/lib/kubelet/pki에 있는 갱신 가능한 인증서를 이용하여 kubelet을 구성하기 때문이다. 만료된 kubelet 클라이언트 인증서를 갱신하려면 kubelet 클라이언트 갱신 실패 섹션을 확인한다.

경고:

kubeadm 1.17 이전의 버전에서 kubeadm init 으로 작성된 노드에는 kubelet.conf 의 내용을 수동으로 수정해야 하는 버그가 있다. kubeadm init 수행 완료 후, client-certificate-data  client-key-data 를 다음과 같이 교체하여, 로테이트된 kubelet 클라이언트 인증서를 가리키도록 kubelet.conf 를 업데이트해야 한다.

client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

자동 인증서 갱신

kubeadm은 컨트롤 플레인 업그레이드 동안 모든 인증서를 갱신한다.

이 기능은 가장 간단한 유스케이스를 해결하기 위해 설계되었다. 인증서 갱신에 대해 특별한 요구 사항이 없고 쿠버네티스 버전 업그레이드를 정기적으로(매 1년 이내 업그레이드 수행) 수행하는 경우, kubeadm은 클러스터를 최신 상태로 유지하고 합리적으로 보안을 유지한다.

참고:

보안을 유지하려면 클러스터를 자주 업그레이드하는 것이 가장 좋다.

인증서 갱신에 대해 보다 복잡한 요구 사항이 있는 경우, --certificate-renewal=false  kubeadm upgrade apply 또는 kubeadm upgrade node 와 함께 사용하여 기본 동작이 수행되지 않도록 할 수 있다.

경고:

kubeadm 1.17 이전 버전에는 kubeadm upgrade node 명령에서 --certificate-renewal 의 기본값이 false  버그가 있다. 이 경우 --certificate-renewal=true 를 명시적으로 설정해야 한다.
[root@m-k8s vagrant]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", 
GitC                             ommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f",
GitTreeState:"clean", BuildDat                             e:"2023-09-13T09:34:32Z",
GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/a                             md64"}
[root@m-k8s vagrant]#

수동 인증서 갱신

kubeadm certs renew 명령을 사용하여 언제든지 인증서를 수동으로 갱신할 수 있다.

이 명령은 /etc/kubernetes/pki 에 저장된 CA(또는 프론트 프록시 CA) 인증서와 키를 사용하여 갱신을 수행한다.

명령을 실행한 후에는 컨트롤 플레인 파드를 재시작해야 한다. 이는 현재 일부 구성 요소 및 인증서에 대해 인증서를 동적으로 다시 로드하는 것이 지원되지 않기 때문이다. 스태틱(static) 파드는 API 서버가 아닌 로컬 kubelet에서 관리되므로 kubectl을 사용하여 삭제 및 재시작할 수 없다. 스태틱 파드를 다시 시작하려면 /etc/kubernetes/manifests/에서 매니페스트 파일을 일시적으로 제거하고 20초를 기다리면 된다 (KubeletConfiguration struct fileCheckFrequency 값을 참고한다). 파드가 매니페스트 디렉터리에 더 이상 없는 경우 kubelet은 파드를 종료한다. 그런 다음 파일을 다시 이동할 수 있으며 또 다른 fileCheckFrequency 기간이 지나면, kubelet은 파드를 생성하고 구성 요소에 대한 인증서 갱신을 완료할 수 있다.