홈으로 돌아가기

예제로 설명하는 Kubernetes 아키텍처 | 가이드

이 문서는 예제와 함께 설명하는 포괄적인 kubernetes 아키텍처를 제공하며, 컨트롤 플레인 구성 요소(API 서버, etcd, 스케줄러, 컨트롤러 매니저)와 워커 노드 요소(kubelet, kube-proxy, 컨테이너 런타임)를 분석합니다. 실용적인 Nginx 배포 워크스루를 사용하여 구성 요소 상호 작용, 자가 치유, 스케일링 및 롤링 업데이트를 설명하여 Kubernetes를 초보자와 실무자에게 접근하기 쉽게 만듭니다.

Kubernetes 아키텍처: 실용적인 예제 가이드
Advertisement 728x90

쿠버네티스 아키텍처 실전 예제로 이해하기

쿠버네티스 아키텍처 실전 예제로 이해하기

쿠버네티스는 컨테이너 오케스트레이션의 업계 표준이 되었지만, 복잡한 아키텍처 때문에 초보자들이 종종 어려움을 겪습니다. 이 가이드는 쿠버네티스 아키텍처를 예제와 함께 설명하여 각 구성 요소가 어떻게 작동하는지, 그리고 프로덕션 환경에서 애플리케이션 배포, 확장, 관리를 자동화하기 위해 어떻게 함께 작동하는지 알려드립니다.

배울 내용

이 가이드를 마치면 쿠버네티스 클러스터 구성 요소가 어떻게 상호 작용하여 컨테이너화된 애플리케이션을 안정적으로 실행하는지 이해하고, 각 컨트롤 플레인 및 워커 노드 구성 요소의 역할을 식별할 수 있습니다. 사용자가 배포를 제출한 순간부터 애플리케이션이 사용 가능해질 때까지의 전체 요청 흐름을 구체적인 예제를 통해 설명할 수 있게 됩니다.

Google AdInline article slot

작동 방식: 실제 사례에 비유한 계층형 아키텍처

쿠버네티스 클러스터를 해운 회사에 비유해 보겠습니다. 컨트롤 플레인은 관리자가 전략적 결정을 내리는 본사입니다. 워커 노드는 컨테이너를 실제로 운반하는 화물선입니다. 선박의 각 컨테이너는 쿠버네티스에서 가장 작은 배포 가능 단위인 **파드(Pod)**입니다.

컨트롤 플레인: 클러스터의 두뇌

컨트롤 플레인은 클러스터의 상태를 관리하고 모든 활동을 조정합니다. 여러 중요한 구성 요소로 이루어져 있습니다.

kube-apiserver는 프런트 데스크 역할을 합니다. 클러스터와의 모든 통신은 이 구성 요소를 통해 이루어집니다. kubectl 명령을 실행하면 API 서버가 요청을 인증하고 검증한 후 etcd에 저장된 클러스터 상태를 업데이트합니다. etcd는 모든 클러스터 데이터의 백업 저장소 역할을 하는 분산 키-값 저장소입니다.

Google AdInline article slot

kube-scheduler는 노드가 할당되지 않은 새로 생성된 파드를 감시합니다. 리소스 요구 사항, 제약 조건, 정책에 따라 가장 적합한 워커 노드를 지능적으로 선택합니다. 예를 들어 GPU가 필요한 파드를 요청하면 스케줄러는 GPU 리소스가 있는 노드만 고려합니다.

kube-controller-manager는 클러스터 상태를 지속적으로 모니터링하고 수정하는 컨트롤러 집합을 실행합니다. 노드 컨트롤러는 노드가 다운될 때 감지하고, 잡(Job) 컨트롤러는 일회성 작업을 관리하며, 엔드포인트슬라이스(EndpointSlice) 컨트롤러는 서비스를 파드에 연결합니다.

워커 노드: 애플리케이션이 실행되는 곳

각 워커 노드는 세 가지 필수 구성 요소를 실행합니다.

Google AdInline article slot

kubelet은 파드 내에서 컨테이너가 지정된 대로 실행되도록 보장하는 기본 노드 에이전트입니다. API 서버에서 파드 사양을 수신하고 컨테이너 런타임을 관리하여 해당 컨테이너를 시작하고 모니터링합니다.

kube-proxy는 클러스터 내부 또는 외부에서 파드와 통신할 수 있도록 네트워크 규칙을 유지 관리합니다. 패킷 필터링 규칙을 사용하여 트래픽을 올바른 파드로 전달함으로써 서비스 개념을 구현합니다.

컨테이너 런타임(containerd 또는 CRI-O 등)은 실제로 컨테이너를 실행하는 소프트웨어입니다.

실전 예제: 웹 애플리케이션 배포

Nginx 웹 서버를 배포할 때 어떤 일이 일어나는지 추적해 보겠습니다.

  1. Nginx 컨테이너의 복제본 3개를 지정하는 디플로이먼트(Deployment) YAML 파일을 작성합니다.
  2. kubectl apply -f deployment.yaml로 제출합니다. 요청이 API 서버에 도달합니다.
  3. API 서버가 사용자를 인증하고 원하는 상태를 etcd에 저장합니다.
  4. 스케줄러가 예약되지 않은 파드를 감지하고 사용 가능한 용량이 있는 워커 노드에 할당합니다.
  5. 할당된 각 워커 노드에서 kubelet이 파드 사양을 수신하고 컨테이너 런타임에 Nginx 이미지를 가져와 컨테이너를 시작하도록 지시합니다.
  6. 컨트롤러-매니저가 3개의 복제본이 실행 중인지 지속적으로 확인하고, 파드가 실패하면 대체 파드를 생성합니다.
  7. 애플리케이션을 노출하기 위해 서비스가 생성되고, kube-proxy가 네트워크 규칙을 구성하여 트래픽이 파드에 도달할 수 있도록 합니다.

이것이 중요한 이유

쿠버네티스의 아키텍처는 조직이 소프트웨어를 배포하고 관리하는 방식을 근본적으로 변화시키는 기능을 가능하게 합니다.

자동 복구: 컨테이너가 충돌하거나 노드가 응답하지 않으면 컨트롤러가 정상 노드에서 실패한 파드를 자동으로 교체하여 가동 중단 시간을 최소화합니다.

수평 확장: 수평 파드 자동 확장기(Horizontal Pod Autoscaler)는 CPU 사용률이나 사용자 정의 메트릭에 따라 파드 복제본 수를 자동으로 조정하여 수동 개입 없이 트래픽 급증을 처리할 수 있도록 합니다.

롤링 업데이트 및 롤백: 디플로이먼트는 무중단 업데이트를 가능하게 합니다. 이전 파드를 새 버전으로 점진적으로 교체할 수 있으며, 문제가 발생하면 즉시 롤백할 수 있습니다.

리소스 효율성: 스케줄러가 노드 간 파드 배치를 최적화하여 리소스 활용도를 높이고 인프라 비용을 절감합니다.

수치로 보는 쿠버네티스

지표 세부 사항
최초 릴리스 쿠버네티스 1.0, 2015년 7월 21일 출시
컨트롤 플레인 노드 프로덕션 클러스터는 일반적으로 고가용성을 위해 3개의 컨트롤 플레인 노드 실행
워커 노드 대규모 클러스터는 1,000개 이상의 워커 노드 가능
노드당 기본 파드 수 기본적으로 최대 110개 (구성 가능)
API 요청 지연 시간 잘 튜닝된 클러스터에서 99번째 백분위수 일반적으로 1초 미만
etcd NVMe 스토리지에서 초당 약 10,000회 쓰기 처리 가능

일반적인 오해와 사실

오해 사실
"쿠버네티스는 컨테이너를 노드에서 직접 실행한다." 쿠버네티스는 컨테이너를 직접 실행하지 않습니다. 항상 파드 내에서 실행되며, 파드는 네트워킹과 스토리지를 포함하는 가장 작은 배포 가능 단위입니다.
"API 서버는 단일 장애 지점이다." kube-apiserver는 여러 인스턴스를 로드 밸런싱과 함께 배포하여 수평 확장이 가능하도록 설계되었습니다.
"모든 쿠버네티스 클러스터는 kube-proxy를 실행해야 한다." 네트워크 플러그인이 자체 서비스 프록시를 구현할 수 있으므로, 이러한 경우 kube-proxy는 선택 사항입니다.
"파드에는 항상 하나의 컨테이너만 포함되어야 한다." 파드는 네트워킹과 스토리지를 공유하는 여러 개의 밀접하게 결합된 컨테이너(예: 웹 서버와 로깅 컨테이너)를 포함할 수 있습니다.
"etcd 데이터는 클러스터 운영에 중요하지 않다." etcd는 모든 클러스터 데이터의 백업 저장소이므로, 반드시 백업 계획이 있어야 합니다.

이 지식을 활용하는 방법

쿠버네티스 아키텍처를 효과적으로 활용하려면 다음을 따르세요.

  1. 초보자라면 관리형 쿠버네티스부터 시작하세요. GKE, EKS, AKS 같은 서비스는 컨트롤 플레인 관리를 추상화하여 애플리케이션에 집중할 수 있게 해줍니다.
  2. 핵심 리소스의 YAML 매니페스트 읽는 법을 배우세요. 파드, 디플로이먼트, 서비스, 컨피그맵(ConfigMap)은 매일 사용할 기본 구성 요소입니다.
  3. kubectl의 describe와 logs 명령을 사용하여 문제를 해결하세요. 구성 요소 간 통신 방식을 이해하면 문제를 더 빨리 진단할 수 있습니다.
  4. 디플로이먼트 매니페스트에 항상 리소스 요청과 제한을 지정하세요. 이렇게 하면 스케줄러가 최적의 배치 결정을 내리고 리소스 부족을 방지할 수 있습니다.
  5. 네트워크 정책을 탐색하여 기본 아키텍처를 이해한 후 파드 간 통신을 보호하세요.

자주 묻는 질문

디플로이먼트와 서비스의 차이점은 무엇인가요? 디플로이먼트는 파드 복제본의 수명 주기를 관리합니다. 지정된 수의 동일한 파드가 실행 중인지 확인하고 업데이트와 롤백을 처리합니다. 서비스는 언제든지 교체될 수 있는 임시적인 파드에 접근할 수 있는 안정적인 네트워크 엔드포인트를 제공합니다.

쿠버네티스에 etcd가 필요한 이유는 무엇인가요? etcd는 쿠버네티스의 기본 데이터 저장소 역할을 하며, 실행 중인 파드, 존재하는 서비스, 구성 데이터 등 모든 클러스터 상태 정보를 일관되고 내구성 있게 저장합니다. etcd가 없으면 클러스터는 원하는 상태와 실제 상태에 대한 "진실의 원천"이 없습니다.

워커 노드가 다운되면 어떻게 되나요? 노드 컨트롤러가 노드 사용 불가를 감지합니다(일반적으로 제한 시간 이후). 그런 다음 스케줄러가 실패한 노드에서 실행 중이던 모든 파드를 다른 정상 노드에 다시 예약하여 원하는 복제본 수를 유지합니다.

서비스는 어떻게 파드로 트래픽을 라우팅하나요? 서비스는 레이블 선택기와 일치하는 파드의 IP 주소인 엔드포인트 집합을 유지 관리합니다. 각 노드의 kube-proxy는 서비스의 가상 IP로 향하는 트래픽을 이러한 엔드포인트로 리디렉션하는 네트워크 규칙(iptables 또는 IPVS)을 프로그래밍하여 파드 간 로드 밸런싱을 제공합니다.

잡(Job)과 크론잡(CronJob)의 차이점은 무엇인가요? 잡은 하나 이상의 파드를 생성하고 성공적으로 종료되도록 보장합니다. 데이터베이스 백업 실행과 같은 일회성 작업에 사용됩니다. 크론잡은 반복 일정에 따라 잡을 생성하며, 일일 로그 정리와 같은 정기적인 유지 관리 작업에 유용합니다.

출처

  • 쿠버네티스 공식 문서 – 클러스터 아키텍처
  • SLAC 국립 가속기 연구소 쿠버네티스 교육 문서
  • KodeKloud 쿠버네티스 소개 노트
  • LabEx 쿠버네티스 튜토리얼 및 가이드
  • 쿠버네티스 종합 가이드 (GitHub)

— Editorial Team

Advertisement 728x90

다음 읽기