K8S 인증서 만료 문제, 이렇게 해결했어요

며칠 전, 갑자기 서버 몇 대가 이상하게 작동하기 시작했어요. 원인을 살펴보니 K8S 인증서가 만료되어 있었더라구요. 인증서가 만료되면 클러스터가 정상적으로 작동하지 않기 때문에 빠르게 조치가 필요했죠. 처음엔 살짝 당황했지만, 차근차근 해결해보니 생각보다 어렵지 않았어요. 혹시라도 저처럼 갑자기 인증서 문제를 겪게 되신 분들을 위해 제가 직접 처리한 과정을 공유해볼게요. 특히 명령어 하나하나 기록하면서 작업했으니, 따라만 하셔도 충분히 해결하실 수 있을 거예요.

그럼 바로 시작해볼게요!
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

1. 인증서 유효기간 확인하기

가장 먼저 해야 할 일은 인증서 유효기간을 확인하는 거였어요. kubeadm certs check-expiration 명령어를 사용하면 간단하게 확인할 수 있어요.
확인해보니 대부분의 인증서가 만료되었거나 만료 직전이더라고요. 아래 명령어로 확인했어요.

kubeadm certs check-expiration

확인 결과, kube-apiserver, controller-manager, scheduler 등 주요 컴포넌트의 인증서가 이미 만료되었거나 남은 유효기간이 얼마 안 남은 상태였어요. 이 상태로는 정상적인 운영이 어려워요.


2. 백업 후 인증서 재발급 준비

혹시 모를 상황을 대비해서 먼저 중요한 설정 파일을 백업해뒀어요. cp 명령어로 /etc/kubernetes 디렉토리 전체를 안전하게 복사해뒀죠.

cp -r /etc/kubernetes /etc/kubernetes.bak

그다음, 클러스터가 어떤 버전으로 구성되어 있는지 확인한 후, 해당 버전에 맞는 인증서 재발급을 시도했어요. 저 같은 경우는 kubeadm 1.15 버전이었는데, 이 버전은 조금 까다로운 점이 있어서 다음과 같은 명령어를 사용했어요.

kubeadm alpha certs renew all
kubeadm alpha certs renew all

이 명령어는 모든 기본 인증서를 자동으로 갱신해줘서 정말 편리했어요.


3. 인증서 재발급 후 상태 재확인

인증서가 제대로 갱신됐는지 다시 한번 확인해봤어요. 같은 명령어로 확인하면 갱신된 유효기간을 확인할 수 있어요.

kubeadm certs check-expiration

여기서 제대로 갱신되지 않은 인증서가 있다면 개별적으로 처리해주셔야 해요. 그리고 재발급이 완료되면 kubelet이나 kube-apiserver를 재시작하는 것도 잊지 마시고요.


4. 사용자 인증 토큰 재확인 및 설정

인증서를 갱신해도 여전히 kubectl 명령어가 안 먹히는 경우가 있어요. 저도 "You must be logged in"이라는 에러 메시지를 보고 살짝 멘붕 왔었는데요… 알고 보니 kubeconfig 파일이 갱신되지 않아서 생긴 문제였어요.

아래 명령어로 kubeconfig를 다시 설정해줬어요.

export KUBECONFIG=/etc/kubernetes/admin.conf

이 설정을 하고 나서야 kubectl get nodeskubectl get pods 같은 명령어가 정상적으로 작동하기 시작했어요. config 파일 경로가 꼬이면 엉뚱한 곳에서 인증서 찾느라 이런 에러가 날 수 있거든요.


5. 컨트롤러 매니저, 스케줄러 재시작

컨트롤러 매니저나 스케줄러가 여전히 동작하지 않는 문제가 있었어요. 알고 보니 인증서가 갱신되었어도 프로세스가 이전 인증서 정보를 물고 있어서였어요.

docker ps 명령어로 해당 프로세스를 확인하고, docker restart 명령어로 수동 재시작했어요.

docker ps | grep kube-controller-manager
docker restart <컨테이너 ID>

조금 귀찮긴 했지만, 필요한 컨테이너만 콕 집어서 재시작하면 문제는 대부분 해결되더라고요.


6. 클러스터 정상 작동 확인

모든 걸 마친 후, 클러스터 상태를 다시 확인해봤어요. kubectl get nodeskubectl get pods --all-namespaces로 확인하면 전체 노드와 파드 상태를 볼 수 있어요.

전부 READY 상태로 뜨는 걸 확인하고 나서야 비로소 마음이 놓이더라고요. 처음에는 복잡하게 느껴졌지만, 직접 해보니까 그렇게 어렵지 않았어요. 필요한 건 침착함과 꼼꼼한 확인이었어요.


Q1. 인증서가 만료되면 클러스터는 어떻게 되나요?

A. 인증서가 만료되면 kubectl 명령어 사용이 제한되고, 내부 컴포넌트 간 통신도 끊기게 됩니다. 즉, 클러스터 관리와 서비스 운영 자체가 중단될 수 있어요

Q2. kubeadm certs check-expiration 명령어는 어느 버전부터 가능한가요?

A. 해당 명령어는 kubeadm 1.15 이상 버전에서 지원됩니다. 더 낮은 버전에서는 수동으로 OpenSSL을 사용해야 하는 경우도 있어요.

Q3. 인증서 재발급 후 꼭 필요한 작업은 뭔가요?

A. kubeconfig 재설정, 관련 컨테이너 재시작(kube-apiserver, controller-manager, scheduler 등), 그리고 kubelet 서비스 재시작은 필수입니다.

Q4. 인증서 갱신 전에 백업을 꼭 해야 하나요?

A. 네, 강력히 추천드려요. /etc/kubernetes 디렉토리 전체를 복사해두면 문제가 생겼을 때 바로 복구할 수 있어요. 실수로 갱신에 실패해도 되돌릴 수 있는 생명줄 같은 거예요.

Q5. 컨테이너가 거절 에러를 낼 때는 어떻게 하나요?

A. 에러 메시지에 connection refused가 뜬다면, 대부분 포트 설정 문제거나 인증서 경로 문제일 가능성이 커요. 설정 파일(/etc/kubernetes/manifests)을 다시 한번 점검하고, 컨테이너를 재시작해보세요.


이번 인증서 문제, 솔직히 좀 당황스러웠어요. 평소에 자주 신경 쓰지 않던 부분인데, 막상 만료되고 나니까 이렇게 중요한 거였구나 싶더라고요. 다행히 백업도 잘 해놨고, 하나씩 차근차근 문제를 해결해 나가니까 클러스터도 금방 안정되었어요.

제가 드리고 싶은 팁은 이거예요 — 인증서 만료 시점을 미리미리 확인하고, 정기적으로 갱신 일정을 관리하는 습관을 들이자! 특히 kubeadm certs check-expiration 명령어는 진짜 유용하니까 꼭 한번 실행해보시고요.

혹시라도 오늘 글이 도움이 되셨다면, 여러분의 경험도 댓글로 공유해주시면 좋겠어요. 다음엔 “kubelet이 말 안 듣는 경우 디버깅하는 팁”으로 찾아올게요!