섹션 8-2: Deploying the Container Application with Kubernetes (35~37)

쌀과자AI·2025년 8월 26일

📌 섹션 8: Deploying the Container Application with Kubernetes

1. Pod (기본 실행 단위)

  • Pod = Kubernetes에서 가장 작은 배포 단위, 컨테이너 실행의 래퍼(wrapper)
  • 보통 1 Pod = 1 컨테이너 (nginx 등). 경우에 따라 다중 컨테이너도 가능 (Service mesh, log scraper 등) .
  • 스케일링 방법 → Pod 수를 늘리고 줄이는 방식 (기존 Pod 안에 컨테이너를 추가하는 방식은 잘못된 접근).
  • Pod는 항상 한 노드에만 스케줄링됨. 여러 노드에 분산하려면 Pod를 여러 개 띄워야 함.
  • Pod는 언제든 죽을 수 있음 → 새 Pod가 새 ID/IP로 재생성됨 → 앱은 개별 Pod에 의존하면 안 됨.

👉 실습 예시: pod.yaml 에 nginx 기반 custom image 배포

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp
    environment: prod
spec:
  containers:
  - name: myapp
    image: manifoldailearning/custom-nginx
    ports:
      - containerPort: 80

2. Service (안정적인 네트워크 연결)

  • Pod는 죽으면 IP가 바뀌므로 Service 오브젝트를 통해 안정적인 접근 필요 .
  • Service = 안정적 네트워크 엔드포인트 제공 (DNS, IP, Port)
  • NodePort 방식: 로컬 환경에서는 Host(노드)의 포트를 열어 Pod로 연결 가능.
    • 예: localhost:30001 → Service Port(5000) → Pod Port(80)

👉 실습 예시: svc-local.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysvc
spec:
  type: NodePort
  selector:
    name: myapp
    environment: prod
  ports:
  - port: 5000        # Service Port
    targetPort: 80    # Pod 내부 컨테이너 Port
    nodePort: 30001   # 외부 접근 NodePort
    protocol: TCP

3. Deployment (자동화된 관리)

  • Deployment = Pod를 관리하는 상위 객체
  • 주요 기능:
    • Self-healing (자가 복구): Pod가 죽으면 새로 생성
    • Scaling: replicas 지정 가능 (예: 5개 Pod 실행)
    • Rolling Update: 점진적 배포/업데이트

👉 실습 예시: deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp-pod
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
      containers:
      - name: mycontainer
        image: manifoldailearning/custom-nginx
        ports:
        - containerPort: 80

4. Rolling Update (무중단 배포)

  • 기존 Pod를 모두 내려버리는 것이 아니라, 일부 Pod만 새 버전으로 교체하며 점진적 업데이트 .
  • maxUnavailable, maxSurge 등 파라미터로 업데이트 전략 제어.
    • 예: 동시에 1개만 내려가고, 새 Pod는 최대 2개까지 추가 생성.

👉 실습 예시: rolling-update.yaml

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

5. ConfigMap & Secret (환경 설정)

  • ConfigMap: 애플리케이션 설정값 저장 → Pod에서 envFrom 으로 주입 .
  • Secret: 민감정보(DB 비밀번호 등) 저장 → Pod에서 환경변수로 주입 .

✅ 핵심 요약

  1. Pod: 컨테이너 실행 단위, 스케일링은 Pod 수 조정으로 수행.
  2. Service: 불안정한 Pod IP를 추상화, 안정적 네트워크 엔드포인트 제공 (NodePort/LoadBalancer).
  3. Deployment: Pod 관리 자동화, Self-healing, Scaling, Rolling Update 지원.
  4. Rolling Update: 무중단 배포를 위한 핵심 전략.
  5. ConfigMap & Secret: 설정 및 보안정보 관리 방식.

📘 Kubernetes 배포 관련 예상 문제

문항1) (난이도: 하)

다음 중 Kubernetes에서 Pod에 대한 설명으로 옳지 않은 것은?

① Pod는 Kubernetes에서 컨테이너 실행의 기본 단위이다.

② 하나의 Pod는 반드시 여러 개의 컨테이너를 포함해야 한다.

③ Pod는 특정 노드에만 스케줄링되며, 여러 노드에 걸쳐 실행될 수 없다.

④ Pod는 장애 시 자동으로 새로운 Pod로 대체될 수 있다.

정답:

해설: Pod는 최소 1개 컨테이너를 포함하며, 대부분의 경우 단일 컨테이너로 실행된다. 여러 컨테이너는 특별한 경우(서비스 메쉬, 로그 수집 등)에만 사용된다 .


문항2) (난이도: 하)

Kubernetes에서 서비스(Service) 오브젝트를 사용하는 주된 이유는 무엇인가?

① Pod를 수평적으로 확장하기 위해서

② Pod의 자원 사용량을 제한하기 위해서

③ Pod의 IP 주소 변경에도 안정적인 네트워크 접근을 제공하기 위해서

④ Pod를 여러 노드에 동시에 배포하기 위해서

정답:

해설: Pod는 죽으면 새로 생성되고, 새로운 IP를 할당받는다. 따라서 안정적인 접근을 위해 Service 오브젝트가 필요하며, 이는 고정된 DNS/Port를 제공한다 .


문항3) (난이도: 중)

다음은 svc-local.yaml의 일부이다. 이 정의에 대한 설명으로 옳은 것은?

ports:
  - port: 5000       # Service Port
    targetPort: 80   # Container Port
    nodePort: 30001  # NodePort

① 클라이언트는 localhost:5000 으로 접근하여 Pod에 연결할 수 있다.

② 클라이언트는 localhost:30001 로 접근하여 Pod에 연결할 수 있다.

③ Pod 내부에서는 반드시 포트 5000에서 애플리케이션을 실행해야 한다.

④ Service와 Pod는 서로 다른 네임스페이스에 있어야 한다.

정답:

해설: NodePort 타입 서비스는 클러스터 외부에서 nodePort(30001)로 접근할 수 있고, 내부적으로 Service Port(5000)를 거쳐 Pod Port(80)로 연결된다 .


문항4) (난이도: 중)

Deployment 오브젝트에 대한 설명으로 옳은 것을 모두 고르시오.

ㄱ. Deployment는 Pod를 자동 복구(Self-healing)할 수 있다.

ㄴ. Deployment는 replicas 속성을 통해 여러 Pod를 동시에 실행할 수 있다.

ㄷ. Deployment Controller는 원하는 상태와 실제 상태를 일치시키는 역할을 한다.

ㄹ. Deployment는 Service 없이도 외부에서 직접 접근할 수 있다.

① ㄱ, ㄴ

② ㄱ, ㄷ

③ ㄱ, ㄴ, ㄷ

④ ㄴ, ㄹ

정답:

해설: Deployment는 Pod 복구, 확장, 롤링 업데이트 등을 자동화한다. Service가 없으면 외부 접근은 불가능하다 .


문항5) (난이도: 상)

다음은 rolling-update.yaml의 일부이다. 해당 설정에 대한 설명으로 옳은 것은?

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

① 업데이트 시 기존 Pod를 모두 중단한 뒤 새 Pod를 띄운다.

② 동시에 최대 2개의 새 Pod가 추가로 생성될 수 있다.

③ 기존 Pod는 모두 유지되며 새로운 Pod만 추가된다.

④ Pod는 한 번에 최대 1개씩만 업데이트될 수 없다.

정답:

해설: maxSurge: 2는 동시에 최대 2개의 새 Pod를 더 띄울 수 있음을 의미한다. maxUnavailable: 1은 동시에 최대 1개의 Pod만 사용할 수 없게 된다 .

profile
AI에 관심이 많은 23살 대학생입니다.

0개의 댓글