K8s

K8s 소개

Tech Crunchy 2025. 4. 20. 16:56
728x90

개요

리눅스는 프로세스별로 자원을 격리해서 사용하는 cgroup과 특정 디렉터리 권한을 제한하는 chroot 등으로 격리 환경을 구성할 수 있습니다. 이러한 리눅스 구성에 디스크 파일 변경 사항을 레이어 형태로 저장하는 파일시스템을 결합한 개념이 바로 컨테이너입니다.

 

가상 머신과 컨테이너 차이

가상 머신과 컨테이너를 비교했을 때, 컨테이너가 구조상 레이어가 더 간단하므로 성능을 높이기 쉽습니다.

 

컨테이너 생성 과정

컨테이너는 Client, Docker Host, Registry 간 상호작용을 통해 생성됩니다.

아래 이미지는 Docker 기준으로 컨테이너 생성 과정을 설명합니다.

  • Client: 개발자가 도커 명령어를 입력하는 인터페이스로 Docker Host에 명령 요청
  • Docker Host: 도커 데몬이 실행되는 시스템으로 컨테이너 생성, 실행 중지 등 작업 수행
  • Registry: 컨테이너 이미지를 저장하고 관리하는 저장소

 

컨테이너 오케스트레이션 시스템

컨테이너 오케스트레이션 시스템은 대규모 컨테이너 기반 애플리케이션을 효율적으로 관리하기 위해 제공되는 기술입니다.

컨테이너는 애플리케이션과 관련된 모든 실행 환경을 패키징하여 일관된 배포를 가능하게 하지만, 수백에서 수천 개의 컨테이너를 다루는 경우 복잡성이 급격히 증가합니다. 이를 해결하기 위해 오케스트레이션 시스템이 필요합니다. 주요 장점을 정리하면 아래와 같습니다.

  • 자동화된 관리: 컨테이너의 생성, 배포, 스케일링, 네트워킹, 삭제 등 라이프사이클 관리
  • 확장성: 서비스 중단 없이 트래픽 변화에 따라 컨테이너를 추가 또는 삭제하여 확장성 제공
  • 내결함성 및 복원력: 컨테이너 실패 또는 호스트 다운 시 자동 복구하여 가용성을 유지
  • 리소스 최적화: 효율적 자원 분배로 과도한 프로비저닝을 방지하고 비용을 절감
  • 보안 강화: 일관된 보안 정책, 자동 패치 배포, 권한 기반 접근 제어 등을 제공
  • 멀티클라우드 및 하이브리드 지원: 다양한 환경에서 컨테이너 관리를 제공

 

쿠버네티스

쿠버네티스(Kubernetes, K8s)는 배의 조타수라는 그리스 단어에서 유래했습니다. 구글 내부에서 사용하던 컨테이너 오케스트레이션 시스템 보그(Borg)를 오픈 소스 소프트웨어로 공개한 것이 바로 쿠버네티스입니다.

컨테이너화된 애플리케이션을 배포, 관리, 확장하는 데 필요한 대부분의 수동 프로세스를 자동화하는 오픈소스 컨테이너 오케스트레이션 플랫폼으로, 다수의 컨테이너를 가진 애플리케이션을 효율적으로 관리하고, 컨테이너를 여러 서버에 분산 배치하여 애플리케이션의 확장 및 안정성을 높여줍니다.

 

쿠버네티스 컴포넌트

쿠버네티스 클러스터는 마스터(또는 컨트롤 플레인)와 노드로 구성됩니다. 마스터는 노드와 클러스터 내 포드를 관리하고, 노드는 어플리케이션 구성 요소인 포드를 호스트합니다.

K8s Component (출처: K8s)

 

마스터

마스터(Master)는 클러스터의 중앙 제어 및 관리 역할을 담당합니다. 실제로 컨테이너를 실행하지 않고, 워커 노드에서 컨테이너가 잘 동작하도록 관리·감독합니다. 일반적으로 1~3대만 구성하며, 관리자만 접근 가능하도록 설정합니다.

  • kube-apiserver: 클러스터와 외부(관리자, kubectl 등) 및 내부 컴포넌트 간 통신을 담당하는 API 서버
  • etcd: 클러스터의 모든 상태 및 설정 정보를 저장하는 고가용성 키-값 저장소
  • kube-scheducler: 포드를 어떤 노드에 할당할지 결정
  • kube-controller-manager: 다양한 컨트롤러(ReplicaSet, Deployment 등)를 통합 관리
  • cloud-controller-manager: 클라우드 환경과 연동(노드 추가/삭제, 로드밸런서 연결 등)

 

노드

노드(Node)는 실제 어플리케이션 컨테이너(포드)가 실행되는 물리적 또는 가상 머신입니다. 다수의 서버, 실제 서비스가 구동되는 곳입니다.

노드 내 컴포넌트는 동작 중인 포드를 유지시키고 쿠버네티스 런타임 환경을 제공합니다. 모든 노드 상에서 동작합니다.

  • kubelet: 마스터와 통신하며, 노드에 할당된 파드의 생성·상태 관리, 명령 수행
  • kube-proxy: 각 노드에서 실행되는 네트워크 프록시로 서비스 개념의 구현.
  • container runtime: 실제 컨테이너(Docker, containerd 등)를 실행하는 소프트웨어

 

쿠버네티스의 선언적 API

쿠버네티스의 가장 대표적 설계 원칙은 선언적 API입니다. 쿠버네티스에서 설정을 선언하면 쿠버네티스는 지속적으로 컨테이너 상태를 확인하고, 설정한 상태가 아니라면 맞게 맞춥니다.

  • 원하는 상태 정의: YAML 또는 JSON 형식의 매니페스트 파일을 통해 애플리케이션 및 리소스의 desired state를 정의
  • 상태 유지 및 복구: Kubernetes는 컨트롤러와 스케줄러를 통해 클러스터의 실제 상태를 사용자가 정의한 상태와 일치하도록 지속적으로 조정
  • 간단한 관리: 세부적인 작업 단계를 명시할 필요 없이 최종 목표만 설정하면 됨
  • 버전 관리: 선언적 구성 파일은 Git과 같은 버전 관리 시스템에 저장될 수 있어 변경 내역을 추적하고 쉽게 롤백할 수 있음
  • 대규모 시스템 관리에 적합: 자동화된 배포, 스케일링, 롤백, 셀프 힐링 등 대규모 분산 시스템 관리에 필요한 기능을 지원
  • 이식성과 확장성: YAML 기반 데이터 형식은 특정 프로그래밍 언어나 SDK에 종속되지 않아 다양한 인프라와 쉽게 통합

 

참고문헌

 

728x90

'K8s' 카테고리의 다른 글

인그레스  (0) 2025.04.26
etcd  (0) 2025.04.25
kube-proxy  (0) 2025.04.20
서비스 (Service)  (0) 2025.04.20
컨트롤러 (Controller)  (0) 2025.03.31