Kubernetes 학습과 운영에서 자주 묻는 질문과 답변을 정리합니다.
시작하기 전에#
Q: Kubernetes를 배우기 전에 알아야 할 것은?#
A: 다음 지식이 있으면 학습이 수월합니다:
- 필수: Docker 기본 (이미지 빌드, 컨테이너 실행)
- 필수: Linux 기본 명령어 (cd, ls, cat, grep)
- 권장: YAML 문법, 네트워크 기초 (IP, 포트, DNS)
Q: 로컬에서 Kubernetes를 어떻게 실습하나요?#
A: 세 가지 방법이 있습니다:
| 도구 | 특징 | 권장 대상 |
|---|---|---|
| Minikube | 가장 쉬움, 문서 많음 | 초보자 |
| Kind | 빠른 시작, 다중 노드 | CI/CD |
| Docker Desktop | 설치 간편 | macOS/Windows |
초보자라면 Minikube로 시작하세요: minikube start
Q: 학습에 얼마나 시간이 걸리나요?#
A: 목표에 따라 다릅니다:
- 기본 배포 (Pod, Deployment, Service): 1-2주
- 운영 기초 (리소스, 스케일링, 모니터링): 1개월
- 실무 숙련: 3-6개월 (실제 프로젝트 경험 필요)
Q: YAML 문법이 어려워요. 꼭 알아야 하나요?#
A: 네, Kubernetes 리소스는 YAML로 정의합니다. 다행히 복잡한 문법은 사용하지 않습니다:
- 들여쓰기 (스페이스 2칸)
- 키-값 쌍 (
key: value) - 리스트 (
- item)
kubectl explain deployment.spec으로 필드 설명을 볼 수 있습니다.
Q: kubectl 명령어가 너무 길어요. 단축키가 있나요?#
A: 자주 쓰는 단축 명령어:
# 별칭 설정 (~/.bashrc 또는 ~/.zshrc)
alias k='kubectl'
alias kgp='kubectl get pods'
alias kgs='kubectl get services'
alias kgd='kubectl get deployments'
alias kd='kubectl describe'
alias kl='kubectl logs'기본 개념#
Q: Pod와 컨테이너의 차이는 무엇인가요?#
A: 컨테이너는 애플리케이션을 실행하는 격리된 환경이고, Pod는 하나 이상의 컨테이너를 포함하는 Kubernetes의 최소 배포 단위입니다. 같은 Pod 내의 컨테이너는 네트워크와 스토리지를 공유합니다. 대부분의 경우 Pod에는 컨테이너 1개만 포함합니다.
Q: Deployment 대신 Pod를 직접 만들면 안 되나요?#
A: Pod를 직접 생성할 수 있지만 권장하지 않습니다. Pod가 삭제되면 자동으로 복구되지 않기 때문입니다. Deployment를 사용하면 원하는 replicas 수를 자동으로 유지하고, 롤링 업데이트와 롤백도 지원합니다.
Q: Service가 필요한 이유는 무엇인가요?#
A: Pod IP는 Pod가 재생성될 때마다 변경됩니다. Service는 변경되지 않는 고정 IP와 DNS 이름을 제공하여 Pod에 안정적으로 접근할 수 있게 합니다. 또한 여러 Pod에 트래픽을 자동으로 분산합니다.
설정과 운영#
Q: requests와 limits의 차이는 무엇인가요?#
A: requests는 Pod가 최소한 보장받는 리소스이고 스케줄링의 기준이 됩니다. limits는 Pod가 사용할 수 있는 최대 리소스입니다. CPU가 limits를 초과하면 스로틀링되고, 메모리가 limits를 초과하면 OOMKilled됩니다.
Q: ConfigMap과 Secret의 차이는 무엇인가요?#
A: 둘 다 설정을 저장하는 리소스이지만, ConfigMap은 일반 설정용이고 Secret은 민감한 정보(비밀번호, API 키)용입니다. Secret은 Base64 인코딩되며, etcd 암호화를 활성화하면 더 안전하게 저장됩니다.
Q: Liveness Probe와 Readiness Probe의 차이는?#
A:
- Liveness Probe: 컨테이너가 살아있는지 확인. 실패하면 재시작.
- Readiness Probe: 트래픽을 받을 준비가 되었는지 확인. 실패하면 Service에서 제외.
Liveness는 데드락 같은 복구 불가능한 상황용이고, Readiness는 일시적인 준비 안 됨 상태(DB 연결 끊김 등)용입니다.
Q: 적절한 replicas 수는 어떻게 결정하나요?#
A: 다음을 고려하세요:
- 최소 2개 이상 (고가용성)
- 예상 트래픽과 단일 Pod의 처리량
- 롤링 업데이트 시 가용 Pod 수
- HPA를 사용하면 자동으로 조절됩니다
트러블슈팅#
Q: Pod가 Pending 상태에서 멈춰 있어요.#
A: kubectl describe pod <pod-name>으로 Events를 확인하세요. 주요 원인:
- 리소스 부족: 노드에 요청한 CPU/메모리가 없음
- 노드 셀렉터 불일치: 조건에 맞는 노드가 없음
- PVC 바인딩 대기: 볼륨이 준비되지 않음
Q: CrashLoopBackOff가 발생해요.#
A: kubectl logs <pod-name> --previous로 이전 로그를 확인하세요. 주요 원인:
- 애플리케이션 오류 (설정 누락, 의존성 문제)
- 메모리 부족 (Exit Code 137 = OOMKilled)
- 잘못된 명령어나 환경 변수
Q: Service에 연결이 안 돼요.#
A: 확인 순서:
kubectl get endpoints <service-name>- Endpoints가 있는지kubectl get pods -l <selector>- Pod가 Ready인지- Pod 내부에서
curl localhost:<port>- 앱이 응답하는지 - Service selector와 Pod labels가 일치하는지
클라우드와 도구#
Q: EKS, GKE, AKS 중 어떤 것을 선택해야 하나요?#
A: 이미 사용 중인 클라우드가 있다면 해당 서비스를 선택하세요:
- AWS 사용 중: EKS
- GCP 사용 중: GKE
- Azure 사용 중: AKS
기능은 대체로 비슷합니다. GKE가 기본 기능이 가장 풍부하고, EKS는 AWS 서비스와의 통합이 좋습니다.
Q: Helm이 필요한가요?#
A: 복잡한 애플리케이션이나 여러 환경에 동일한 앱을 배포할 때 유용합니다. 단순한 앱이라면 kubectl과 YAML만으로 충분합니다.
Q: 로컬 개발에 Minikube vs Kind 중 무엇을 쓰나요?#
A:
- Minikube: 초보자에게 권장, 다양한 애드온, 문서 많음
- Kind: 빠른 클러스터 생성, 다중 노드, CI/CD에 적합
학습 목적이면 Minikube, CI 환경이면 Kind가 좋습니다.
모범 사례#
Q: YAML 파일은 어떻게 관리하나요?#
A:
- Git으로 버전 관리
- 환경별로 디렉토리 분리 (
/base,/overlays/dev,/overlays/prod) - Kustomize나 Helm으로 환경별 차이 관리
Q: 네임스페이스는 어떻게 나누나요?#
A: 일반적인 방법:
- 환경별:
dev,staging,prod - 팀별:
team-a,team-b - 기능별:
monitoring,logging
소규모라면 환경별 분리로 시작하세요.
Q: 프로덕션에서 주의할 점은?#
A:
- 리소스 requests/limits 필수 설정
- Readiness/Liveness Probe 설정
- 최소 2개 이상의 replicas
- PodDisruptionBudget 설정
- 정기적인 백업 (etcd, PV)
- 모니터링 및 알림 구성