섹션 8-4: Deploying the Container Application with Kubernetes (44)

쌀과자AI·2025년 8월 26일

📌 강의 요약: Kubernetes를 활용한 컨테이너 애플리케이션 배포

1. Kubernetes 배포 개요

  • 기존 Docker 기반 배포에서 Kubernetes 오케스트레이션으로 확장.
  • 주요 목적: 보안 강화(Secret 관리) + 확장성 있는 배포.

2. Secret 관리 및 환경변수 주입

  • *민감정보(API Key)**는 코드에 직접 포함하지 않고 Kubernetes Secret으로 관리.
  • 생성 명령어:
kubectl create secret generic openai-secret --from-literal=API_KEY=실제_API_KEY
  • main.py에서는:
import os
api_key = os.environ["OPENAI_API"]
  • 형태로 환경변수에서 불러오도록 수정.

3. Deployment 구성 (deploy.yaml)

  • Deployment 객체
    • 이름: chatgpt-deploy
    • 복제본: replicas: 2 (부하 분산 및 고가용성 보장)
    • 컨테이너 이름: mychatgptcontainer
    • 이미지: manifoldailearning/chatgpt-project:v1
    • 환경변수: OPENAI_API ← openai-secret의 API_KEY 참조
  • Service 객체
    • 타입: NodePort
    • 외부 접근 포트: 30002
    • 컨테이너 내부 포트: 80

4. Docker 빌드 및 레지스트리 푸시

  • 새 이미지 생성 및 푸시:
docker build -t <username>/chatgpt-project:v1 .
docker push <username>/chatgpt-project:v1
  • deploy.yaml에서 해당 이미지를 사용.

5. 배포 및 검증 과정

  1. 기존 Pod, Service 삭제 후 정리.
  2. kubectl apply -f deploy.yaml 로 배포.
  3. Pod 상태 확인: kubectl get pods
  4. 브라우저에서 localhost:30002 접속 → FastAPI Docs 확인.
  5. 간단 요청 테스트 → 정상 응답 확인.

6. 핵심 학습 포인트 ⭐

  • 보안 강화: API Key를 Secret으로 분리 → 코드에 민감정보 포함 방지.
  • 환경변수 관리: Secret을 Pod의 환경변수로 주입하여 안전하게 사용.
  • 확장성: Deployment로 복제본 관리 및 자동 복구.
  • 테스트 및 운영 분리: 로컬 Kubernetes에서 NodePort로 검증 후, 운영환경에서는 LoadBalancer 등 다른 Service 타입으로 확장 가능.

👉 이번 강의는 Docker → Kubernetes 전환의 실전 단계를 보여주었으며, 실습 파일(deploy.yaml, Dockerfile, main.py)과 함께 보안·확장성·운영환경 고려가 중요한 배움의 포인트였습니다.


📘 연습문제 (강의 기반)

문항1) [난이도: 하]

다음 중 Kubernetes에서 민감정보(API Key 등)를 안전하게 관리하기 위해 가장 적절한 방법은 무엇인가?

① Pod 내부에 하드코딩한다.

② ConfigMap에 평문으로 저장한다.

③ Secret 객체를 생성하여 환경변수로 주입한다.

④ Dockerfile 내부에 직접 작성한다.

정답: ③

해설: Kubernetes에서는 비밀번호·API Key와 같은 민감정보를 Secret으로 관리하고, Pod에 환경변수 또는 Volume으로 주입한다.


문항2) [난이도: 하]

아래는 deploy.yaml의 일부이다. 빈칸 (A), (B)에 들어갈 올바른 값은?

env:
- name: (A)
  valueFrom:
    secretKeyRef:
      name: openai-secret
      key: (B)

① (A) OPENAI_API, (B) API_KEY

② (A) API_KEY, (B) OPENAI_API

③ (A) SECRET_KEY, (B) OPENAI_KEY

④ (A) OPENAI_SECRET, (B) API_SECRET

정답: ①

해설: deploy.yaml에서 환경변수명은 OPENAI_API, Secret 객체의 key는 API_KEY이다 .


문항3) [난이도: 중]

다음 중 Kubernetes Deployment 객체에 대한 설명으로 옳지 않은 것은?

① Replica 수를 지정하여 Pod 복제본을 관리할 수 있다.

② Pod가 실패하면 자동으로 재시작된다.

③ 컨테이너 이미지 버전 관리가 가능하다.

④ Service를 반드시 함께 생성해야 Deployment가 동작한다.

정답: ④

해설: Deployment는 Service와 독립적으로 동작할 수 있다. 다만 외부 접근을 위해 Service가 필요할 뿐, 필수 조건은 아니다.


문항4) [난이도: 중]

다음은 Kubernetes 배포 과정의 일부이다. 올바른 순서를 나열하시오.

ㄱ. docker build 명령어로 이미지 빌드

ㄴ. kubectl create secret generic 명령어로 Secret 생성

ㄷ. kubectl apply -f deploy.yaml 명령어 실행

ㄹ. docker push 명령어로 Docker Hub에 이미지 푸시

① ㄱ → ㄹ → ㄴ → ㄷ

② ㄱ → ㄷ → ㄹ → ㄴ

③ ㄴ → ㄱ → ㄹ → ㄷ

④ ㄹ → ㄱ → ㄷ → ㄴ

정답: ①

해설: 먼저 이미지를 빌드하고(ㄱ), 레지스트리에 푸시(ㄹ), API Key를 Secret에 등록(ㄴ), 마지막으로 deploy.yaml을 적용(ㄷ)한다.


문항5) [난이도: 상]

다음 중 NodePort Service에 대한 설명으로 옳은 것을 모두 고르시오.

ㄱ. 클러스터 내부에서만 접근 가능하다.

ㄴ. 외부 클라이언트는 특정 Node IP와 NodePort를 통해 접근 가능하다.

ㄷ. NodePort는 기본적으로 30000–32767 범위의 포트를 사용한다.

ㄹ. NodePort는 클라우드 환경에서 LoadBalancer Service의 기반으로 사용될 수 있다.

① ㄱ, ㄴ

② ㄴ, ㄷ

③ ㄴ, ㄷ, ㄹ

④ ㄱ, ㄷ, ㄹ

정답: ③

해설: NodePort는 외부 접근을 가능하게 하고, 포트 범위는 30000~32767이다. 또한 LoadBalancer Service는 내부적으로 NodePort를 기반으로 동작한다.


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

0개의 댓글