소개
Kubernetes 클러스터를 운영하면서 인증서(SSL/TLS) 만료 관리는 매우 중요합니다. 인증서가 만료되면 API 서버, etcd, kubelet 등 주요 컴포넌트의 통신이 끊겨 서비스 장애로 이어질 수 있습니다. 이 글은 실제 운영환경에서 자주 사용하고 있는 kubeadm, RKE2, k3s, RKE, kubelet 등 주요 배포 방식별로 인증서 위치와 만료일(남은기간)을 확인하는 방법을 정리한 가이드입니다.
※ 모든 명령은 각 노드에서 실행해야 합니다. root 권한을 전제로 진행합니다.
핵심 요약
- kubeadm:
/etc/kubernetes/pki에 인증서가 위치.kubeadm certs check-expiration으로 한 번에 확인 가능. - RKE2:
/var/lib/rancher/rke2/server/tls에 인증서가 위치. - k3s:
/var/lib/rancher/k3s/server/tls에 인증서가 위치. - RKE: 배포 시 지정된 경로(예:
/opt/rke/etc/kubernetes/ssl또는/etc/kubernetes/ssl)에 위치. - kubelet: 노드별로
/var/lib/kubelet/pki등에서 인증서 확인.
※ 인증서의 위치는 환경에 따라 다를 수 있으므로 참고하시길 바랍니다.
공통 검사 방법으로 openssl을 이용해 PEM 파일의 만료일을 확인하거나, openssl -checkend로 특정 기간(예: 30일) 이내 만료 여부를 바로 확인할 수 있습니다.
공통: PEM 파일 직접 검사 방법 (openssl)
만료일만 출력
openssl x509 -noout -in /path/to/cert.crt -enddate전체 날짜 정보
openssl x509 -noout -in /path/to/cert.crt -dates남은 일수 계산 (예시)
enddate=$(openssl x509 -in /path/to/cert.crt -noout -enddate | cut -d= -f2)
endsecs=$(date -d "$enddate" +%s)
now=$(date +%s)
echo $(( (endsecs - now) / 86400 )) days left특정 기간(예: 30일) 이내 만료 여부 확인
# 30일 = 60*60*24*30 = 2592000
openssl x509 -checkend 2592000 -noout -in /path/to/cert.crt && echo "OK (>=30d)" || echo "Will expire within 30 days"배포별 상세 위치 및 확인 방법
1) kubeadm
- 기본 인증서 경로:
/etc/kubernetes/pki - 권장 명령:
kubeadm certs check-expiration- 개별 파일 확인:
openssl x509 -noout -in /etc/kubernetes/pki/apiserver.crt -enddate
openssl x509 -noout -in /etc/kubernetes/pki/etcd/peer.crt -enddate
# kubelet 관련 파일(노드에서): /var/lib/kubelet/pki/*.crtkubeadm certs check-expiration은 kubeadm이 관리하는 로컬 PKI만 검사합니다. 외부 CA 또는 다른 경로에 추가되어 있는 인증서는 포함되지 않을 수 있습니다.
2) RKE2
- 대표 경로:
/var/lib/rancher/rke2/server/tls - 확인 예시:
※ 아래는 최신버전부터 사용가능 (자세한 정보는 아래의 링크에서 확인)
-> https://docs.rke2.io/security/certificates
rke2 certificate check --output table
FILENAME SUBJECT USAGES EXPIRES RESIDUAL TIME STATUS
-------- ------- ------ ------- ------------- ------
client-kube-proxy.crt system:kube-proxy ClientAuth Jun 12, 2026 11:12 UTC 1 year OK
client-kube-proxy.crt rke2-client-ca@1749726675 CertSign Jun 10, 2035 11:11 UTC 10 years OK
client-kubelet.crt system:node:ip-10-11-0-14 ClientAuth Jun 12, 2026 11:12 UTC 1 year OK
client-kubelet.crt rke2-client-ca@1749726675 CertSign Jun 10, 2035 11:11 UTC 10 years OK
serving-kubelet.crt ip-10-11-0-14 ServerAuth Jun 12, 2026 11:12 UTC 1 year OK
serving-kubelet.crt rke2-server-ca@1749726675 CertSign Jun 10, 2035 11:11 UTC 10 years OK
client-rke2-controller.crt system:rke2-controller ClientAuth Jun 12, 2026 11:12 UTC 1 year OK
client-rke2-controller.crt rke2-client-ca@1749726675 CertSign Jun 10, 2035 11:11 UTC 10 years OKls -l /var/lib/rancher/rke2/server/tls
for f in /var/lib/rancher/rke2/server/tls/*.crt; do
echo "== $f =="
openssl x509 -noout -in "$f" -subject -issuer -enddate
done해당 경로와 다를 수 있으므로, 다르다면 환경에 맞게 확인 및 수정 후 진행
3) k3s
- 대표 경로:
/var/lib/rancher/k3s/server/tls - 확인 예시:
※ 아래는 최신버전부터 사용가능 (자세한 정보는 아래의 링크에서 확인)
-> https://docs.k3s.io/cli/certificate
k3s certificate check --output table
FILENAME SUBJECT USAGES EXPIRES RESIDUAL TIME STATUS
-------- ------- ------ ------- ------------- ------
client-kube-proxy.crt system:kube-proxy ClientAuth Jun 09, 2026 10:17 UTC 1 year OK
client-kube-proxy.crt k3s-client-ca@1749464211 CertSign Jun 07, 2035 10:16 UTC 10 years OK
client-kubelet.crt system:node:ip-10-11-0-14 ClientAuth Jun 09, 2026 10:17 UTC 1 year OK
client-kubelet.crt k3s-client-ca@1749464211 CertSign Jun 07, 2035 10:16 UTC 10 years OK
serving-kubelet.crt ip-10-11-0-14 ServerAuth Jun 09, 2026 10:17 UTC 1 year OK
serving-kubelet.crt k3s-server-ca@1749464211 CertSign Jun 07, 2035 10:16 UTC 10 years OK
client-k3s-controller.crt system:k3s-controller ClientAuth Jun 09, 2026 10:17 UTC 1 year OK
client-k3s-controller.crt k3s-client-ca@1749464211 CertSign Jun 07, 2035 10:16 UTC 10 years OKls -l /var/lib/rancher/k3s/server/tls
openssl x509 -noout -in /var/lib/rancher/k3s/server/tls/server-ca.crt -enddate해당 경로와 다를 수 있으므로, 다르다면 환경에 맞게 확인 및 수정 후 진행
4) RKE (Rancher RKE v1)
- 대표 경로:
/opt/rke/etc/kubernetes/ssl또는/etc/kubernetes/ssl(설치 시 지정됨) - 확인 예시:
for f in /opt/rke/etc/kubernetes/ssl/*.pem /opt/rke/etc/kubernetes/ssl/*.crt; do
[ -f "$f" ] || continue
openssl x509 -noout -in "$f" -enddate || true
done5) kubelet
- 대표 경로:
/var/lib/kubelet/pki(구성에 따라 다름) - 확인 예시:
ls -l /var/lib/kubelet/pki
openssl x509 -noout -in /var/lib/kubelet/pki/kubelet.crt -enddatekubelet 인증서는 kubeadm의 자동 갱신 대상과 일부 다를 수 있으므로 노드별 확인이 필요합니다. ps aux | grep kubelet로 --cert-dir 옵션 확인 권장.
운영 Tip: 폴더 전체를 한 번에 검사하는 스크립트
아래 스크립트는 지정한 디렉터리(기본 /etc/kubernetes/pki) 내의 .crt/.pem 파일을 찾아서 만료일·발행자·남은일수를 출력합니다.
#!/bin/bash
# check-certs.sh
dir=${1:-/etc/kubernetes/pki}
echo "file,subject,issuer,enddate,days_left"
find "$dir" -type f \( -name '*.crt' -o -name '*.pem' \) | while read -r f; do
if openssl x509 -in "$f" -noout >/dev/null 2>&1; then
enddate=$(openssl x509 -in "$f" -noout -enddate | cut -d= -f2)
endsecs=$(date -d "$enddate" +%s)
now=$(date +%s)
days=$(( (endsecs - now) / 86400 ))
subject=$(openssl x509 -in "$f" -noout -subject | sed 's/subject= //')
issuer=$(openssl x509 -in "$f" -noout -issuer | sed 's/issuer= //')
echo "\"$f\","\"$subject\","\"$issuer\","\"$enddate\",$days"
fi
done
./check-certs.sh
file,subject,issuer,enddate,days_left
"/etc/kubernetes/pki/apiserver.crt","CN=kube-apiserver","CN=kube-ca","Wed Oct 25 15:00:00 2025",10
"/etc/kubernetes/pki/etcd/server.crt","CN=etcd-server","CN=etcd-ca","Fri Nov 14 15:00:00 2025",30
"/etc/kubernetes/pki/front-proxy-client.crt","CN=front-proxy-client","CN=front-proxy-ca","Sun Dec 14 15:00:00 2025",60예시 출력화면입니다.
간단 체크(30일 임박 여부)
for f in /etc/kubernetes/pki/*.crt /var/lib/rancher/*/server/tls/*.crt; do
[ -f "$f" ] || continue
openssl x509 -checkend $((60*60*24*30)) -noout -in "$f" && echo "$f: OK" || echo "$f: WILL EXPIRE WITHIN 30 DAYS"
done자동화 & 모니터링 Tip
- Crontab + Slack/메일 알림: 위 스크립트를 주기적으로 실행해 특정 디렉토리 저장 혹은 결과를 메일/슬랙으로 전송
- Prometheus Exporter: 인증서를 파싱해
cert_expiry_seconds{cert="apiserver.crt"}같은 메트릭으로 노출하면 Alertmanager로 알림 설정 가능 - kubeadm 사용자:
kubeadm certs check-expiration을 정기 스케줄로 등록 - RKE2/k3s 사용자:
/var/lib/rancher/.../tls파일 생성/갱신 이벤트를 모니터링
주의사항
kubeadm certs check-expiration은 kubeadm이 관리하는 로컬 PKI만 검사합니다. 외부 CA로 발급되었거나, 클라우드/외부에 존재하는 인증서는 포함되지 않을 수 있습니다.- managed 서비스 같은 경우는 인증서 관리를 플랫폼에서 자동화하므로 문서 확인 필요
참고자료
- kubeadm: https://kubernetes.io/ko/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
- RKE2: https://docs.rke2.io/security/certificates
- k3s: https://docs.k3s.io/cli/certificate
- openssl: https://docs.openssl.org/3.2/man1/openssl-x509
정리
Kubernetes 클러스터를 운영하다보면, 자체 인증서를 주기적으로 갱신하게 됩니다. 갱신해야되는 시기를 놓치고 지나갈 경우 시스템 장애로 이어질 수 있기때문에, 인증서의 남은 기간은 주기적으로 체크하는 것이 좋습니다.
'Kubernetes' 카테고리의 다른 글
| Pod의 OOMKilled 문제 원인 분석 및 해결 방법 (0) | 2025.03.03 |
|---|---|
| Node가 Not Ready 상태일 때의 원인과 해결 방법 (0) | 2025.03.03 |
| Pod가 Pending 상태일 때의 원인과 해결 방법 (0) | 2025.03.02 |
| CrashLoopBackOff 원인 분석 및 해결 방법 (0) | 2025.03.01 |
| kubectl은 어떻게 동작하나요? (0) | 2025.02.28 |










