TL;DR

  • Kubernetes 기본 개념의 핵심 개념과 사용 범위를 한눈에 정리
  • 등장 배경과 필요한 이유를 짚고 실무 적용 포인트를 연결
  • 주요 특징과 체크리스트를 빠르게 확인

1. 개념

``` K8s = Kubernetes의 약어 K + 8글자(ubernete) + s = K8s

2. 배경

Kubernetes 기본 개념이(가) 등장한 배경과 기존 한계를 정리한다.

3. 이유

이 주제를 이해하고 적용해야 하는 이유를 정리한다.

4. 특징

  • 약자
  • 개념
  • 역사
  • 전체 구조
  • 구성 요소 설명

5. 상세 내용

작성일: 2026-01-28 카테고리: Infrastructure / Container Orchestration 포함 내용: Kubernetes, Pod, Service, Deployment, Node, Namespace


1. Kubernetes란?

약자

K8s = Kubernetes의 약어
      K + 8글자(ubernete) + s = K8s

Kubernetes = 그리스어로 "조타수, 키잡이"
             (κυβερνήτης)

개념

Kubernetes = 컨테이너 오케스트레이션 플랫폼

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  "컨테이너가 많아지면 생기는 문제"                       │
│                                                         │
│  컨테이너 1개 관리 → 쉬움                               │
│  컨테이너 1000개 관리 → ???                             │
│                                                         │
│  ├── 어떤 서버에 배치?                                  │
│  ├── 컨테이너 죽으면?                                   │
│  ├── 트래픽 늘어나면?                                   │
│  ├── 업데이트는 어떻게?                                 │
│  ├── 서비스 간 통신은?                                  │
│  └── 이걸 자동으로 해주는 게 "Kubernetes"               │
│                                                         │
└─────────────────────────────────────────────────────────┘

역사

2014: Google이 오픈소스로 공개
      └── 내부 시스템 Borg의 경험을 기반으로 개발

2015: CNCF(Cloud Native Computing Foundation)에 기증

현재: 컨테이너 오케스트레이션의 사실상 표준

2. Kubernetes 아키텍처

전체 구조

┌─────────────────────────────────────────────────────────┐
│                   Kubernetes Cluster                     │
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │              Control Plane (Master)              │   │
│  │                                                  │   │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐        │   │
│  │  │   API    │ │  etcd    │ │Scheduler │        │   │
│  │  │  Server  │ │ (저장소) │ │(스케줄러)│        │   │
│  │  └──────────┘ └──────────┘ └──────────┘        │   │
│  │  ┌──────────────────────────────────────┐      │   │
│  │  │      Controller Manager               │      │   │
│  │  └──────────────────────────────────────┘      │   │
│  └─────────────────────────────────────────────────┘   │
│                          │                              │
│                          ▼                              │
│  ┌─────────────────────────────────────────────────┐   │
│  │              Worker Nodes (Data Plane)           │   │
│  │                                                  │   │
│  │  ┌───────────────┐     ┌───────────────┐       │   │
│  │  │    Node 1     │     │    Node 2     │       │   │
│  │  │ ┌───────────┐ │     │ ┌───────────┐ │       │   │
│  │  │ │  kubelet  │ │     │ │  kubelet  │ │       │   │
│  │  │ └───────────┘ │     │ └───────────┘ │       │   │
│  │  │ ┌───────────┐ │     │ ┌───────────┐ │       │   │
│  │  │ │ kube-proxy│ │     │ │ kube-proxy│ │       │   │
│  │  │ └───────────┘ │     │ └───────────┘ │       │   │
│  │  │ ┌───┐ ┌───┐  │     │ ┌───┐ ┌───┐  │       │   │
│  │  │ │Pod│ │Pod│  │     │ │Pod│ │Pod│  │       │   │
│  │  │ └───┘ └───┘  │     │ └───┘ └───┘  │       │   │
│  │  └───────────────┘     └───────────────┘       │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
└─────────────────────────────────────────────────────────┘

구성 요소 설명

구성요소 역할
API Server 모든 요청의 진입점, REST API 제공
etcd 클러스터 상태 저장소 (Key-Value)
Scheduler Pod를 어떤 Node에 배치할지 결정
Controller Manager 클러스터 상태 유지 (Deployment, ReplicaSet 등)
kubelet Node에서 Pod 실행/관리
kube-proxy 네트워크 프록시, Service 구현

3. Pod

개념

Pod = Kubernetes의 최소 배포 단위

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  Pod ≠ 컨테이너                                         │
│  Pod = 1개 이상의 컨테이너 그룹                         │
│                                                         │
│  ┌─────────────────────────────────────┐               │
│  │              Pod                     │               │
│  │  ┌───────────┐   ┌───────────┐     │               │
│  │  │ Container │   │ Container │     │               │
│  │  │   (App)   │   │ (Sidecar) │     │               │
│  │  └───────────┘   └───────────┘     │               │
│  │                                     │               │
│  │  공유: IP, 볼륨, 네트워크 네임스페이스│               │
│  └─────────────────────────────────────┘               │
│                                                         │
└─────────────────────────────────────────────────────────┘

Pod 특징

1. 같은 Pod 내 컨테이너는:
   - 같은 IP 주소 공유
   - localhost로 서로 통신 가능
   - 볼륨 공유 가능

2. Pod는 휘발성:
   - 언제든 죽을 수 있음
   - 죽으면 새 Pod 생성 (같은 Pod가 아님)
   - IP도 바뀔 수 있음

3. 그래서 Service가 필요!

Pod YAML 예시

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
    - name: app
      image: nginx:latest
      ports:
        - containerPort: 80

4. Service

개념

Service = Pod에 접근하기 위한 안정적인 엔드포인트

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  문제: Pod IP는 언제든 바뀔 수 있음                     │
│                                                         │
│  Client → Pod IP (10.0.0.5) → ❌ Pod 죽음              │
│                              → 새 Pod (10.0.0.8)        │
│                              → Client가 모름!          │
│                                                         │
│  해결: Service                                          │
│                                                         │
│  Client → Service (고정 IP/DNS) → Pod (어떤 것이든)    │
│                                                         │
└─────────────────────────────────────────────────────────┘

Service 종류

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  1. ClusterIP (기본값)                                  │
│     - 클러스터 내부에서만 접근 가능                     │
│     - 내부 서비스 간 통신용                             │
│                                                         │
│  2. NodePort                                            │
│     - 모든 Node의 특정 포트로 접근 가능                 │
│     - 외부 접근 가능 (Node IP:Port)                     │
│                                                         │
│  3. LoadBalancer                                        │
│     - 클라우드 로드밸런서 연동                          │
│     - 외부 접근 가능 (LB IP)                            │
│                                                         │
│  4. ExternalName                                        │
│     - 외부 DNS 이름 매핑                                │
│                                                         │
└─────────────────────────────────────────────────────────┘

Service YAML 예시

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  selector:
    app: my-app    # 이 라벨을 가진 Pod에 트래픽 전달
  ports:
    - port: 80         # Service 포트
      targetPort: 8080 # Pod 포트

5. Deployment

개념

Deployment = Pod의 "원하는 상태"를 선언적으로 관리

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  "Pod 3개를 항상 유지해줘"                              │
│                                                         │
│  Deployment                                             │
│     │                                                   │
│     └──► ReplicaSet                                     │
│              │                                          │
│              ├──► Pod 1                                 │
│              ├──► Pod 2                                 │
│              └──► Pod 3                                 │
│                                                         │
│  Pod 하나가 죽으면?                                     │
│  → Deployment가 자동으로 새 Pod 생성                    │
│                                                         │
└─────────────────────────────────────────────────────────┘

Deployment 기능

1. 복제본 관리 (replicas)
2. 롤링 업데이트
3. 롤백
4. 스케일링 (수동/자동)

Deployment YAML 예시

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3              # Pod 3개 유지
  selector:
    matchLabels:
      app: my-app
  template:                # Pod 템플릿
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: app
          image: my-app:v1
          ports:
            - containerPort: 8080

6. Namespace

개념

Namespace = 클러스터 내 가상의 분리 공간

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  하나의 클러스터를 여러 팀/환경이 공유할 때             │
│                                                         │
│  Cluster                                                │
│  ├── Namespace: dev                                     │
│  │   ├── Pod: api                                       │
│  │   └── Service: api-svc                               │
│  │                                                      │
│  ├── Namespace: staging                                 │
│  │   ├── Pod: api                                       │
│  │   └── Service: api-svc                               │
│  │                                                      │
│  └── Namespace: prod                                    │
│      ├── Pod: api                                       │
│      └── Service: api-svc                               │
│                                                         │
│  같은 이름(api, api-svc)이지만 서로 격리됨              │
│                                                         │
└─────────────────────────────────────────────────────────┘

기본 Namespace

default      : 기본 네임스페이스
kube-system  : 시스템 컴포넌트
kube-public  : 공개 리소스
kube-node-lease : 노드 상태 체크용

7. ConfigMap과 Secret

ConfigMap

ConfigMap = 설정 데이터를 Key-Value로 저장

용도: 환경 변수, 설정 파일 등
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  DATABASE_URL: "postgresql://db:5432"
  LOG_LEVEL: "info"

Secret

Secret = 민감한 데이터를 Base64로 인코딩하여 저장

용도: 비밀번호, API 키, 인증서 등
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=  # base64 encoded

8. 정리

┌─────────────────────────────────────────────────────────┐
│                                                         │
│  Kubernetes = 컨테이너 오케스트레이션 플랫폼            │
│                                                         │
│  핵심 개념:                                             │
│  ├── Cluster: K8s 전체 환경                             │
│  ├── Node: 컨테이너가 실행되는 서버                     │
│  ├── Pod: 최소 배포 단위 (1+ 컨테이너)                  │
│  ├── Service: Pod 접근을 위한 안정적 엔드포인트         │
│  ├── Deployment: Pod 상태 관리 (복제, 업데이트)         │
│  ├── Namespace: 가상 분리 공간                          │
│  ├── ConfigMap: 설정 데이터                             │
│  └── Secret: 민감한 데이터                              │
│                                                         │
│  선언적 관리:                                           │
│  "YAML로 원하는 상태를 정의하면                         │
│   K8s가 그 상태를 유지해줌"                             │
│                                                         │
└─────────────────────────────────────────────────────────┘

관련 키워드

Kubernetes, K8s, Pod, Service, Deployment, Node, Namespace, ConfigMap, Secret, 컨테이너 오케스트레이션