backend-interview-guide

쿠버네티스(Kubernetes)

목차


쿠버네티스란?

쿠버네티스(Kubernetes, K8s)컨테이너화된 애플리케이션을 자동으로 배포, 확장, 관리하기 위한 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. 컨테이너를 개별적으로 관리하는 대신, 쿠버네티스를 사용하면 클러스터(Cluster) 내에서 여러 컨테이너를 체계적으로 배포하고, 자원을 효율적으로 활용하며, 애플리케이션의 상태를 지속적으로 모니터링할 수 있습니다.

쿠버네티스는 Google에서 개발되었으며, 이후 Cloud Native Computing Foundation(CNCF) 에서 관리되고 있습니다. 쿠버네티스는 특히 클라우드 네이티브 애플리케이션마이크로서비스 아키텍처를 지원하는 핵심 기술로 자리 잡고 있습니다.

주요 기능:

  1. 컨테이너 배포 관리: 애플리케이션을 다양한 환경(온프레미스, 클라우드 등)에 자동으로 배포할 수 있습니다.
  2. 자동화된 확장(Auto-scaling): 워크로드에 따라 컨테이너 수를 자동으로 늘리거나 줄이는 기능을 제공합니다.
  3. 셀프 힐링(Self-healing): 장애가 발생한 컨테이너를 자동으로 재시작하거나 복구하며, 원하는 상태를 유지합니다.
  4. 로드 밸런싱 및 서비스 디스커버리: 네트워크 트래픽을 분산하고 컨테이너 간의 통신을 쉽게 설정할 수 있습니다.

쿠버네티스의 주요 구성 요소

쿠버네티스는 클러스터(Cluster) 구조를 기반으로 동작하며, 여러 구성 요소가 서로 협력하여 컨테이너를 효율적으로 관리합니다.

1. 클러스터 (Cluster)

쿠버네티스 클러스터는 컨트롤 플레인(Control Plane)노드(Node) 로 구성됩니다. 클러스터는 컨테이너화된 애플리케이션과 그 리소스를 관리하는 기본 단위입니다.


2. 컨트롤 플레인 구성 요소

(1) API 서버 (API Server)

(2) 컨트롤러 매니저 (Controller Manager)

(3) 스케줄러 (Scheduler)

(4) ETCD


3. 노드(Node) 구성 요소

(1) Kubelet

(2) Kube-proxy

(3) 컨테이너 런타임(Container Runtime)


4. 기본 객체 (Kubernetes Objects)

(1) 파드(Pod)

(2) 서비스(Service)

(3) 디플로이먼트(Deployment)

(4) 컨피그맵(ConfigMap) & 시크릿(Secret)


쿠버네티스의 장점

쿠버네티스는 컨테이너화된 애플리케이션을 효율적으로 관리하고, 대규모 시스템에서도 높은 확장성과 가용성을 제공합니다.

1. 자동화된 운영

2. 이식성

3. 로드 밸런싱

4. 확장성

5. 무중단 배포


쿠버네티스의 단점

쿠버네티스는 강력한 기능을 제공하지만, 구현 및 운영에서 몇 가지 단점이 존재합니다.

1. 복잡성

2. 학습 곡선

3. 운영 오버헤드

4. 리소스 소비


쿠버네티스 사용 시 주의할 점

쿠버네티스를 효과적으로 사용하려면, 몇 가지 운영 및 관리 측면에서 주의가 필요합니다. 아래는 주요 고려 사항입니다:

1. 리소스 요청 및 제한 설정

2. 보안 설정


쿠버네티스 배포

무중단 배포란?

무중단 배포(Zero Downtime Deployment)는 애플리케이션 배포 시 서비스의 가용성을 유지하면서 업데이트를 수행하는 방식을 의미합니다. 사용자는 배포 중에도 애플리케이션을 계속 사용할 수 있으며, 다운타임이나 서비스 중단 없이 새로운 버전으로 전환됩니다.

무중단 배포는 다음과 같은 상황에서 필수적입니다:


배포 전략

롤링 업데이트 (Rolling Update)

기존 인스턴스를 하나씩 교체하여 점진적으로 새로운 버전으로 대체하는 방식입니다.

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 1
    maxSurge: 1

블루-그린 배포 (Blue-Green Deployment)

새로운 버전(Green)을 준비한 뒤, 기존 버전(Blue)에서 새로운 버전으로 트래픽을 전환합니다.

  1. 기존 서비스(Blue)와 새로운 서비스(Green)를 병렬로 실행.
  2. 트래픽을 새로운 버전으로 전환.
  3. 문제가 없으면 Blue를 삭제하거나 대기 상태로 유지.

장점:


카나리 배포 (Canary Deployment)

새 버전을 전체 트래픽의 일부에만 노출하고, 점진적으로 확장하여 전환하는 방식입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: canary-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        version: canary

A/B 테스트

사용자를 그룹으로 나누어 새 버전(A)과 기존 버전(B)을 동시에 제공하는 방식입니다. 성능과 사용자 피드백을 기반으로 새로운 버전의 확장 여부를 결정합니다.


무중단 배포를 위한 파드 세팅

Liveness와 Readiness Probe

livenessProbe:
  httpGet:
    path: /
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 10

PreStop Hook

파드 종료 전에 작업을 수행하여 연결을 안전하게 종료하거나 요청 처리를 마무리.

lifecycle:
  preStop:
    exec:
      command: ["sh", "-c", "sleep 5"]

Graceful Shutdown

파드 종료 시, 애플리케이션이 요청을 안전하게 처리할 시간을 확보.

spec:
  terminationGracePeriodSeconds: 60

Auto-scaling

트래픽 증가에 따라 파드를 자동으로 확장하여 무중단 배포를 지원.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: example-deployment
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

Pod Anti-Affinity

여러 파드를 동일한 노드에 배치하지 않도록 설정하여 장애 영향을 분산.

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
            - key: app
              operator: In
              values:
                - example
        topologyKey: "kubernetes.io/hostname"

무중단 배포 시 주의 사항

  1. 헬스 체크 설정:

    • Liveness와 Readiness Probe를 정확히 설정하여 비정상적인 파드에 트래픽이 전달되지 않도록 방지.
  2. 배포 속도 제어:

    • 롤링 업데이트나 카나리 배포에서 배포 속도를 조정하여 트래픽 과부하 방지.
  3. 로깅 및 모니터링:

    • Prometheus, Grafana와 같은 도구를 사용하여 배포 중 발생하는 문제를 실시간으로 추적.
  4. 테스트 환경 구축:

    • 블루-그린 또는 카나리 배포 전, 새로운 버전을 충분히 테스트하여 안정성을 검증.
  5. 네트워크 안정성 유지:

    • 로드 밸런서와 네트워크 설정을 통해 서비스 간 통신을 안정적으로 유지.

결론

쿠버네티스는 현대 IT 환경에서 필수적인 컨테이너 오케스트레이션 플랫폼으로, 대규모 애플리케이션의 배포, 확장, 관리를 간소화합니다. 특히 클라우드 네이티브 애플리케이션마이크로서비스 아키텍처를 지원하는 핵심 기술로, 기업의 IT 인프라 운영 효율성을 극대화할 수 있습니다.

그러나 초기 학습 비용과 운영 복잡성을 고려해야 하며, 적절한 클러스터 설계와 관리 전략이 필요합니다. 쿠버네티스를 제대로 활용하면, 애플리케이션의 확장성과 안정성을 극대화할 수 있는 강력한 도구가 될 것입니다.