개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 2. 쿠버네티스 소개

nineDeveloper 2020. 8. 18.
728x90

쿠버네티스 소개

쿠버네티스 시작

  • 오랜 세월 동안 구글은 보그(Borg)라는 내부 시스템을 개발
  • 애플리케이션 개발자와 시스템 관리자가 수천 개의 애플리케이션과 서비스를 관리하는 데 도움
  • 조직 규모가 클 때 엄청난 가치를 발휘
  • 수십만 대의 시스템을 가동할 때 사용률이 조금만 향상돼도 수백만 달러의 비용 절감 효과
  • 구글은 보그와 오메가를 15년 동안 비밀로 유지
  • 2014년 구글 시스템을 통해 얻은 경험을 바탕으로 한 오픈소스 시스템인 '쿠버네티스'를 출시

인프라의 추상화

  • 컨테이너 시스템에서 컨테이너 애플리케이션을 쉽게 배포, 관리하도록 돕는 소프트웨어 시스템
  • 기본 인프라를 추상화해 개발 및 운영 팀의 개발, 배포, 관리를 단순화
  • 모든 노드가 하나의 거대한 컴퓨터인 것처럼 수천개의 컴퓨터 노드에서 소프트웨어 애플리케이션을 실행

쿠버네티스의 장점

  • 애플리케이션 배포 단순화
    • 특정 베어메탈을 필요로 하는 경우(예: SSD/HDD)
  • 하드웨어 활용도 극대화
    • 클러스터의 주변에 자유롭게 이동하여 실행중인 다양한 애플리케이션 구성 요소를 클러스터 노드의 가용 리소스에 최대한 맞춰 서로섞고 매치
    • 노드의 하드웨어 리소스를 최상으로 활용
  • 상태 확인 및 자가 치유
    • 애플리케이션 구성 요소와 실행되는 노드를 모니터링 하고 노드 장애 발생시 다른 노드로 일정을 자동으로 재조정
    • 운영자는 정규 근무 시간에만 장애가 발생한 노드를 처리(일이 편해진다!)
  • 오토스케일링
    • 개별 애플리케이션의 부하를 지속적으로 모니터링할 필요 없이
    • 자동으로 리소스를 모니터링하고 각 애플리케이션에서 실행되는 인스턴스 수를 계속 조정하도록 지시 가능
  • 애플리케이션 개발 단순화
    • 버그 발견 및 수정 (완전히 개발환경과 같은 환경을 제공하기 때문)
    • 새로운 버전 출시 시 자동으로 테스트, 이상 발견 시 롤 아웃

개발자 돕기: 핵심 애플리케이션 기능에 집중

  • 애플리케이션 개발자가 특정 인프라 관련 서비스를 애플리케이션에 구현하지 않아도 됨
  • 쿠버네티스에 의존해 서비스 제공
    • 서비스 검색, 확장, 로드 밸런싱, 자가 치유, 리더 선출 등
  • 애플리케이션 개발자는 애플리케이션의 실제 기능을 구현하는 데 주력
  • 인프라와 인프라를 통합하는 방법을 파악하는데 시간을 낭비할 필요 없음

운영 팀 돕기: 이 효과적으로 리소스를 활용

  • 실행을 유지하고 서로 통신할 수 있도록 컴포넌트에 정보를 제공
  • 애플리케이션이 어떤 노드에서 실행되는 상관 없음(신경 쓰지 않아도 됨)
  • 언제든지 애플리케이션을 재배치 가능
  • 애플리케이션을 혼합하고 매칭시킴으로써 리소스를 매칭

쿠버네티스 클러스터 아키텍처

  • 쿠버네티스의 클러스터는 하드웨어 수준에서 많은 노드로 구성되며 두 가지 유형 나뉨
    • 마스터 노드: 전체 쿠버네티스 시스템을 관리하고 통제하는 쿠버네티스 컨트롤 플레인을 관장
    • 워커 노드: 실제 배포하고자 하는 애플리케이션의 실행을 담당

컨트롤 플레인

  • 컨트롤 플레인에서는 클러스터를 관리하는 기능
  • 단일 마스터 노드에서 실행하거나 여러 노드로 분할되고 복제돼 고가용성을 보장
  • 클러스터의 상태를 유지하고 제어하지만 애플리케이션을 실행하지 않음

컨트롤 플레인의 구성요소

  • 쿠버네티스 API 서버: 사용자, 컨트롤 플레인과 통신
  • 스케줄러: 애플리케이션 예약(애플리케이션의 배포 가능한 각 구성 요소에 워커 노드를 할당)
  • 컨트롤 매니저: 구성 요소 복제, 워커 노드 추적, 노드 장애 처리 등 클러스터 수준 기능을 실행
  • 데이터 스토리지: etcd는 클러스터 구성을 지속적으로 저장하는 안정적인 분산

노드

  • 워커 노드는 컨테이너화된 애플리케이션을 실행하는 시스템
  • 애플리케이션에 서비스를 실행, 모니터링, 제공하는 작업은 다음과 같은 구성요소로 수행
  • 컨테이너 런타임: 컨테이너를 실행하는 도커
  • Kubelet: API 서버와 통신하고 노드에서 컨테이너를 관리
  • 쿠버네티스 서비스(Kubernetes Service), 프록시(kube-proxy): 애플리케이션 간에 네트워크 트래픽을 분산 및 연결

쿠버네티스에서 애플리케이션 실행

  • 쿠버네티스에서 애플리케이션을 실행 전
    • 하나 이상의 컨테이너 이미지들을 패키지로 레지스트리에 푸시
    • 쿠버네티스 API 서버에 애플리케이션의 디스크립션을 게시
  • 디스크립션(YAML로 작성)
    • 컨테이너 이미지 또는 애플리케이션 컴포넌트가 들어 있는 이미지가 존재
    • 컴포넌트 간 관련성 및 노드 배치(동일 노드 또는 다른 노드) 정보 포함
    • 각 컴포넌트의 실행 복제본 수를 지정
    • 내부 클라이언트나 외부 클라이언트에 서비스를 제공하는 컴포넌트
    • 단일 IP 주소로 노출해 다른 컴포넌트에서 검색
728x90

댓글

💲 추천 글