Minikube 인증서 만료 예방과 모니터링




앞선 글에서 인증서 만료 후 복구가 얼마나 번거로운지 확인했습니다. 최선의 전략은 만료되기 전에 미리 대응하는 것입니다.

이 글에서는 인증서 만료일을 확인하고, 자동으로 모니터링하며, 사전에 갱신하는 방법을 알아보겠습니다.

인증서 만료일 확인 방법

방법 1: minikube SSH로 직접 확인

가장 정확한 방법입니다. Minikube 내부의 인증서 파일을 직접 확인합니다.

# minikube SSH 접속
minikube ssh

# API Server 인증서 만료일 확인
openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -dates

출력 예시:

notBefore=Jan  1 00:00:00 2024 GMT
notAfter=Jan  1 00:00:00 2025 GMT

notAfter 날짜가 만료일입니다.

주요 인증서 파일 위치

# minikube SSH 접속 상태에서
ls -la /var/lib/minikube/certs/
파일명용도
apiserver.crtAPI Server 인증서
apiserver-kubelet-client.crtAPI Server → Kubelet 통신
front-proxy-client.crt프록시 클라이언트
etcd/server.crtetcd 서버 인증서

모든 인증서 만료일 한 번에 확인

# minikube SSH 접속 상태에서
for cert in /var/lib/minikube/certs/*.crt; do
  echo "=== $cert ==="
  openssl x509 -in "$cert" -noout -enddate 2>/dev/null || echo "읽기 불가"
done

방법 2: kubectl로 간접 확인

kubectl이 동작하는 상태라면 API 서버 상태를 확인할 수 있습니다.

# API 서버 상태 및 인증서 정보 확인 (verbose 모드)
kubectl get --raw /healthz -v=6 2>&1 | head -20

하지만 이 방법으로는 정확한 만료일을 알기 어려우므로, SSH 접속 방법을 권장합니다.

인증서 갱신 방법

주기적 stop/start

Minikube는 시작할 때 인증서 상태를 확인하고, 필요하면 갱신을 시도합니다.

# 클러스터 중지
minikube stop

# 클러스터 시작 (인증서 체크/갱신)
minikube start

권장 주기: 월 1회 또는 분기 1회

만료 30일 전에 한 번 수행해두면 대부분의 문제를 예방할 수 있습니다.

인증서 상태 확인 후 조건부 재시작

#!/bin/bash
# minikube-cert-check.sh

# 인증서 만료일 확인
EXPIRE_DATE=$(minikube ssh "openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -enddate 2>/dev/null" | cut -d= -f2)

if [ -z "$EXPIRE_DATE" ]; then
  echo "인증서 확인 실패"
  exit 1
fi

# 만료일을 epoch로 변환
EXPIRE_EPOCH=$(date -d "$EXPIRE_DATE" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)

# 남은 일수 계산
DAYS_LEFT=$(( ($EXPIRE_EPOCH - $NOW_EPOCH) / 86400 ))

echo "인증서 만료까지 ${DAYS_LEFT}일 남음"

# 30일 이내면 재시작
if [ $DAYS_LEFT -lt 30 ]; then
  echo "인증서 갱신을 위해 minikube 재시작..."
  minikube stop
  minikube start
  echo "재시작 완료"
fi

자동 백업 크론잡 설정

인증서 만료와 관계없이 정기적인 백업은 필수입니다.

백업 스크립트 작성

#!/bin/bash
# /home/user/scripts/minikube-backup.sh

DATE=$(date +%Y%m%d)
BACKUP_DIR=~/minikube-backup/$DATE
NAMESPACE="default"

# 디렉토리 생성
mkdir -p $BACKUP_DIR

# kubectl 동작 확인
if ! kubectl cluster-info &>/dev/null; then
  echo "[$DATE] kubectl 동작 불가 - 백업 실패" >> ~/minikube-backup/backup.log
  exit 1
fi

# DB 백업 (PostgreSQL 예시)
DB_POD=$(kubectl get pods -n $NAMESPACE -l app=postgres -o jsonpath='{.items[0].metadata.name}' 2>/dev/null)
if [ -n "$DB_POD" ]; then
  kubectl exec $DB_POD -n $NAMESPACE -- pg_dumpall -U postgres > $BACKUP_DIR/db.sql 2>/dev/null
fi

# Secret/ConfigMap 백업
kubectl get secrets -n $NAMESPACE -o yaml > $BACKUP_DIR/secrets.yaml 2>/dev/null
kubectl get configmaps -n $NAMESPACE -o yaml > $BACKUP_DIR/configmaps.yaml 2>/dev/null

# 전체 리소스 백업
kubectl get all,pvc,ingress -n $NAMESPACE -o yaml > $BACKUP_DIR/resources.yaml 2>/dev/null

# 오래된 백업 정리 (30일 이상)
find ~/minikube-backup -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \; 2>/dev/null

echo "[$DATE] 백업 완료: $BACKUP_DIR" >> ~/minikube-backup/backup.log

크론잡 등록

# 스크립트 실행 권한 부여
chmod +x /home/user/scripts/minikube-backup.sh

# 크론탭 편집
crontab -e

크론탭에 추가:

# 매일 새벽 2시에 백업 실행
0 2 * * * /home/user/scripts/minikube-backup.sh

# 또는 매주 일요일 새벽 3시에 실행
0 3 * * 0 /home/user/scripts/minikube-backup.sh

만료일 알림 자동화

인증서 만료가 임박하면 알림을 받도록 설정합니다.

기본 알림 스크립트

#!/bin/bash
# /home/user/scripts/minikube-cert-alert.sh

# 인증서 만료일 확인
EXPIRE_DATE=$(minikube ssh "openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -enddate 2>/dev/null" | cut -d= -f2)

if [ -z "$EXPIRE_DATE" ]; then
  echo "인증서 확인 실패 - minikube 상태 확인 필요"
  exit 1
fi

# 만료일 계산
EXPIRE_EPOCH=$(date -d "$EXPIRE_DATE" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRE_EPOCH - $NOW_EPOCH) / 86400 ))

# 30일 이내면 경고
if [ $DAYS_LEFT -lt 30 ]; then
  echo "⚠️ Minikube 인증서 만료 ${DAYS_LEFT}일 전!"
  echo "만료일: $EXPIRE_DATE"
  echo "조치: minikube stop && minikube start 실행 권장"
fi

# 7일 이내면 긴급 경고
if [ $DAYS_LEFT -lt 7 ]; then
  echo "🚨 긴급! 인증서 만료 ${DAYS_LEFT}일 전!"
fi

Slack 알림 연동

Slack Webhook을 사용하면 팀 채널로 알림을 보낼 수 있습니다.

#!/bin/bash
# /home/user/scripts/minikube-cert-alert-slack.sh

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"

# 인증서 만료일 확인
EXPIRE_DATE=$(minikube ssh "openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -enddate 2>/dev/null" | cut -d= -f2)

if [ -z "$EXPIRE_DATE" ]; then
  exit 1
fi

EXPIRE_EPOCH=$(date -d "$EXPIRE_DATE" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRE_EPOCH - $NOW_EPOCH) / 86400 ))

# 30일 이내면 Slack 알림
if [ $DAYS_LEFT -lt 30 ]; then
  curl -X POST -H 'Content-type: application/json' \
    --data "{\"text\":\"⚠️ Minikube 인증서 만료 ${DAYS_LEFT}일 전입니다. 갱신이 필요합니다.\"}" \
    $SLACK_WEBHOOK_URL
fi

Telegram 알림 연동

Telegram Bot을 통해 알림을 받을 수도 있습니다.

#!/bin/bash
# /home/user/scripts/minikube-cert-alert-telegram.sh

TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID"

# 인증서 만료일 확인
EXPIRE_DATE=$(minikube ssh "openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -enddate 2>/dev/null" | cut -d= -f2)

if [ -z "$EXPIRE_DATE" ]; then
  exit 1
fi

EXPIRE_EPOCH=$(date -d "$EXPIRE_DATE" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRE_EPOCH - $NOW_EPOCH) / 86400 ))

# 30일 이내면 Telegram 알림
if [ $DAYS_LEFT -lt 30 ]; then
  MESSAGE="⚠️ Minikube 인증서 만료 ${DAYS_LEFT}일 전
만료일: ${EXPIRE_DATE}
조치: minikube stop && minikube start"

  curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
    -d chat_id="${TELEGRAM_CHAT_ID}" \
    -d text="${MESSAGE}"
fi

크론잡으로 알림 스케줄링

# 크론탭에 추가
crontab -e

# 매일 오전 9시에 인증서 상태 확인
0 9 * * * /home/user/scripts/minikube-cert-alert-slack.sh

통합 모니터링 스크립트

백업과 알림을 하나의 스크립트로 통합할 수 있습니다.

#!/bin/bash
# /home/user/scripts/minikube-monitor.sh

DATE=$(date +%Y%m%d)
LOG_FILE=~/minikube-backup/monitor.log

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}

# 1. Minikube 상태 확인
if ! minikube status &>/dev/null; then
  log "ERROR: minikube가 실행 중이 아님"
  exit 1
fi

# 2. 인증서 만료일 확인
EXPIRE_DATE=$(minikube ssh "openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -enddate 2>/dev/null" | cut -d= -f2)
EXPIRE_EPOCH=$(date -d "$EXPIRE_DATE" +%s 2>/dev/null)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRE_EPOCH - $NOW_EPOCH) / 86400 ))

log "인증서 만료까지 ${DAYS_LEFT}일"

# 3. 30일 이내면 알림 + 자동 갱신
if [ $DAYS_LEFT -lt 30 ]; then
  log "WARNING: 인증서 만료 임박, 갱신 시도"
  
  # 먼저 백업
  /home/user/scripts/minikube-backup.sh
  
  # 갱신 시도
  minikube stop
  minikube start
  
  log "갱신 시도 완료"
fi

# 4. kubectl 동작 확인 및 백업
if kubectl cluster-info &>/dev/null; then
  /home/user/scripts/minikube-backup.sh
  log "정기 백업 완료"
else
  log "ERROR: kubectl 동작 불가"
fi

예방 체크리스트

정기적으로 확인해야 할 항목들입니다.

□ 인증서 만료일 확인 (월 1회)
□ 백업 스크립트 정상 동작 확인
□ 백업 파일 존재 및 크기 확인
□ minikube stop/start 수행 (분기 1회)
□ 알림 시스템 테스트

간단한 상태 확인 명령어 모음

# Minikube 상태 확인
minikube status

# 클러스터 정보 확인
kubectl cluster-info

# 인증서 만료일 확인
minikube ssh "openssl x509 -in /var/lib/minikube/certs/apiserver.crt -noout -enddate"

# 최근 백업 확인
ls -lt ~/minikube-backup/ | head -5

마무리

인증서 만료는 예방이 최선입니다. 이 글에서 소개한 방법들을 활용하면 갑작스러운 인증서 만료로 인한 데이터 손실을 예방할 수 있습니다.

핵심 포인트는 세 가지입니다.

  1. 정기적인 만료일 확인: 월 1회 이상
  2. 자동 백업 설정: 크론잡으로 일일/주간 백업
  3. 알림 자동화: 만료 30일 전 알림 수신

다음 편에서는 Minikube와 K3s를 운영 관점에서 비교하고, 왜 프로덕션에 가까운 환경에서는 K3s가 더 나은 선택인지 알아보겠습니다.




댓글 남기기