Kubeadm을 사용한 인증서 관리

 

kubeadm을 통해 생성된 Client 인증서는 1년 후에 만료된다.

 

사용자 정의 인증서를 사용하려면 아래의 링크에 대한 내용을 확인 및 파악, 익숙하게 사용해야 가능하다.

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

 

PKI 인증서 및 요구 사항

쿠버네티스는 TLS를 통한 인증을 위해서 PKI 인증서가 필요하다. 만약 kubeadm으로 쿠버네티스를 설치한다면, 클러스터에 필요한 인증서는 자동으로 생성된다. 또한 더 안전하게 자신이 소유한 인

kubernetes.io

 

그렇지 않은경우는 사용자 정의 인증서 처리를 안 하는 것을 추천한다.

 

위의 내용에 대하여서 이해가 있다는것을 전제로 이후 내용에 대해서 설명하겠다. 

 

[사용자 정의 인증서 사용방법]

kubeadm init 을 수행할 때 --cert-dir 플래그를 통해 지정하거나 kubeadm의 ClusterConfiguration의 certificatesDir 필드에 지정된 디렉터리에 인증서를 저장해서 사용하면 된다. Default 값은 /etc/kubernetes/pki 다. 

 

그 외에 지정된 인증서 및 개인키 (Private Key) 가 존재한다면, kubeadm을 이를 덮어쓰기 처리를 하지 않는다. 

 

[외부 CA]

ca.key 파일이 아닌 ca.crt 파일만 제공이 가능하나, 이는 Root CA 파일에만 가능하다.  다른 모든 인증서 및 kubeconfig 파일이 있는 경우 kubeadm 이 이 조건을 인지하고 "외부 CA" 모드를 활성화한다. 

--controllers=csrsigner를 사용하여 controller-manager를 독립적으로 실행

 

[인증서 만료 확인방법]

check-expiration 명령어를 사용하여 인증서 만료시점이 확인이 가능하다. 

 

kubeadm certs check-expiration 

 

출력결과는 아래의 내용처럼 출력된다. 

 

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Dec 30, 2020 23:36 UTC   364d                                    no
apiserver                  Dec 30, 2020 23:36 UTC   364d            ca                      no
apiserver-etcd-client      Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Dec 30, 2020 23:36 UTC   364d            ca                      no
controller-manager.conf    Dec 30, 2020 23:36 UTC   364d                                    no
etcd-healthcheck-client    Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
etcd-peer                  Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
etcd-server                Dec 30, 2020 23:36 UTC   364d            etcd-ca                 no
front-proxy-client         Dec 30, 2020 23:36 UTC   364d            front-proxy-ca          no
scheduler.conf             Dec 30, 2020 23:36 UTC   364d                                    no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Dec 28, 2029 23:36 UTC   9y              no
etcd-ca                 Dec 28, 2029 23:36 UTC   9y              no
front-proxy-ca          Dec 28, 2029 23:36 UTC   9y              no

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

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

 

!! kubeadm 은 외부 CA 가 서명한 인증서를 관리할 수 없다. 보여만 준다. 

 

kubelet.conf 는 위 목록에 포함되어있지 않은데 이는 kubeadm 이 자동 인증서 갱신을 위해 각 Node에 존제하는 /var/lib/kubelet/pki 에 있는 갱신 가능한 인증서를 이용하여 kubelet을 구성하기 때문이다. 

 

!! kubeadm 1.17 이전의 버전에서 kubeadm init 으로 작성된 Node 에는 kubelet.conf 파일을 수동으로 수정해야 하는 버그가 있다. "https://github.com/kubernetes/kubeadm/issues/1753

 

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

 

 

Policy 는 설정이 가능하며, enable, disable 이 가능하다. Default 로 모든 strategies 는 enable 되어있다. 

 

[Policy 설정 예시]

 

Policy:

apiVersion: "descheduler/v1alpha1"
kind: "DeschedulerPolicy"
nodeSelector: prod=dev
evictFailedBarePods: false
evictLocalStoragePods: true
evictSystemCriticalPods: true
maxNoOfPodsToEvictPerNode: 40
ignorePvcPods: false
strategies:
  ...

 

[Policy parameters] 

Name Default
Value
Description
nodeSelector nil limiting the nodes which are processed
evictLocalStoragePods false allows eviction of pods with local storage
evictSystemCriticalPods false [Warning: Will evict Kubernetes system pods] allows eviction of pods with any priority, including system pods like kube-dns
ignorePvcPods false set whether PVC pods should be evicted or ignored
maxNoOfPodsToEvictPerNode nil maximum number of pods evicted from each node (summed through all strategies)
evictFailedBarePods false allow eviction of pods without owner references and in failed phase

 

 

+ Recent posts