kubernetes의 인증서란?
쿠버네티스는 여러 컴포넌트가 통신하면서 동작하는 분산 시스템이다.
이때, 서로를 신뢰하고 보안 연결을 하려면 인증서를 써야한다.
kubeadm init은 마스터용 인증서를 자동으로 만든다.
kubelet은 bootstrap 인증서를 사용해서 스스로 요청(CSR)을 보내서
정식 인증서(kubelet.crt)를 받고 이걸로 클러스터에 참여한다.
kubeadm init 명령을 실행하면, Kubernetes의 핵심 컴포넌트(API 서버, etcd 등)에 필요한 인증서들이 자동 생성된다/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용

/etc/kubernetes/pki/에 클러스터용 CA 인증서와 apiserver용 인증서가 생성되고,(bootstrap-kubelet.conf)도 함께 생성된다bootstrap-kubelet.conf를 사용해 API 서버에 접근하고, 자신의 인증서를 발급받기 위해 CSR(Certificate Signing Request)을 제출한다/var/lib/kubelet/pki/ 경로에 정식 인증서(kubelet.crt, kubelet.key)를 저장하고,

[ 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.conf | kubectl 명령어 에러 발생 (x509: certificate has expired) |
apiserver.crt | API 서버가 부팅 실패, 클러스터 전체 작동 불가 |
etcd/server.crt | etcd 간 통신 실패, 클러스터 데이터 저장/읽기 오류 |
kubelet.crt | 노드 상태 보고 불가 (NotReady), 파드 스케줄링 안 됨 |
기본적으로 발급되는 모든 인증서의 유효기간은 1년 (365일)이다. ca.crt만 10년(3650일)로 기본 설정되어 있다.
| 인증서 종류 | 유효기간 | 이유 |
|---|---|---|
| ca.crt (루트 CA) | 10년 | 이 인증서가 모든 다른 인증서를 서명하므로, 자주 바꾸면 전체 재발급이 필요해 오래 유지 |
| apiserver, etcd, admin.conf 등 | 1년 | 외부와 연결되거나 클러스터 내부에서 많이 쓰이므로 주기적으로 갱신이 안전 |
| kubelet.crt | 1년 (자동 갱신됨) | 워커 노드의 상태를 지속적으로 보장해야 하므로 자동 갱신 처리 |
| 분류 | 설명 | 예시 | 기본 유효기간 |
|---|---|---|---|
| 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년 |

| 통신 대상 | 흐름 예시 | 누가 어떤 인증서를 사용하나? |
|---|---|---|
| 👤 사용자 ↔ apiserver | kubectl get pods | admin.conf 안의 인증서로 사용자 인증 |
| kubelet ↔ apiserver | 워커 노드가 상태 보고 | kubelet은 kubelet.crt로 인증apiserver는 apiserver-kubelet-client.crt로 인증 |
| apiserver ↔ etcd | apiserver가 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년짜리로 갱신을 하려면 단순한 명령어로는 되지 않는다.
에러
