Kubernetes의 기초

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

마무리

처음엔 모든 것을 이해하려고 하기보다, “파드는 컨테이너 모음, 디플로이먼트는 파드 관리, 서비스는 네트워크” 이 세 가지만 기억하고 실제로 하나씩 해보는 게 가장 좋습니다.