1 쿠버네티스 개념 아키텍처

1.1. 개념

  • 컨테이너화 된 어플리케이션의 배포, 확장, 운영을 자동화하기 위한 오픈소스 시스템
  • 구글에 의해 개발됨.
  • CNCF에 기반을 둠

1.2. 주요 특징

  • 자동화된 롤아웃 및 롤백
    • 어플리케이션 업데이트 시 롤아웃을 자동으로 관리
    • 문제 발생 시 이전 버전으로 롤백
  • 서비스 접근 및 로드 밸런싱
    • 클러스터 내의 어플리케이션에 쉬벡 접근
    • 트래픽을 자동으로 분산
  • 스케일링
    • 리소스의 사용에 따라 자동 또는 수동으로 스케일링
  • 자체 회복
    • 실패한 컨테이너 재시작.
    • 건강하지 않은 컨테이너는 교체
    • 준비되지 않은 노드로부터 어플리케이션 이전

2. 쿠버네티스 아키텍쳐와 주요 구성 요소

2.1. 아키텍처

  • Master ← → Node 구조로 이루어진 클러스터를 사용

마스터 컴포넌트

  • API 서버 (kube-apiserver): 쿠버네티스 API를 제공하며, 사용자와 내부 컴포넌트 간의 중재자 역할을 함
  • 스케줄러 (kube-scheduler): 새로 생성된 파드를 어떤 노드에 할당할 지 결정
  • 컨트롤러 매니저 (kube-controller-manager): 여러 컨트롤러를 실행. 노드 컨트롤러, 레플리케이션 컨트롤러 등이 존재함
  • etcd: 모든 클러스터 데이터를 저장하는 경량의 분산 키-값 저장소

노드 컴포넌트

Pod가 할당되어 있는 공간

  • kubelet : 각 노드에서 실행되며, 파드 스펙(Spec)에 설명된 대로 컨테이너가 실행되고 있는지 확인
  • kube-proxy: 각 노드의 네트워크 규칙을 관리하여 네트워크 통신을 가능케 함
  • 컨테이너 런타임: 컨테이너 실행을 담당하는 소프트웨어 (Docker, containerd, CRI-O 등)

2.2. 기능

  • 클러스터 구성
    • 먼저 쿠버네티스 클러스터를 구성.
    • 클러스터는 여러 노드 (물리적 또는 가상머신)와 이들을 관리하는 마스터 노드로 구성됨
    • etcd 는 클러스터 관리에 사용되는 모든 데이터를 분산된 Key-Value 형태로 저장함. 마스터 간 충돌이 없도록 클러스터 내에서 잠금을 구현함.
  • API 서버와의 통신
    • 사용자는 kubectl CLI 또는 API를 통해 API 서버와 통신함
    • 이를 통해 파드의 생성, 업데이트, 삭제 등의 작업을 요청함
  • 스케줄링과 실행
    • 스케줄러는 새로운 파드에 대해 가장 적합한 노드를 선택함.
    • kubelet은 해당 노드에서 파드의 컨테이너가 예상대로 실행되도록 관리함.
  • 서비스 관리
    • kube-proxy는 서비스를 통한 네트워크 트래픽을 관리.
    • 서비스는 파드 그룹에 안정적인 접근성을 제공함.
  • 자동화된 롤아웃 및 롤백
    • Deployment를 통해 어플리케이션의 업데이트, 롤아웃 및 롤백을 자동으로 관리함
  • 스케일링과 자체 치유
    • 어플리케이션의 수요에 따라 자동으로 스케일링함.
    • 실패한 파드를 재시작 하는 등의 자체 치유 기능을 제공함.

2.3. 주요 구성 요소

2.3.1. Pod

개념

  • 쿠버네티스에서 배포할 수 있는 가장 작은 작업 단위
  • 하나 이상의 컨테이너를 포함할 수 있으며, 이들은 스토리지와 네트워크를 공유
  • 공유해야한다면 하나의 파드에서 구동시키는 것이 적합함

특징

  • 컨테이너 그루핑:
    • 하나 이상의 밀접하게 관련된 컨테이너를 그룹화
    • 이 컨테이너들은 같은 컴퓨팅 리소스를 공유함
  • 공유 리소스
    • 파드 내 컨테이너는 같은 IP 주소와 포트공간을 공유함
    • 서로 localhost를 통해 통신
  • 일시적인 성격:
    • 파드는 일시적.
    • 파드가 삭제되면 그 안의 컨테이너도 함께 삭제됨
    • 따라서 파드는 변경 가능한 리소스로 간주됨.
  • 생명주기:
    • 파드는 생성되고, 실행되고, 종료될 때 까지의 생명주기를 가짐.
    • 파드가 종료되면, 쿠버네티스 클러스터에서 제거됨

사용 예

  • 단일 컨테이너 파드: 대부분의 파드는 하나의 컨테이너만을 실행함
  • 멀티 컨테이너 파드: 로깅, 데이터 백업, 데이터 처리와 같은 보조 기능을 수행하는 사이드카(sidecar) 컨테이너를 함께 포함하는 경우

2.3.2. Service

개념

  • 서비스는 파드의 집합에 대한 안정적인 네트워크 주소를 제공함
  • 서비스를 통해 파드 집합에 대한 접근을 관리하고, 로드 밸런싱 및 서비스 발견이 가능함 (service discovery) → 그냥 서비스 디스커버리라고 하면 되지, 자꾸 서비스발견 서비스발견 거려서 뭔말인가 했네

특징

  • 안정적인 주소 제공: 서비스는 파드 집합에 지속적으로 접근할 수 있는 안정적인 IP주소와 포트를 제공함
  • 로드 밸런싱: 서비스는 요청을 여러 파드에 분산시켜 로드 밸런싱을 수행함
  • 서비스 발견: Service Discovery
  • 서비스 타입: 다양한 서비스타입을 통해 다양한 네트워크 요구사항을 충족함
    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName

사용 예

  • ClusterIP: 클러스터 내부에서만 접근 가능한 서비스를 만들 때 사용
  • LoadBalancer: 클라우드 제공 업체의 로드밸런서를 사용하여 서비스에 대한 외부 접근을 관리할 때 사용

2.3.3. Deployment

개념

  • 쿠버네티스에서 파드와 레플리카셋의 상태를 선언적으로 관리하는 API 오브젝트
  • 어플리케이션의 배포, 업데이트, 스케일링 등을 자동화 하고 관리함

특징

  • 자동화된 롤아웃과 롤백: 새로운 버전을 롤아웃하고 필요한 경우 이전 버전으로 롤백하는 프로세스를 자동화
  • 상태 관리: 원하는 상태 (Desired State)를 정의하고, 쿠버네티스가 현상태(Current State)를 앞서 정의한 상태대로 유지함
  • 선언적 업데이트: YAML 파일이나 JSON 형식을 사용하여 애플리케이션을 업데이트하는 방식을 선언함
  • 스케일링: 파드의 수를 수동 또는 자동으로 조절하여 애플리케이션을 스케일링함

사용 예

  • 새 버전 배포
  • 스케일링: kubectl scale deployment 명령어를 사용하여 확장하거나 축소

2.3.4. ReplicaSet

개념

  • 레플리카셋은 파드의 복제본을 유지 관리하는 쿠버네티스 오브젝트
  • 파드의 원하는 복제본 수를 지정함
  • 지정된 수의 파드 복제본이 항상 실행되고 있도록 보장함

특징

  • 복제본 수 관리: 지정된 수의 파드 복제본을 유지함
  • 자체 치유: 실패한 파드를 자동으로 대체하여 복제본 수를 유지함
  • 유연한 파드 선택: 레이블 선택기(Label Selector)를 사용하여 관리할 파드를 결정함

사용 예

  • 어플리케이션 가용성 보장: 레플리카셋은 어플리케이션의 가용성을 높이기 위해 여러 파드의 복제본을 두고 실행함.
  • 부하 분산: 덕분에 트래픽이 분선되고 부하가 복제본에 균등하게 분배됨.

2.3.5. StatefulSet

개념

  • Stateful한 pod를 관리하기 위한 controller.

특징

  • pod들의 고유성과 순서를 보장함.

사용 예

  • 마스터 노드가 가동된 후 순차적으로 워커 노드가 가동되어야 하는 경우를 보이는 database.
  • Persistent Volume(PV)을 개별 포드로 생성하여 연결함. Pod가 비정상적으로 종료된 경우에도, 새로운 Pod가 PV를 담당함.

Reference