Kubernetes의 기초
실용적인 DevOps/도커 가이드: Kubernetes의 기초
이 가이드는 Kubernetes의 기본 개념과 실용적인 명령어, Dockerfile 예시를 포함하여 실무에서 바로 적용할 수 있는 내용을 제공하고 개인적으로 공부한 내역의 기록입니다.
—
1. Kubernetes 기본 개념
Kubernetes(K8s)는 컨테이너화된 애플리케이션의 배포, 스케일링, 운영을 자동화하는 오픈소스 플랫폼입니다. 처음 접하면 무조건 다 외우려 하지 말고, 아래 구성 요소들이 어떤 역할을 하는지 감만 잡으면 됩니다.
주요 구성 요소
| 개념 | 설명 |
|---|---|
| Pod | 가장 작은 배포 단위. 하나 이상의 컨테이너를 담고 있는 일종의 폴더라고 생각하면 편함 |
| Deployment | Pod의 배포, 업데이트, 스케일링을 관리.Deployment를 보면 앱의 버전 관리라고 보면 됨 |
| Service | Pod에 고정된 IP로 접근할 수 있게 해주는 네트워크 추상화 계층 |
| Ingress | 외부 HTTP/HTTPS 트래픽을 내부 Service로 라우팅. 로드밸런서 역할 |
| ConfigMap/Secret | 애플리케이션 설정과 민감한 정보(API 키, 비밀번호 등) 분리해서 관리 |
| PersistentVolume(PV) | 파드와 독립적인 스토리지. 재시작해도 데이터가 남아야 한다면 필수 |
| StatefulSet | 데이터베이스처럼 상태를 유지해야 하는 앱에 사용. 파드가 순서대로 올라옴 |
💡 팁: 처음엔 Pod → Deployment → Service 순서로 이해하면 좋습니다. 이 세 가지만으로도 거의 대부분의 앱은 배포할 수 있어요.

—
2. Kubernetes 설치
로컬에서 K8s를 경험 해보고 싶다면 Minikube가 가장 빠르고 쉬운 방법입니다.
Minikube (로컬 개발용)
# Minikube 설치
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# kubectl 설치 (K8s 클러스터와 통신하는 CLI 도구)
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
# Minikube 시작 (Docker 드라이버 사용)
minikube start --driver=docker
⚠️ 참고:
--driver=docker는 Docker가 설치되어 있어야 합니다. 다른 드라이버(virtualbox, hyperkit 등)도 있지만 Docker Desktop을 쓰고 있다면 이게 제일 간편합니다.
kubectl 기본 명령어
# 클러스터 정보 확인
kubectl cluster-info
# 노드 목록 확인 (워커 서버 목록)
kubectl get nodes
# 네임스페이스 목록 확인 (논리적 구분)
kubectl get namespaces
# 리소스 목록 확인 (기본 네임스페이스 기준)
kubectl get pods
kubectl get deployments
kubectl get services
# 특정 네임스페이스의 리소스 확인
kubectl get pods -n default
kubectl get pods -n kube-system # 시스템 파드 확인
—
3. Dockerfile 예시
Node.js 앱을 도커라이즈하는 가장 기본적인 패턴입니다. 실제로 프로젝트에 복사해서 쓰면 됩니다.
# Node.js 애플리케이션 예시
FROM node:18-alpine
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 설치 (캐싱 전략)
COPY package*.json ./
RUN npm install
# 애플리케이션 코드 복사
COPY . .
# 포트 노출
EXPOSE 3000
# 앱 실행
CMD ["npm", "start"]
💡 중요:
COPY package*.json ./ && npm install을 먼저 하는 이유는 도커 레이어 캐싱 때문입니다. 코드만 바꾸어도 매번 의존성을 다시 설치하지 않아 빨라집니다.
—
4. Kubernetes 배포 예시
이제 실제로 클러스터에 앱을 올려봅니다.
1. Docker 이미지 빌드 및 푸시
# 이미지 빌드
docker build -t myapp:1.0 .
# Docker Hub(또는 private registry)에 푸시
docker tag myapp:1.0 yourusername/myapp:1.0
docker push yourusername/myapp:1.0
2. Deployment 생성
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3 # 3개의 파드로 실행 (고가용성)
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: yourusername/myapp:1.0
ports:
- containerPort: 3000
resources:
limits:
memory: "256Mi"
cpu: "500m"
3. Service 생성
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP # ClusterIP / NodePort / LoadBalancer
4. 배포 적용
# 디플로이먼트 적용
kubectl apply -f deployment.yaml
# 서비스 적용
kubectl apply -f service.yaml
# 파드 상태 확인
kubectl get pods -o wide
# 로그 확인
kubectl logs -f deployment/myapp-deployment
# 스케일링
kubectl scale deployment myapp-deployment --replicas=5
—
마무리
처음엔 모든 것을 이해하려고 하기보다, “파드는 컨테이너 모음, 디플로이먼트는 파드 관리, 서비스는 네트워크” 이 세 가지만 기억하고 실제로 하나씩 해보는 게 가장 좋습니다.