Post

쿠버네티스

마이크로서비스 아키텍처(microservice architecture; MSA)

  • 응용 시스템 개발 및 구성을 위한 아키텍처 스타일의 하나
  • 이에 비교하여 전통적인 방식의 아티켙거를 모놀리식 아키텍처라고 부르기도 함
  • 애플리케이션이 서비스 모음으로 개발되어 각 마이크로 서비스는 특정한 기능을 수용하고 개별 작업을 처리

#쿠버네티스

  • 공식문서
  • k8s라고 표기하기도 한다.
  • 컨테이너 오케스트레이션 솔루션
    • 다수의 컨테이너들을 관리하면서 자동 배포, 배포된 컨테이너의 동작 보증, 부하에 따른 동적 확장 등의 기능을 담당
  • 도커와 잘 어울리는 실행 환경 구성 도구
    • 도커 컨테이너들을 클러스터 내에 실행하고 관리하는데 적합하다
    • 지속적 통합과 인도(CI/CD)에 유효하게 적용할 수 있다
    • 컨테이너는 포드라고 불리는 쿠버네티스 오브젝트와 연관하여 실행한다. (포드 위에서 실행한다고 표현)
  • 쿠버네티스는 절차적인 구조가 아닌 선언적인 구조를 가지고 있음
    • 각 요소가 추구하는 상태를 선언하면 현재 상태와 비교하고 지속적으로 맞추어가려고 함

#쿠버네티스 오브젝트들

■ 포드

  • 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위
  • 독립적인 공간과 사용 가능한 IP를 가지고 있음
  • 언제든지 죽을 수 있음

■ Namespace

  • 쿠버네티스 클러스터에서 사용되는 리소스들을 구분해 관리하는 그룹

■ Volume

  • 포드가 생성될 때 포드에서 사용할 수 있는 디렉토리를 제공

■ service

  • 유동적인 포드들에 대한 접속을 안정적으로 유지하도록 클러스터 내/외부에 연결하는 역할

■ 디플로이먼트 오브젝트

  • 기본 오브젝트들보다 효율적으로 작동할 수 있도록 조합하고 추가로 구현한 것
  • 레플리카셋(replicaset) 오브젝트를 합쳐 놓은 형태로 단순하게 생각할 수 있음

#쿠버네티스 클러스터

https://kubernetes.io/images/docs/components-of-kubernetes.svg

#쿠버네티스 클러스터 구성요소

클러스터는 하나 이상의 노드들로 구성됨

■ 마스터 노드 (컨트롤 플레인)

  • kubectl (반드시 마스터 노드에 있어야하는 것은 아님)
  • API 서버, ectd (클러스터의 중심 역할을 하는 구성 요소)
  • 컨트롤러 매니저, 스케줄러

■ 워커노드

  • 컨테이너 런타임(Container Runtime Interface;CRI) - 포드를 이루는 컨테이너의 실행을 담당
  • kubelet - 포드의 구성 내용을 받아 CRI에 전달하고 컨테이너들의 동작 상태를 모니터링

#쿠버네티스가 제공하는 기능

■ 컨테이너 밸런싱 (container balancing)

  • 포드 부하 균등화를 수행
  • 몇 개의 응용을 복제할 것인지를 알려주면 나머지는 쿠버네티스가 처리

■ 트래픽 로드 밸런싱 (traffic load balancing)

  • 응용의 복제본이 둘 이상 있다면 쿠버네티스가 트래픽 부하 균등화를 수행하여 클러스터 내부에 적절히 분배함

■ 동적 수평 스케일링 (HPA; horizontal pod autoscaling)

  • 인스턴스 수를 동적으로 확장하거나 감축하여 동적 요구사항에 대응하면서 시스템 자원을 효율적으로 활용

■ 오류 복구 (error recovery)

  • 포드와 노드를 지속적으로 모니터링하고 장애가 발생하면 새 포드를 실행하여 지정된 복제본의 수를 유지

■ 롤링 업데이트 (rolling update)

  • 지연시간을 적용하고 순차적으로 업데이트를 배포함으로써 문제가 발생하더라도 서비스를 정상 유지할 수 있음
  • 무중단으로 서비스할 수 있게 하기 위해 제공
  • 예) 소프트웨어 업데이트를 할 때 응용의 복제본이 10개씩 실행되고 있을 때 하나씩 업데이트, 점차적으로 업데이트 시키는 기능

■ 스토리지 오케스트레이션 (storage orchestration)

  • 원하는 응용에 다양한 스토리지 시스템을 마운트할 수 있음

■ 서비스 디스커버리 (service discovery)

  • 태생적으로 수명이 짧은 포드의 동적 성질을 관리하기 위해 자체 DNS기반으로 서비스를 동적 바인딩할 수 있는 기능을 제공

#쿠버네티스 포드의 생명주기

  1. kubectl을 통해서 API 서버에 포드의 생성을 요청
    • 업데이트가 있을 때마다 API 서버는 etcd에 기록하고, 클러스터의 상태를 최신으로 유지하려고 함
  2. 컨트롤러 매니저는 포드를 생성하고, 이 상태를 API 서버에 전달
    • 아직 어떤 워커 노드에 포드를 적용할지는 결정하지 않은 상태
  3. 스케줄러는 포드가 생성되었다는 정보를 인지하고, 이 포드를 어떤 워커 노드에 적용할지를 결정하여 해당 노드에 포드의 실행을 요청
  4. 해당 노드의 kubelet이 CRI에 요청하여 포드가 만들어지고 사용 가능한 상태가 됨

#쿠버네티스 인프라 구축

■ 로컬 환경

  • kubeadm, docker desktop 등을 설치/운용함으로써 로컬 환경에 간단한 클러스터 구성 가능
  • 개발 단계에서의 테스트에 이용

■ Public clouds

  • amazon의 AWS EKS (Elastic Kubernates Services)
  • GCP (Google Cloud Platform)의 GKE (Google kubernates Engine)
  • Microsoft의 AKS (Azuer kubernates Service)

■ On-prem

  • SUSE의 Rancher
  • RedHat의 OpenShift
This post is licensed under CC BY 4.0 by the author.