노트

쿠버네티스 핵심 개념

Kubernetes Core Concepts

인프라#k8s · 연결된 개념 10개

쉽게 말하면

쿠버네티스는 원하는 온도만 정해 두면 알아서 냉난방을 켜고 끄는 온도 조절기 같아요. '이 앱은 항상 3개 떠 있어야 해'라고 적어 두면, 하나가 죽어도 스스로 새로 띄워 개수를 맞춰요.

비유가 깨지는 곳 온도 조절기는 방 하나만 보지만 쿠버네티스는 여러 서버에 Pod를 배치하고, 바뀌는 Pod IP 앞에 Service라는 고정 이름을 세워 줘요. 메모리 limit을 넘은 컨테이너는 강제 종료(OOMKilled)돼요.

쿠버네티스는 여러 서버에 컨테이너를 배치하고, 죽으면 다시 띄우고, 트래픽에 맞춰 복제 수를 조절하는 컨테이너 오케스트레이션(container orchestration) 시스템이다. 사람이 하던 서버 운영을 "원하는 상태를 선언하면 계속 맞춰 주는" 제어 루프(control loop)로 자동화한다.

선언형과 재조정(reconciliation)

"Pod를 하나 띄워라"가 아니라 "이 앱은 항상 3개 떠 있어야 한다"를 YAML로 선언한다. 컨트롤러가 현재 상태와 선언한 상태를 끊임없이 비교해 차이를 메운다. React가 선언한 UI에 맞춰 DOM을 고치는 재조정과 같은 멘탈 모델이다(선언형과 명령형 프로그래밍).

핵심 오브젝트

  • Pod: 배포의 최소 단위. 보통 컨테이너 하나(때로 보조 컨테이너 포함)
  • Deployment: Pod 템플릿과 복제 수(replicas)를 선언한다. 롤링 업데이트(rolling update)와 롤백을 맡는다
  • Service: 라벨로 고른 Pod 묶음 앞의 고정 이름·주소. Pod IP가 바뀌어도 Service로 접속하면 알아서 분배된다
  • Ingress: 도메인·경로에 따라 외부 요청을 Service로 보내는 라우팅 규칙
  • Namespace: dev·qa·prod처럼 리소스를 나누는 단위
apiVersion: apps/v1
kind: Deployment
metadata: { name: web }
spec:
  replicas: 3
  selector: { matchLabels: { app: web } }
  template:
    metadata: { labels: { app: web } }
    spec:
      containers:
        - name: web
          image: registry.example.com/web:1.2.0
          ports: [{ containerPort: 3000 }]
          resources:
            requests: { memory: 256Mi, cpu: 250m }
            limits: { memory: 512Mi, cpu: 500m }

자동으로 해 주는 것

  • 자가 치유(self-healing): Pod가 죽으면 새로 띄워 개수를 맞춘다
  • 롤링 업데이트·롤백: 새 버전으로 하나씩 교체해 무중단 배포, 문제가 생기면 이전 ReplicaSet으로 되돌린다
  • 오토스케일링(autoscaling): 지표에 따라 Pod 수를 늘리고 줄인다(수직 확장과 수평 확장)
  • requests는 스케줄링 때 보장받는 양, limits는 상한이다. 메모리 limit을 넘으면 컨테이너가 강제 종료된다(OOMKilled, Out Of Memory)

kubectl apply -f로 선언을 반영하고, 그 선언을 git에서 자동 동기화하면 GitOps가 된다. 전제가 되는 컨테이너는 컨테이너와 이미지, 실제 디버깅 명령은 kubectl 디버깅 치트시트을 본다.

출처: Kubernetes 개요 · Deployment: 롤링 업데이트 · Service · requests와 limits

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 커밋 메시지와 원자적 커밋

    좋은 커밋은 한 가지 변경만 담고(원자적 커밋, atomic commit), 그 변경이 무엇이고 왜 필요했는지를 메시지로 설명한다. 히스토리는 나중의 나와 동료가 읽는 문서다.

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

  • CRDT

    여러 사본이 각자 독립적으로 수정돼도, 변경이 어떤 순서로 도착하든 병합하면 항상 같은 상태로 수렴하도록 수학적으로 설계한 자료구조. 이름 그대로 "충돌 없는 복제 데이터 타입"이다. 중앙 서버가 순서를 정해 주지 않아도 된다.

보기 옵션