인턴 활동 정리
4학년 2학기를 앞두고 있던 여름 방학부터 스타트업에서 백엔드 개발자 인턴을 시작하게 되었다.
앞으로 그때 노션에 정리해 놓았던 글을 정리해서 블로그로 옮겨 보려고 한다.
입사하고 첫 주에는 Kubernetes와 NestJS를 학습하고, 간단한 실습 과제를 해결해 보는 시간을 가졌다.
아래는 쿠버네티스를 처음 접하는 입장에서 구조와 개념을 간단하게 정리한 기록이다.
컨테이너
컨테이너는 애플리케이션이 실행되는 데 필요한 코드, 설정, 라이브러리 등을 하나로 묶은 실행 환경이다.
운영체제 전체를 가상화하는 가상 머신과 달리 컨테이너는 필요한 부분만 가볍게 격리해서 빠르게 실행할 수 있다.
환경이 달라도 항상 똑같이 실행되고, 배포나 확장도 간편하다는 점 때문에 인프라 구성에서 기본 단위로 많이 사용된다.
Pod
Pod는 쿠버네티스에서 가장 작은 배포 단위다.
하나 이상의 컨테이너를 포함하며 컨테이너 간에는 네트워크(IP 주소 및 포트)와 스토리지(볼륨)를 공유할 수 있다.
- 컨테이너 그룹화: 밀접하게 관련된 컨테이너를 하나의 파드로 묶어 함께 배치한다.
- 공유 리소스: 파드 내 컨테이너는 같은 네트워크 네임스페이스를 사용하며 동일한 볼륨을 참조할 수 있다.
- 자동 복구: 파드가 종료되거나 실패할 경우 쿠버네티스가 자동으로 재생성한다.
Node
Node는 파드를 실제로 실행하는 물리적 또는 가상 머신이다.
각 노드는 Control Plane에 의해 관리되며 다음과 같은 구성 요소를 포함한다.
- kubelet: 파드 상태를 감시하고 보고하는 역할을 한다.
- kube-proxy: 네트워크 통신 및 포워딩을 담당하는 프록시 컴포넌트
- 컨테이너 런타임: Docker, containerd 등 실제 컨테이너 실행을 담당하는 소프트웨어
Node는 역할에 따라 아래와 같이 나뉜다.
- 마스터 노드: 클러스터 전체의 제어 및 관리를 담당
- 워커 노드: 실제로 파드가 배포되어 동작하는 노드

Cluster

클러스터는 여러 노드(Node)로 구성된 논리적인 단위다.
클러스터에는 전체 상태를 제어하는 Control Plane이 존재하고, 이 구성 요소들은 보통 마스터 노드에 설치되어 실행된다.
Control Plane을 구성하는 주요 컴포넌트는 다음과 같다.
- kube-apiserver: 클러스터의 모든 요청을 처리하는 API 서버.
- etcd: 클러스터의 상태 데이터를 저장하는 분산 키-값 저장소.
- scheduler: 새로 생성된 파드를 적절한 노드에 배치한다.
- controller-manager: 다양한 컨트롤러를 실행하여 클러스터 상태를 관리.
- cloud-controller-manager: 클라우드 환경(AWS, GCP 등)과의 연동을 담당.
쿠버네티스 내부 통신과 라우팅
쿠버네티스에서 파드는 고유한 IP 주소를 받아 네트워크 통신이 가능하다.
하지만 파드는 삭제되었다가 다시 생성되면 IP가 바뀔 수 있기 때문에, 파드에 직접 접근하는 방식은 안정적이지 않다.
이 문제를 해결하기 위해 쿠버네티스는 Service라는 추상화 계층을 제공한다.
Service는 파드 앞단에서 고정된 네트워크 접근 지점 역할을 하며, 트래픽을 해당 파드들로 안정적으로 전달해준다.
Service의 주요 유형
- ClusterIP: 클러스터 내부에서만 접근 가능
- NodePort: 외부에서 특정 포트를 통해 접근 가능
- LoadBalancer: 클라우드 환경에서 외부 로드밸런서를 생성
- ExternalName: 외부 도메인을 내부 서비스처럼 연결
Ingress – 외부 트래픽의 진입점
Ingress는 외부에서 들어오는 HTTP/HTTPS 요청을 클러스터 내부의 적절한 서비스로 라우팅해준다.
하나의 진입점(예: Load Balancer)을 통해 다양한 경로나 도메인 기반의 요청을 분기시킬 수 있다.
Ingress가 지원하는 주요 기능:
- 경로 기반 라우팅:
예) /api는 API 서비스로, /admin은 관리 서비스로 연결 - 호스트 기반 라우팅:
예) api.example.com → API 서비스, web.example.com → 웹 서비스 - TLS 종료(SSL 처리):
Ingress에서 HTTPS 요청을 종료하고, 내부 통신은 HTTP로 처리 - 리버스 프록시 역할:
여러 백엔드를 하나의 도메인 아래에서 통합
Ingress는 단독으로 작동하지 않는다. 반드시 함께 동작할 Ingress Controller가 필요하다.
대표적인 컨트롤러로는 NGINX Ingress Controller, Traefik, AWS ALB Ingress Controller 등이 있다.
kube-proxy – 서비스 트래픽 전달자
kube-proxy는 각 노드에서 실행되는 네트워크 컴포넌트로,
Service로 들어온 요청을 실제 파드로 전달하는 역할을 한다.
- 서비스의 ClusterIP로 요청이 오면, kube-proxy가 연결된 파드 중 하나로 트래픽을 전달한다.
- 내부적으로는 iptables 또는 IPVS 같은 리눅스 커널 기능을 활용해 로드밸런싱 처리를 수행한다.
- 여러 파드가 같은 서비스에 연결돼 있다면, 요청을 자동으로 분산 처리해준다.
kube-proxy는 클러스터 안에서 서비스 이름 → 파드 IP로 연결을 맵핑해주는 브릿지 역할을 한다.
스케줄링 개요
파드가 생성되면, 쿠버네티스는 이를 어느 노드에 배치할지 자동으로 결정한다. 이 과정을 스케줄링이라고 한다.
스케줄링 시 고려되는 주요 기준은 다음과 같다.
- 파드가 요구하는 CPU, 메모리 등 리소스
- 노드의 현재 상태와 리소스 여유
- Affinity / Anti-affinity: 특정 노드에 배치하거나 피하도록 설정된 규칙
- Taints / Tolerations: 특정 노드가 특정 파드를 받지 않도록 설정된 제약
- 네트워크 조건이나 데이터 지역성 등 기타 제약 조건
스케줄링 이후에도 쿠버네티스는 파드 상태를 지속적으로 모니터링하고,
필요 시 자동으로 재스케줄링을 수행해 안정성을 유지한다.
오토스케일링 (Auto Scaling)
애플리케이션 부하에 따라 파드 수나 리소스를 자동으로 조절하는 기능이다.
- Horizontal Pod Autoscaler (HPA)
CPU, 메모리 등의 메트릭 기반으로 파드 수를 자동으로 조절한다. - Vertical Pod Autoscaler (VPA)
각 파드에 할당된 리소스(CPU/메모리)를 자동으로 조정한다. 주로 상태 비저장(stateless) 파드에 적용된다.
이 기능들을 통해 시스템 자원을 효율적으로 사용할 수 있고, 예상치 못한 트래픽 증가에도 안정적으로 대응할 수 있다.
'인턴' 카테고리의 다른 글
| 포트원(아임포트), 부트페이, 토스페이먼츠(PG사) 특징 및 수수료 비교 (2) | 2025.06.05 |
|---|---|
| 인턴 1주차 - Helm을 활용한 NestJS 애플리케이션 Kubernetes 배포 (1) | 2025.05.04 |
| 인턴 1주차 - 쿠버네티스 실습(로컬에서 NestJS 애플리케이션 배포하기) (0) | 2025.05.03 |