[k8s]쿠버네티스 인증서 만료, 갱신 & 스크립트 정리

Nam_JU·2025년 5월 11일
0

k8s

목록 보기
10/14

kubernetes의 인증서란?

쿠버네티스는 여러 컴포넌트가 통신하면서 동작하는 분산 시스템이다.
이때, 서로를 신뢰하고 보안 연결을 하려면 인증서를 써야한다.


인증서는 어디에, 어떻게 만들어질까?

kubeadm init은 마스터용 인증서를 자동으로 만든다.
kubelet은 bootstrap 인증서를 사용해서 스스로 요청(CSR)을 보내서
정식 인증서(kubelet.crt)를 받고 이걸로 클러스터에 참여한다.

kubeadm의 Kubernetes 마스터 인증서 자동 생성

  1. kubeadm init 명령을 실행하면, Kubernetes의 핵심 컴포넌트(API 서버, etcd 등)에 필요한 인증서들이 자동 생성된다
  2. /etc/kubernetes/pki/ 경로에 저장
/etc/kubernetes/pki/
├── ca.crt / ca.key                      # 클러스터의 루트 인증서
├── apiserver.crt / apiserver.key        # API 서버 HTTPS 인증
├── apiserver-kubelet-client.crt         # kubelet 접근용 인증서
├── etcd/*.crt                           # etcd 보안 통신용 인증서
├── front-proxy-*.crt                    # Aggregation Layer용

kubelet 인증서 생성 과정

  1. kubeadm init 명령을 실행하면,/etc/kubernetes/pki/에 클러스터용 CA 인증서와 apiserver용 인증서가 생성되고,
    kubelet이 초기에 사용할 임시 인증 정보(bootstrap-kubelet.conf)도 함께 생성된다
  2. kubelet은 부팅 시 bootstrap-kubelet.conf를 사용해 API 서버에 접근하고, 자신의 인증서를 발급받기 위해 CSR(Certificate Signing Request)을 제출한다
  3. 쿠버네티스 컨트롤러가 CSR을 자동으로 승인하면,
    kubelet은 /var/lib/kubelet/pki/ 경로에 정식 인증서(kubelet.crt, kubelet.key)를 저장하고,
    이후에는 kubelet.conf를 사용하여 정식 구성원으로서 API 서버와 통신한다.
  • k8s와 kubelet에 pki 폴더가 자동으로 생성된것을 볼 수 있다.
[ kubeadm init 실행 ]
        │
        ├── /etc/kubernetes/pki/ 인증서 생성 (API 서버, etcd 등)
        └── bootstrap-kubelet.conf 생성 (kubelet 초기용)
               │
               ▼
[ kubelet 시작 ]
        │
        ├── bootstrap-kubelet.conf 사용해 API 서버에 접속
        └── CSR 요청 제출 → 자동 승인됨
               │
               ▼
[ 인증서 발급 완료 ]
        ├── /var/lib/kubelet/pki/kubelet.crt 저장
        └── kubelet.conf 로 전환하여 정식 통신 시작

인증서 갱신이 필요한 이유

kubernetes의 인증서 기간을 확인해보면 크게 두가지 섹터로 기간이 다른것을 확인할 수 있다. kubeadm certs check-expiration 명령어

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                 Oct 25, 2024 02:01 UTC   202d            ca                      no
apiserver                 Oct 25, 2024 02:01 UTC   202d            ca                      no
apiserver-etcd-client     Oct 25, 2024 02:01 UTC   202d            etcd-ca                 no
apiserver-kubelet-client  Oct 25, 2024 02:01 UTC   202d            ca                      no
controller-manager.conf   Oct 25, 2024 02:01 UTC   202d            ca                      no
etcd-healthcheck-client   Oct 25, 2024 02:01 UTC   202d            etcd-ca                 no
etcd-peer                 Oct 25, 2024 02:01 UTC   202d            etcd-ca                 no
etcd-server               Oct 25, 2024 02:01 UTC   202d            etcd-ca                 no
front-proxy-client        Oct 25, 2024 02:01 UTC   202d            front-proxy-ca          no
scheduler.conf            Oct 25, 2024 02:01 UTC   202d            ca                      no
super-admin.conf          Oct 25, 2024 02:01 UTC   202d            ca                      no

CERTIFICATE AUTHORITY     EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                        Mar 30, 2035 01:32 UTC   9y              no
etcd-ca                   Mar 30, 2035 01:32 UTC   9y              no
front-proxy-ca            Mar 30, 2035 01:32 UTC   9y              no

인증서는 컴포넌트 간에 보안 통신(TLS)을 위해 필요하다.
만료되면 신뢰할 수 없는 인증서가 되기 때문에, 연결이 끊기게 된다.

  • 인증서 만료 시 생기는 증상 예시

    만료된 인증서증상
    admin.confkubectl 명령어 에러 발생 (x509: certificate has expired)
    apiserver.crtAPI 서버가 부팅 실패, 클러스터 전체 작동 불가
    etcd/server.crtetcd 간 통신 실패, 클러스터 데이터 저장/읽기 오류
    kubelet.crt노드 상태 보고 불가 (NotReady), 파드 스케줄링 안 됨

인증서 기간이 차이나는 이유

기본적으로 발급되는 모든 인증서의 유효기간은 1년 (365일)이다. ca.crt만 10년(3650일)로 기본 설정되어 있다.

인증서 종류유효기간이유
ca.crt (루트 CA)10년이 인증서가 모든 다른 인증서를 서명하므로, 자주 바꾸면 전체 재발급이 필요해 오래 유지
apiserver, etcd, admin.conf 등1년외부와 연결되거나 클러스터 내부에서 많이 쓰이므로 주기적으로 갱신이 안전
kubelet.crt1년 (자동 갱신됨)워커 노드의 상태를 지속적으로 보장해야 하므로 자동 갱신 처리
  • 인증서의 분류
분류설명예시기본 유효기간
1. 루트 인증서 (Root CA Certificates)다른 인증서를 서명해주는 최상위 인증서ca.crt, etcd-ca.crt, front-proxy-ca.crt보통 10년
2. 클러스터 인증서 (Component/Leaf Certificates)실제 각 컴포넌트가 사용하는 인증서apiserver.crt, admin.conf, kubelet.crt, etcd/server.crt보통 1년

인증서 사용 흐름

통신 대상흐름 예시누가 어떤 인증서를 사용하나?
👤 사용자 ↔ apiserverkubectl get podsadmin.conf 안의 인증서로 사용자 인증
kubelet ↔ apiserver워커 노드가 상태 보고kubelet은 kubelet.crt로 인증apiserver는 apiserver-kubelet-client.crt로 인증
apiserver ↔ etcdapiserver가 etcd에 데이터 요청apiserver는 apiserver-etcd-client.crt 사용etcd는 etcd/server.crt로 응답
controller-manager ↔ apiserver새 파드 생성 명령controller-manager.conf의 인증서로 인증
scheduler ↔ apiserver어디에 파드를 배치할지 결정scheduler.conf의 인증서로 인증

인증서 갱신 방법

sudo kubeadm certs renew all

위의 명령어는 전체 클러스터 인증서 자동 갱신 명령어다. 문제는 1년만 추가로 갱신이 된다. 즉 10년짜리로 갱신을 하려면 단순한 명령어로는 되지 않는다.

스크립트

에러

profile
개발기록

0개의 댓글