Docker
쿠버네티스(Kubernetes)
차가운개발
2024. 12. 23. 20:58
쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 플랫폼이다.
Google에서 개발하고 CNCF에 기부된 프로젝트로 현대적인 클라우드 네이티브 애플리케이션을 운영하기 위한 표준으로 자리 잡았다
쿠버네티스의 목적
- 컨테이너 기반 애플리케이션을 자동으로 배포하고 관리
클러스터에 새 버전의 애플리케이션을 쉽게 배포, 버전 롤백 자동화 - 애플리케이션의 확장성 제공
트래픽 증가 시 컨테이너 수를 자동으로 늘리거나 감소 - 컨테이너의 상태를 지속적으로 모니터링하여 실패를 복구
장애가 발생한 컨테이너를 감지하고 자동으로 재시작, 교체 - 애플리케이션 및 인프라 상태 모니터링, 로깅, 이벤트 추적등 시스템 관찰
쿠버네티스의 아키텍처
Control Plane(컨트롤 플레인)
클러스터 전역 관리를 담당 애플리케이션을 원하는 상태로 유지하기 위한 두뇌 역할
구성 요소
- kube-apiserver
쿠버네티스의 프론트 엔드로 모든 명령과 질의가 이곳을 통해 이루어진다
kubectl CLI, 대시보드 혹은 자동화 툴이 API server로 요청을 보냄 - etcd
분산 키-값(key-value) 저장소로 클러스터의 모든 상태 정보를 보관(파드, 서비스, 설정 등)
고가용성을 위해 여러 노드에 분산배치 가능 - kube-scheduler
새로 생성된 파드를 어느 노드에 배치할지 결정(스케줄링)
노드의 CPU, 메모리, 네트워크 사용량 등 다양한 지표를 고려 - kube-controller-manager
쿠버네티스의 여러 컨트롤러를 통합 실행
클러스터 상태를 원하는 상태로 유지하기 위해 지속적으로 모니터링하고 조치
Worker Node(워커노드)
애플리케이션(컨테이너)을 실제로 실행하는 물리 또는 가상 머신
구성 요소
- kublet
노드에서 동작하는 에이전트, Control Plane과 통신하며 파드를 생성하고 관리
파드의 상태를 모니터링하고 필요 시 재시작등의 조치 수행 - kube-proxy
네트워크 프록시로 각 노드에서 파드 간 통신, 서비스 라우팅 등을 처리
쿠버네티스 Service 리소스를 구현하기 위해 사용 - 컨테이너 런타임
파드 내 컨테이너를 실제로 실행하는 소프트웨어(Docker)
쿠버네티스의 핵심 리소스
파드(Pod)
- 가장 작은 배포 단위
- 하나 이상의 컨테이너와 스터리지, 네트워크 등을 함께 묶어서 관리
- 일반적으로 파드는 단일 컨테이너가 1:1로 대응되지만, 보조 프로세스를 위해 여러 컨테이너를 함께 둘 수 있음
디플로이먼트(Deployment)
- 애플리케이션의 원하는 상태를 정의하는 개념
- ex 이미지를 가진 파드를 3개 실행하라 선언
- 쿠버네티스는 이를 보고 필요한 파드 수를 맞추거나 이미지 버전을 교체하며 롤링 업데이트 수행
레플리카셋(ReplicaSet)
- 디플로이먼트가 원하는 파드의 개수를 유지하기 위해 사용하는 리소스
- ex 디플로이먼트가 파드 5개를 요청하면 레플리카셋이 실제 파드를 5개 되도록 늘리거나 줄임
서비스(Service)
- 파드에 대한 네트워크 접근을 일관되고 안정적으로 제공하는 추상화 레이어
- 파드는 생성/삭제가 자주 일어나므로 IP가 변동되지만 Service는 고정 IP(Cluster IP) 혹은 DNS 이름을 통해 파드를 접근하도록 해줌
- 로드밸런싱 역할도 수행
인그레스(Ingress)
- 클러스터 외부에서 서비스에 접근하기 위한 규칙을 정의
- HTTP/HTTPS 경로 기반 라우팅, TLS 종단, 여러 도메인에 대한 라우팅 등을 설정
- Ingress Controller를 통해 구현함
컨피그맵 & 시크릿
- 컨피그맵 : 애플리케이션 환경설정, 설정 파일 등을 외부화하여 관리
- 시크릿 : 암호, 토큰, 인증서 등 민감한 정보를 암호화하여 안전하게 관리
볼륨 & 퍼시스턴트 볼륨
- 볼륨 : 파드 내 컨테이너들이 공유할 수 있는 디스크 영역
- 퍼시스턴스 볼륨 : 파드가 사라져도 데이터가 유지되는 영구 스터리지
- 퍼시스턴트 볼륨 클레임 : 파드가 필요한 스토리지를 요청하는 추상화
동작 방식 및 특징
선언적(Declarative) 구성
- 사용자는 어떻게가 아닌 무엇을 원하는지 선언적으로 작성(YAML 파일 등)
- 쿠버네티스는 이를 보고 클러스터 상태를 지속적으로 조정하여 원하는 상태에 맞춘다
셀프 힐링
- 파드가 비정상적으로 종료되면 자동으로 재시작, 노드 장애 시 다른 노드에 배포
- 장애 복구가 자동화되어 운영자가 직접 개입해야 하는 경우를 최소화
롤링업데이트
- 애플리케이션 버전을 새 컨테이너 이미지로 교체할 때, 순차적으로 파드를 교체
- 문제 발생 시 기존 버전으로 롤백 가능
오토스케일링
- Horizontal Pod Autoscaler(HPA)
CPU, 메모리 사용량 등을 기준으로 파드 수를 자동 조절 - Cluster Autoscaler
노드 리소스가 부족할 때 클러스터 노드를 자동으로 추가
장단점
장점
- 자동화와 확장성
컨테이너 배포 업데이트 스케일링이 자동화되어 운영 부담 경감 - 플랫폼 독립성
온프레미스, 클라우드, 하이브리드 등 모두 동일한 인터페이스로 관리 - 자체 복구로 가용성 향상
단점
- 초기 진입 장벽이 높음
- 과도한 복잡성을 초래할 수 있음
- 관리 오버헤드 : 종합적인 운영 시 추가 비용과 리소스 필요