Kubernetes - 컨테이너 오케스트레이션

업데이트:


Kubernetes

쿠버네티스 시작하기

개발 환경에서 당연하게 사용해왔던 쿠버네티스에 대해 이해하고, 왜 쿠버네티스를 사용하는지 알아보자.

개요

  • 컨테이너 오케스트레이션의 개념과 사용하는 이유 그리고 특징에 대해 이해한다.

소개

  • 쿠버네티스는 컨테이너 오케스트레이션 툴의 한 종류이며 엄청난 인기로 사실상 표준으로 사용된다.
  • 컨테이너 오케스트레이션은 복잡한 컨테이너 환경을 효과적으로 관리하기 위한 도구이다.

배경

  • 서버의 상태를 편하게 관리하기 위한 노력으로 도커 컨테이너가 등장했다.
  • 그러나 관리하는 서버 컨테이너 수가 점점 증가하며 관리가 힘들다는 문제가 생겼다.
  • 그래서 등장한 것이 컨테이너 오케스트레이션이다.

컨테이너의 특징

  • 가상머신과 비교하여 컨테이너 생성이 쉽고 효율적
  • 컨테이너 이미지를 이용한 배포와 롤백이 간단
  • 언어나 프레임워크에 상관없이 애플리케이션을 동일한 방식으로 관리
  • 개발, 테스팅, 운영 환경을 물론 로컬 피시와 클라우드까지 동일한 환경을 구축
  • 특정 클라우드 벤더에 종속적이지 않음

컨테이너 오케스트레이션

컨테이너 오케스트레이션을 사용하지 않는다면

  • 배포(Deployment)

    image

    • 각 서버의 ip를 찾고 각 서버에 ssh로 접속해서 docker 명령어로 컨테이너를 실행 및 종료하는 수고가 든다.
    • 만약 새로운 컨테이너를 실행하려면 빈 서버(여유있는)에 실행 하는것이 리소스 절약을 위해 좋으나, 이를 확인하기 위한 모니터링 툴이 없으면 빈 서버를 일일히 찾기도 힘들다.
    • 서버를 배포할 때(version upgrade 또는 rollback) 모든 서버를 한번에 배포하는 방법이 필요하다.
  • 서비스 검색(Service Discovery)

    image

    • 보통의 구조라면 프록시 서버가 있고 로드밸런서를 통해 서버에 적절히 부하를 분산한다.
    • 그러나 로드밸런서와 서버의 ip 설정과 같은 부분이 관리자가 직접 관리해야하는 포인트였다.
    • 마이크로서비스 환경이 유행처럼 등장하며 서버가 점점 많아지고 서버의 ip가 업데이트로 변경되고 하면서 관리자가 이를 모두 관리하는 것은 쉽지 않았다.
  • 서비스 노출(Gateway)

    image

    • NginX와 같이 외부에 노출된 프록시 서버를 두고, 프록시 서버로 들어오는 host 요청에 따라 내부 컨테이너(서버)에 연결하는데 이 과정에 자동화가 필요했다.
  • 서비스 이상과 부하 모니터링

    image

    • 갑자기 컨테이너가 죽은 경우에 이전에는 일일히 로그 확인해서 다시 서버를 띄워야 했다.
      • 같은 서버 컨테이너가 3개 돌다가 하나의 컨테이너가 죽으면 남은 2개의 서버에 부하가 생긴다.
    • 서버가 죽지는 않았는데 트래픽이 많아지면 부하가 걸려 느려졌다.
      • 트래픽에 따라 적절하게 서버를 늘려야 함
    • 위와 같은 상황으로 자동화가 필요했다.

컨테이너 오케스트레이션

  • 위와같은 문제로 많은 컨테이너를 효율적으로 관리하기 위한 기술이 컨테이너 오케스트레이션이다.
  • 컨테이너 오케스트레이션 복잡한 컨테이너 환경을 효과적으로 관리하기 위한 도구이다.

컨테이너 오케스트레이션 특징

  • 클러스터(Cluster)

    image

    • 중앙 제어
      • 이전에는 서로 다른 노드의 CPU와 RAM 상태를 각각 관리했었다.
      • 그러나 노드 수가 증가하면 힘들기 때문에, 컨테이너 오케스트레이션에서는 합쳐서 추상화하여 클러스트 단위로 관리한다.
      • 클러스터 하나하나의 노드에 ssh로 직접 접속하기 힘들기때문에 프록시처럼 앞에 마스터 서버를 두고 마스터서버가 각 노드에 알아서 명령을 보낸다.
    • 네트워킹
      • 클러스터 내 노드끼리는 서로 통신이 잘되어야 한다.
    • 노드 스케일
      • 노드 스케일이 커지더라도 잘 돌아가기 위해서는 정교한 설계가 필요하다.
  • 상태 관리(State)

    image

    • 트래픽이 증가해 서버를 새로 늘리거나, 하나의 서버에 장애가 발생했을 때 감지하고 자동으로 서버를 늘려준다.
    • 오토 스케일링
  • 배포 관리(Scheduling)

    image

    • 자원이 여유가 있는 서버에 알아서 적절하게 띄워준다.
  • 배포 버전관리(Rollout & Rollback)

    image

    • 전체 컨테이너에 대한 롤아웃과 롤백을 중앙에서 관리한다.
  • 서비스 등록 및 조회(Service Discovery)

    image

    • 새로 등록된 서비스 ip나 변경된 ip를 자동으로 관리해줘서 관리자가 하나하나 수정할필요가 없다.
  • 볼륨 스토리지(Volume)

    image

    • 각 서버에 필요한 스토리지(AWS EBS, GCE 등)를 설정으로 연결할 수 있다.
    • AWS에서 EC2에 스토리지 일일히 하나하나 붙이고 그럴 필요가 없다는 말이다.

왜 쿠버네티스인가

  • 컨테이너 관리도구가 많이 생기고 했으나, 쿠버네티스가 표준처럼 등장했다.
  • 오픈소스
    • 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 오픈소스 플랫폼
    • 구글에서 만듦 (구글은 1주일에 20억개 컨테이너 생성한다.)
  • 엄청난 인기
    • 점유율이 높고 그렇기에 라이브러리 또는 레퍼런스가 많다.
  • 무한한 확장성
    • 쿠버네티스 위에서 머신러닝, CI/CD, 서비스. 서버리스 등 다양한 서비스가 동작
    • 쿠버네티스만 설치되어 있으면 거기에 서비스를 올리기 쉬움
  • 사실상 표준(de facto)
    • 많은 오케스트레이션이 있지만 사실상 표준이 되어가고 있음
    • 도커도 자체 오케스트레이션이 있지만 쿠버네티스의 인기로 인해 어쩔수없이 쿠버네티스 지원
    • AWS(Elastic Kubernetes Service), Azure(Azure Kubernetes Service), Google(Google Kubernetes Engine)와 같이 대표적인 클라우드 기업들이 쿠버네티스를 매니지드 서비스로 제공하고 있음

앞으로 학습 계획

  • 만들어진 이미지를 배포하고 그걸 쿠버네티스 상에서 동작 시키고 스케일 아웃까지 학습
  • 구성요소를 이해하고, 동작원리를 파악하고 기본적인 사용법을 익히는 것을 목표로 함
  • 도커 컨테이너 실행하기
    • 도커와 도커 컴포즈를 이용한 멀티 컨테이너 관리
  • 쿠버네티스에 컨테이너 배포하기
    • 실습 환경 만들기
    • kubectl 사용법
    • pod, deployment, service 등
    • 기본 리소스 학습
  • 외부 접속 설정하기
    • Cluster IP, NodeProt, LoadBalancer, Ingress
    • 서비스 타입 학습
    • 서비스 디스커버리 학습
  • 스케일 아웃하기
    • 부하에 따른 컨테이너 개수 조정
    • 최소 리소스 요청 설정
    • 오토 스케일링
  • 그외 고급 기능 소개
    • HELM 패키지 매니저 소게
    • GitOps, ServiceMesh 소개
  • 제외
    • 다양한 환경별 특징 - bare metal, EKS
    • 쿠버네티스 패턴 - 사이드 카, 어댑터 패턴
    • 관련 생태계 - 서비스 메시, 서버리스

Reference

댓글남기기