본문 바로가기
IT 개발/클라우드

[쿠버네티스] 쿠버네티스 핵심 개념 마스터하기: 실전 가이드

by 이것 저것 모든것 2025. 2. 4.
728x90

들어가며

이전 포스트에서 도커와 쿠버네티스의 관계에 대해 알아보았습니다. 이번에는 쿠버네티스를 실제로 사용하기 위해 알아야 할 핵심 개념들을 자세히 살펴보겠습니다.

1. Pod (파드)

파드는 쿠버네티스의 가장 기본적인 배포 단위입니다.

주요 특징

  • 하나 이상의 컨테이너를 포함
  • 같은 파드 내의 컨테이너는 네트워크와 저장소 공유
  • 항상 같은 노드에서 실행

예제 YAML

apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
spec:
  containers:
  - name: my-app
    image: my-app:1.0
    ports:
    - containerPort: 8080

2. Deployment (디플로이먼트)

실제 운영 환경에서는 Pod를 직접 관리하지 않고 Deployment를 사용합니다.

주요 기능

  • Pod의 선언적 업데이트
  • 롤링 업데이트와 롤백
  • 스케일링
  • 자동 복구

예제 YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:1.0

3. Service (서비스)

Pod는 동적으로 생성/삭제되므로, 안정적인 엔드포인트가 필요합니다. 이를 Service가 제공합니다.

서비스 타입

  1. ClusterIP: 클러스터 내부 통신용
  2. NodePort: 외부에서 노드 포트로 접근
  3. LoadBalancer: 클라우드 로드밸런서 사용
  4. ExternalName: 외부 서비스의 별칭

예제 YAML

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

4. ConfigMap과 Secret

애플리케이션 설정과 민감한 정보를 관리합니다.

ConfigMap 예제

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_URL: "mongodb://localhost:27017"
  API_HOST: "api.example.com"

Secret 예제

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: base64encodedpassword
  API_KEY: base64encodedkey

5. Volume (볼륨)

데이터 영속성을 제공합니다.

주요 볼륨 타입

  • emptyDir: 임시 데이터 저장
  • hostPath: 노드의 파일시스템 사용
  • PersistentVolume: 영구 저장소

PersistentVolume 예제

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

6. Namespace (네임스페이스)

리소스를 논리적으로 구분합니다.

사용 예

apiVersion: v1
kind: Namespace
metadata:
  name: development

실전 응용: 전체 애플리케이션 배포

위 개념들을 조합한 실제 애플리케이션 배포 예제입니다.

# 네임스페이스 생성
apiVersion: v1
kind: Namespace
metadata:
  name: my-app

---
# ConfigMap 생성
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: my-app
data:
  APP_ENV: production
  API_URL: http://api.internal

---
# Deployment 생성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:1.0
        envFrom:
        - configMapRef:
            name: app-config
        ports:
        - containerPort: 8080

---
# Service 생성
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  namespace: my-app
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080

마치며

이러한 핵심 개념들을 이해하고 나면, 쿠버네티스로 복잡한 애플리케이션을 관리하는 것이 한결 수월해집니다. 다음 포스트에서는 이러한 개념들을 활용한 실제 배포 시나리오와 운영 팁을 다루도록 하겠습니다.

728x90