[TIL] 241126 PriorityQueue, Kubernetes 알아보기, Docker

MONA·2024년 11월 26일

나혼공

목록 보기
35/92

오늘도 코드카타...

프로그래머스-명예의 전당

PriorityQueue

Java의 큐 자료구조. 요소들이 우선순위에 따라 정렬된 상태로 유지됨
우선순위가 높은 요소가 큐에서 가장 먼저 제거되며 기본적으로는 Natural Order 또는 Comparator에 의해 결정됨

특징

  1. 정렬 상태 유지
    • 요소들이 우선순위에 따라 자동 정렬됨
    • 기본 정렬은 오름차순(작은 값 우선)
  2. Heap 기반 구현
    • 내부적으로 최소 힙(Min-Heap) 또는 사용자 정의 힙으로 동작
    • 삽입/삭제 연산 시간 복잡도: O(log n)
  3. 중복 허용
    • 동일한 값 요소를 중복 저장 가능
  4. 정렬은 힙 특성에 의해 유지됨
    • 전체 요소를 정렬하는 것은 아니고 우선순위가 가장 높은 요소를 빠르게 반환할 수 있을 정도의 정렬 상태를 유지함

생성자

  1. 기본 생성자
    • 기본 오름차순 정렬(자연순서)을 사용
    PriorityQueue<Integer> pq = new PriorityQueue<>();
  2. 초기 용량 지정
    • 내부 힙의 초기 크기를 지정함
    PriorityQueue<Integer> pq = new PriorityQueue<>(20);    
  3. Comparator 사용
    • 사용자 정의 비교 기준을 지정함(Ex: 내림차순)
    PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a); // 내림차순

주요 메서드

메서드설명
add(E e)큐에 요소를 추가. 공간이 부족하면 예외를 발생시킴
offer(E e)큐에 요소를 추가. 공간이 부족하면 false를 반환
poll()큐의 우선순위가 가장 높은 요소를 제거하고 반환. 큐가 비어 있으면 null 반환
peek()큐의 우선순위가 가장 높은 요소를 반환(제거x).큐가 비어 있으면 null 반환
remove(Object o)지정된 객체를 큐에서 제거
contains(Object o)지정된 객체가 큐에 포함되어 있는지 확인
size()큐에 저장된 요소의 개수를 반환
isEmpty()큐가 비어 있는지 여부를 반환
clear()큐의 모든 요소를 제거
toArray()큐의 모든 요소를 배열로 반환
iterator()큐의 요소를 순회할 수 있는 Iterator를 반환

장단점

장점
1. 항상 우선순위가 높은 요소를 빠르게 반환할 수 있음
2. 동적 정렬 상태 유지
3. 메모리 효율이 높고 O(log n) 복잡도를 보장함

단점
1. 전체 요소를 정렬한 상태로 유지하진 않는다
2. 특정 인덱스의 요소에 직접 접근, 업데이트가 어렵다
3. k번째로 작은 요소를 찾으려면 여러번 poll해야 함

사용

  1. 상위 k개 요소 추적: 상위 점수를 유지하거나 추적할 때
  2. 다익스트라 알고리즘: 최단경로 계산에서 가장 우선순위가 높은 노드를 처리할 때
  3. 이벤트 관리: 우선순위에 따라 작업을 처리해야 하는 스케줄링 문제

Kubernetes, K8s

컨테이너화된 애플리케이션의 배포, 확장, 관리 자동화를 위한 오픈소스 플랫폼
Docker 등의 컨테이너 기술을 기반으로 하며 클러스터 환경에서 애플리케이션의 상태를 모니터링하고 안정적으로 실행되도록 관리함

주요 기능

  1. 컨테이너 오케스트레이션
    • 컨테이너 기반 애플리케이션의 배포, 확장, 로드 밸런싱, 복구 등을 자동화
  2. 자동화된 배포 및 복구
    • 애플리케이션의 업데이트 및 롤백을 자동으로 처리
    • 컨테이너가 비정상적으로 종료되면 자동으로 다시 시작
  3. 확장성
    • 트래픽 증가에 따라 애플리케이션을 자동으로 확장함(Auto-scaling)
  4. 서비스 디스커버리와 로드 밸런싱
    • 클러스터 내 서비스 간 통신을 지원하며 클라이언트 요청에 따라 여러 컨테이너에 분산
  5. 구성 관리 및 보안
    • ConfigMap, Secrets를 통해 애플리케이션의 환경설정과 민감한 정보를 안전하게 관리함
  6. 리소스 최적화
    • 클러스터의 CPU, 메모리 등 자원을 효율적으로 사용하도록 컨테이너를 배치

주요 구성 요소

  1. 마스터 노드 (Control Palne): 클러스터를 관리하는 주요 컴포넌트
    • API Server: 클라이언트와 통신하여 클러스터의 모든 작업을 조정
    • Scheduler: 컨테이너를 실행할 적합한 노드를 선택
    • Controller Manager: 클러스터의 상태를 모니터링하고 원하는 상태를 유지
    • etcd: 클러스터의 상태 정보를 저장하는 분산 키-값 데이터 저장소
  2. 워커 노드(Worker Node): 애플리케이션이 실행되는 노드
    • Kubelet: 각 노드에서 실행되며 컨테이너의 상태를 관리
    • Kube Proxy: 네트워크 통신을 지원하며 서비스 디스커버리를 처리
    • Container Runtime: 컨테이너 실행 환경(Docker, containerd etc)
  3. Pod
    • 쿠버네티스에서 컨테이너가 실행되는 가장 작은 단위. 하나 이상의 컨테이너를 포함함
    • 하나의 Pod 안에 여러 컨테이너를 실행할 수 있으며, 동일한 네트워크와 스토리지를 공유
  4. Service
    • Pod의 네트워크 접근을 지원하고, 로드 밸런싱을 수행
  5. Deployment
    • 애플리케이션의 배포를 정의하는 상위 객체. 애플리케이션의 업데이트와 복구를 관리함
  6. ConfigMap & Secret
    • 애플리케이션의 환경설정(ConfigMap)과 민감정보(Secret)를 분리하여 관리
  7. Cluster
    • 여러 노드로 구성된 쿠버네티스의 집합
  8. Namespace
    • 클러스터 내에서 리소스를 논리적으로 구분하는 단위

장단점

장점
1. 확장성: 증가하는 트래픽에 따라 컨테이너를 자동으로 확장
2. 높은 가용성: Pod가 중단되거나 장애가 발생하면 자동으로 복구
3. 리소스 최적화: 클러스터의 CPU, 메모리 등의 리소스를 효율적으로 사용
4. 플랫폼 독립성: 클라우드 서비스(AWS, GCP, Azure) 또는 온프레미스 환경에서도 동일한 방식으로 동작

단점
1. 러닝 커브
2. 운영 부담
3. 리소스 요구량: 쿠버네티스 자체가 많은 리스소를 소비할 수 있음
4. 디버깅이 어려움

쿠버네티스와 도커

특징쿠버네티스도커
목적컨테이너 배포, 확장, 관리컨테이너 생성, 실행
사용 범위대규모 분산 시스템 관리단일 컨테이너 관리
주요 역할클러스터 오케스트레이션컨테이너 런타임 제공

Kubernetes와 Spring Cloud

공통점

  • 확장성: MSA의 확장성 지원
  • 관리성: 서비스 배포, 관리, 확장 등을 쉽게 할 수 있도록 도움
  • 고가용성: 서비스 가용성을 높이고, 장애 발생 시 자동 복구 지원
항목쿠버네티스(Kubernetes)Spring Cloud
주요 목적컨테이너 기반 애플리케이션의 배포, 스케일링, 관리 자동화마이크로서비스 간 통신, 구성 관리, 장애 복구 등 애플리케이션 기능 지원
주요 초점인프라 관리: 컨테이너, 네트워크, 리소스 최적화애플리케이션 레벨: 마이크로서비스 간의 기능 구현
기반 기술컨테이너 기술(Docker 등)Spring Framework 기반
로드 밸런싱네트워크 레벨에서 서비스 간의 트래픽 분산(ClusterIP, NodePort, LoadBalancer)Spring Cloud LoadBalancer를 사용한 애플리케이션 레벨 로드 밸런싱
구성 관리ConfigMap과 Secrets로 환경 변수 및 민감한 데이터 관리Spring Cloud Config로 외부화된 설정 관리
서비스 디스커버리Kubernetes의 DNS 기반 서비스 디스커버리 제공Eureka, Consul, Zookeeper 같은 서비스 디스커버리 도구와 통합
자동 복구Pod의 상태를 모니터링하고 실패 시 재시작(Health Check)Hystrix 등으로 장애 발생 시 폴백(fallback) 처리
확장성Horizontal Pod Autoscaler(HPA)를 통해 트래픽에 따른 컨테이너 자동 확장Spring Cloud Gateway를 통한 확장 및 애플리케이션 레벨의 확장 지원
배포 관리롤링 업데이트와 Canary 배포 지원Spring Cloud의 CI/CD 도구와 통합 가능(Jenkins, Spinnaker 등)
사용자 정의 로직컨테이너화된 애플리케이션에 대한 관리만 수행애플리케이션 비즈니스 로직 구현에 초점
운영 환경 요구 사항클러스터를 운영하기 위한 추가적인 관리 도구와 자원 필요클러스터 없이도 애플리케이션만으로 실행 가능

어떤 상황에 적합할까?

Kubernetes를 사용해야 하는 경우
1. 컨테이너 중심 애플리케이션 운영
2. 여러 서비스의 배포, 스케일링, 복구를 자동화해야 할 경우
3. 멀티클라우스 또는 온프레미스 환경에서 일관성 있는 배포를 해야하는 경우
4. 리소스 사용 최적화와 자동화된 배포 관리가 중요한 경우

Spring Cloud를 사용해야 하는 경우
1. MSA 구현
2. 서비스 간 통신, 구성 관리, 장애 복구 등 애플리케이션 레벨 기능이 필요한 경우
3. 컨테이너 환경이 아닌 전통적 VM 또는 독립 실행 환경에서도 동작해야 하는 경우
4. Spring Boot 기반의 애플리케이션을 개발 중이며 Spring 생태계를 활용하고자 하는 경우

Kubernetes와 Spring Cloud 통합

둘은 상호보완적으로 사용됨
쿠버네티스는 인프라, Spring Cloud는 애플리케이션의 마이크로서비스 기능을 구현하는 역할

예시
*Spring Boot 애플리케이션을 Kubernetes에서 배포

  • Spring Cloud Eureka로 서비스 디스커버리 구현
  • Spring Cloud Config로 외부화된 설정 관리
  • Kubernetes로 컨테이너 배포 및 확장 관리

Kubernetes에서 Spring Cloud Gateway 사용

  • Spring Cloud Gateway를 통해 API Gateway 구현
  • Kubernetes의 Horizontal Pod Autoscaler로 Gateway 자동 확장

이런식?


Docker

애플리케이션을 컨테이너로 패키징, 배포, 실행하는 플랫폼
컨테이너: 애플리케이션과 그 실행환경(라이브러리, 설정파일 등)을 격리된 상태에서 실행할 수 있도록 하고, 일관된 실행 환경을 제공

주요 개념

  1. Image
    • 애플리케이션과 그 실행환경을 포함하는 불변 파일 시스템 스냅샷
    • 컨테이너 생성의 기반, 실행 가능한 상태를 정의
  2. Container
    • 이미지를 기반으로 실행되는 격리된 애플리케이션 환경
    • 애플리케이션과 종속성을 가상화하여 어디서나 동일하게 실행 가능
    • 하나의 시스템에서 여러 개의 컨테이너를 독립적으로 실행할 수 있음
  3. Dockerfile
    • 이미지를 생성하기 위한 설정 파일
    • 명령어로 애플리케이션 실행 환경(종속성, 설치, 복사, 실행 등)을 정의
    • 이미지 생성 과정을 자동화하고 일관되게 만들 수 있음
  4. Docker Hub
    • Docker 이미지를 저장하고 공유하는 공식 레지스트리
    • 사전에 빌드된 이미지를 검색, 사용할 수 있음
  5. Volume
    • 컨테이너와 호스트 간의 데이터를 공유하기 위한 저장소
    • 데이터를 컨테이너 삭제와 무관하게 보존
      -> 데이터를 컨테이너와 독립적으로 관리할 수 있다
  6. Network
    • 여러 컨테이너 간 통신을 지원
    • 브리지, 호스트, 오버레이 등의 네트워크 모드 제공
    • Bridge Network
      • 기본적으로 Docker가 컨테이너를 실행할 때 사용하는 네트워크
      • 동일한 브리지 네트워크에 연결된 컨테이너들은 서로 통신할 수 있음
      • 외부 네트워크와는 NAT를 통해 통신
      • 단일 호스트에서 여러 컨테이너를 연결할 때 사용됨
      • 명시하지 않으면 기본적으로 실행되는 방법

특징

  1. 경량화: VM과 달리 OS를 포함하지 않아 빠르고 가벼움
  2. 이식성: 애플리케이션과 실행 환경을 포함하여서 개발환경=운영환경을 보장함
  3. 확장성: MSA에서 여러 컨테이너를 쉽게 관리, 확장 가능
  4. 자동화: Dockerfile과 CI/CD 도구를 활용해 빌드, 배포, 테스트를 자동화
  5. 컨테이너화: 애플리케이션과 필요한 모든 것을 하나의 패키지로 묶어 어디서든 같은 환경에서 실행할 수 있음

구성요소

  1. Docker Daemon
  • Docker의 백그라운드 프로세스. 이미지 빌드, 컨테이너 실행 등을 관리
  1. Docker CLI
  • 사용자와 Docker Deamon 간의 인터페이스
  • docker run, docker build, docker ps 등 다양한 명령어 지원
  1. Docker Registry
  • 이미지를 저장하고 관리하는 저장소
  • Docker Hub, Amazon ECR, Google Container Registry etc
  1. Container Runtime
  • 컨테이너를 실행하는 런타임
  • Docker는 기본적으로 containerd를 사용

주요 명령어

명령어설명
docker run컨테이너 실행
docker ps실행 중인 컨테이너 목록 조회
docker buildDockerfile을 기반으로 이미지 생성
docker pullDocker Hub에서 이미지 다운로드
docker push이미지를 Docker Hub에 업로드
docker stop컨테이너 중지
docker rm컨테이너 삭제
docker rmi이미지 삭제
docker logs컨테이너 로그 확인
docker exec실행 중인 컨테이너에서 명령 실행

동작 원리

  1. 이미지 생성
  • Dockerfile 생성 후 docker build 명령어로 이미지 생성
  1. 컨테이너 실행
  • 이미지를 기반으로 컨테이너 실행
  1. 컨테이너 관리
  • 실행중인 컨테이너를 관리할 수 있음(start, stop, run 등)

장단점

장점
1. 일관된 실행 환경 보장
2. 효율적인 자원 사용: VM에 비해 경량화되어 빠르고 자원 소모가 적음
3. 이식성: 로컬, 테스트, 운영 환경 간 동일한 컨테이너 사용 가능
4. 빠른 배포: 애플리케이션을 컨테이너로 패키징하여 빠르게 배포 가능
5. 확장성: MSA와 클라우드 환경에서 확장 용이

단점
1. 러닝 커브
2. 운영 복잡성: 컨테이너 수가 많아질수록 관리, 모니터링이 어려워질 수 있음
3. 보안 문제: 컨테이너 격리가 완벽하지 않아 보안 우려가 있을 수 있음. 한 컨테이너에서 보안 문제 발생 시 커널을 공유하는 다른 컨테이너에도 영향을 줄 수 있음
4. 운영 체제 종속성: Docker는 리눅스 커널을 사용하여 동작해 리눅스에서 가장 잘 동작함.

VM

소프트웨어로 구현된 컴퓨터 시스템
물리적 하드웨어와 독립적으로 동작함
물리적 하드웨어를 추상화하여 다수의 운영 체제와 애플리케이션이 동일한 물리적 시스템에서 동작할 수 있도록 함

특징

  1. 완전한 OS 환경
    • 독립적인 게스트 운영 체제(Windows, Linux etc)를 실행할 수 있으며, 물리적 머신과 거의 동일하게 동작
  2. 하드웨어 가상화
    • 하이퍼바이저를 사용해 물리적 리소스(CPU, 메모리, 디스크 등)를 가상 리소스로 분리
  3. 격리성
    • VM 간의 완벽한 격리를 제공하여 다른 VM이나 호스트 시스템에 영향을 주지 않음
  4. 유연성
    • 단일 물리 서버에서 여러 운영 체제를 실행 가능. 테스트, 개발, 서버 통합 등에 이용할 수 있음

주요 구성 요소

  1. 호스트 머신 (Host Machine): VM을 실행하는 물리적 컴퓨터
  2. 하이퍼바이저 (Hypervisor): 물리적 리소스를 가상화하여 여러 VM이 이를 공유하도록 관리
  • Type 1 하이퍼바이저: 물리적 하드웨어에서 직접 실행 (예: VMware ESXi, Microsoft Hyper-V)
  • Type 2 하이퍼바이저: 호스트 OS 위에서 실행 (예: VMware Workstation, VirtualBox)
  1. 게스트 OS (Guest Operating System): VM 내부에서 실행되는 운영 체제
  2. 가상 디스크 (Virtual Disk): VM의 데이터 저장소로 사용되는 파일 기반 디스크 이미지
  3. 가상 네트워크 (Virtual Network): VM 간 또는 호스트와의 통신을 위한 네트워크

주요 기능

  1. 멀티 OS 실행
  2. 리소스 분리
  3. 스냅샷: VM의 상태를 특정 시점에 저장하여 복구 가능
  4. 이식성: VM 이미지를 다른 물리적 서버로 이동 가능
  5. 격리성: VM 간 및 호스트 시스템 간의 강력한 보안과 격리 제공

장단점

장점
1. 리소스 효율성: 단일 물리적 하드웨어에서 여러 VM 실행으로 자원을 효율적으로 활용
2. 테스트 및 개발
3. 보안 격리: VM 간 격리로 한 VM의 문제가 다른 VM이나 호스트에 영향을 미치지 않음
4. 이식성: VM 이미지를 타 호스트 시스템으로 쉽게 전송하고 실행할 수 있음
5. 유연성: 하드웨어 제약 없이 다양한 운영 체제와 환경에서 애플리케이션 실행

단점
1. 오버헤드: 하이퍼바이저와 게스트 OS가 리소스를 추가적으로 사용해 성능이 다소 저하됨
2. 복잡성: 하이퍼바이저와 VM 관리를 위한 추가적인 설정 및 관리 필요
3. 속도: 컨테이너 기술(Docker 등)에 비해 비교적 부팅 및 실행 속도가 느림
4. 리소스 소모: 게스트 OS 실행으로 인해 메모리와 디스크 사용량이 큼

Docker와 VM

항목DockerVM
구조애플리케이션 + 라이브러리/종속성 공유 커널애플리케이션 + OS
크기경량 (MB 단위)무거움 (GB 단위)
성능OS 없이 실행되므로 빠름게스트 OS가 추가되어 성능 저하 가능
부팅 시간밀리초 단위로 빠름수 초에서 수 분
자원 사용량OS를 공유하므로 적음게스트 OS가 자원을 소비
격리 수준프로세스 수준의 격리완전한 OS 수준의 격리
profile
고민고민고민

0개의 댓글