Infrastructure/Kubernetes

[Basic] 쿠버네티스와 마이크로서비스

RoyOps 2024. 6. 9. 18:44

쿠버네티스와 마이크로서비스

마이크로서비스와 데브옵스

데브옵스의 실현과 마이크로서비스

  • 데브옵스(DevOps)는 실리콘밸로를 중심으로 유행하여 전세계에 퍼지고 있는 현재 IT 분야에서 가장 진보된 소프트웨어 개발 문화 또는 방법론이다.
  • 데브옵스는 개발 조직과 운영 조직이 물리적으로 격리되지 않는 환경에서 개발, 테스트, 배포, 운영에 이르는 전체 생명주기를 서로 긴밀하게 통합하여 관리한다.
  • 데브옵스를 실현하기 위한 수단으로서 필연적으로 마이크로서비스가 등장한다.
  • 마이크로서비스는 전통적인 거대한 덩치의 애플리케이션을 잘게 쪼개는 것을 의미한다.
  • 쪼개서 집중하면 많은 문제가 자연스럽게 해결되고, 새로운 기술의 도입이나 고가용성과 무중단에 대한 고민 및 장애가 발생하였을 때의 대처도 모두 수월해진다.

데브옵스 워크플로우

  • 소프트웨어의 개발(Development)과 운영(Operations)의 합성어로, 소프트웨어 개발자와 정보기술 전문가 간의 소통, 협업 및 통합을 강조하는 개발 환경이나 문화다.

데브옵스 도구

  • Devopedia 사이트에 접속하면 수많은 데브옵스 환경을 구축하기 위한 애플리케이션 목록을 확인할 수 있다.

마이크로서비스

정의

  • 소프트웨어 애플리케이션을 독립적으로 배치 가능한 서비스 조합(suite)으로 설계하는 방식이다.
  • 마이크로서비스 아키텍처는 아주 작은 단위로 동작하는 서비스가 구동되도록 시스템 및 소프트웨어의 구성과 구성요소 간의 관계를 정의한 아키텍처다.
  • 모든 요소를 하나의 애플리케이션에 구축하는 전통적인 모놀리식 접근 방식 대신 마이크로서비스에서는 모든 요소가 독립적이며 연동되어 동일한 태스크를 완수한다.
  • 하나의 애플리케이션을 구성함에 있어 분할된 다수의 서버 또는 컨테이너를 통해 애플리케이션 기능뿐만 아니라 데이터까지 분리하여 격리된 독립된 환경으로 구성된다는 특징이 있다.

특징

  • 애플리케이션 로직을 각자 책임이 명확한 작은 컴포넌트들로 분리하고 이들을 조합해서 하나의 솔루션을 제공한다.
  • 각 컴포넌트는 작은 책임 영역을 담당하고 완전히 상호 독립적으로 배포할 수 있다.
  • 마이크로서비스는 몇가지 기본 원칙에 기반을 두며, 서비스 소비자와 서비스 제공자 사이의 데이터 교환을 위해 HTTP와 JSON 같은 경량 통신 프로토콜을 사용한다.
  • 애플리케이션은 항상 기술 중립적 프로토콜을 사용해 통신하므로 서비스 구현 기술과는 무관하다.
  • 작고 독립적이며 분산된 마이크로서비스를 사용해 조직은 명확히 정의된 책임 영역을 담당하는 소규모 팀을 보유할 수 있다.

가상화 & 컨테이너

  • 전통적인 배포: 물리서버 기반에서 애플리케이션을 실행한다.
  • 가상화된 배포: 단일 물리 서버의 CPU에서 여러 가상 시스템(VM)을 실행한다.
  • 컨테이너 배포: VM과 유사하지만 격리 속성을 완화하여 애플리케이션 간에 운영체제(OS)를 공유한다.

컨테이너의 장점

  • 기민한 애플리케이션 생성과 배포: VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적이다.
  • 지속적인 개발 & 통합 및 배포: 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고, 이미지의 불변성덕에 빠르고 쉽게 롤백할 수 있다.
  • 개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리즈 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에, 애플리케이션 인프라스트럭처에서 디커플링된다.
  • 가시성은 OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 상태와 그 밖의 신호를 확인할 수 있다.
  • 개발 & 테스트 & 운영 환경에 걸친 일관성: 개발자의 PC에서도 클라우드에서와 동일하게 구동된다.
  • 클라우드 및 OS 배포판 간 이식성: Ubuntu, RHEL, CoreOS, on-prem, Google Kubernetes Engine 및 다른 어디에서든 구동된다.
  • 애플리케이션 중심 관리: 가상 하드웨어의 OS에서 애플리케이션을 구동하는 수준에서 OS의 논리적인 자원을 사용하여 애플리케이션을 구동하는 수준으로 추상화 수준이 높아진다.
  • 느슨하게 커플링, 분산되고 유연한 마이크로서비스: 애플리케이션은 단일 목적의 머신에서 모놀리시 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있다.
  • 자원 격리: 애플리케이션 성능을 예측할 수 있다.
  • 자원 사용량: 고효율이며 고집적이다.

컨테이너 오케스트레이션

  • 일반적으로 애플리케이션은 의도에 따라 애플리케이션이 실행되게 하기 위해 네트워킹 수준에서 정의가 필요한 개별적으로 컨테이너화된 구성 요소(주로 마이크로서비스)로 구성된다.
  • 컨테이너 배포 관리는 흔히 컨테이너 오케스트리이션을 통해서 이루어진다.
  • 컨테이너 오케스트레이션의 목적은 여러 컨테이너의 배포 프로세스를 최적화하는데 있다.
  • 애플리케이션은 더 이상 하나의 통일체가 아니라 특정 애플리케이션이 설계 의도대로 기능하도록 함께 작동해야 하는 수십 또는 수백 개의 느슨하게 결합되고 컨테이너화된 요소로 구성된다.
  • Apache Mesos, Google Kubernetes, Docker Swarm 등의 플랫폼들은 각자 컨테이너 관리를 위한 자체적인 특별한 방식을 보유하고 있다.
  • 컨테이너 오케스트레이션은 아래와 같은 기능이 있다.
    • 컨테이너형 애플리케이션의 배포
    • 컨테이너 그룹에 대한 로드밸런싱
    • 스케일링/오토스케일링
    • 컨테이너 장애 복구
    • 컨테이너 그룹간 격리/연결
    • 외부로 서비스 노출
    • 서비스 디스커버리
    • 로그 수집 집중화/자동화
    • 모니터링 집중화/자동화

Kubernetes

  • 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장 가능한 오픈소스 플랫폼이다.
  • 디플로이(Deploy), 자동화, 스케일링(Scaling), 컨테이너화된 애플리케이션의 관리를 위한 오픈소스 플랫폼이다.
  • 여러 클러스터의 호스트간 애플리케이션 컨테이너의 배치, 스케일링, 운영을 자동화하기 위한 플랫폼을 제공한다.
  • 쿠버네티스는 크고, 빠르게 성장하는 생태계를 가지고 있다.
  • 쿠버네티스란 명칭은 키잡이(helmsman)이나 파일럿을 뜻하는 그리스어에서 유래되었다.
  • 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화하였다.

Docker Swarm

  • 여러 개의 Docker 호스트를 함께 클러스터링하여 단일 가상 Docker 호스트를 생성한다.
  • 호스트 OS에 Agent만 설치하면 간단하게 작동하고 설정이 간단하다.
  • Docker 명령어와 Compose 명령어를 그대로 사용할 수 있다.

Apache Mesos

  • 수만 대의 물리적 시스템으로 확장할 수 있도록 설계되어 있다.
  • Hadoop, MPI, Hypertable, Spark와 같은 애플리케이션을 동적 클러스터 환경에서 리소스 공유와 분리를 통해 자원 최적화가 가능하다.
  • Docker 컨테이너를 적극적으로 지원한다.