핑구

01. 쿠버네티스의 기본 구조와 개념 본문

클라우드/Kubernetes

01. 쿠버네티스의 기본 구조와 개념

코딩 펭귄 2022. 2. 21. 15:52

쿠버네티스 개념

쿠버네티스 개념 (출처: https://subicura.com/2019/05/19/kubernetes-basic-1.html)

쿠버네티스는 원하는 상태를 만들기 위해 현재 상태를 바꾸는 플랫폼입니다. 따라서 현재 상태(current state)를 모니터링하며 관리자가 설정한 원하는 상태(desired state)를 유지하기 위한 작업을 진행합니다. 이는 단순히 컨테이너 뿐만이 아니라 네임스페이스나 네트워크, 스토리지 같은 부분도 동일하게 동작합니다.

 

이러한 개념 때문에 서버를 배포할 때도 직접적인 동작을 명령하지 않고, 상태를 선언하는 방식을 사용합니다. 이 차이는 CLI 명령어에서도 드러납니다. 

$ docker run # 도커 명령
$ kubectl create # 쿠버네티스 상태 생성

 


Object

쿠버네티스를 이해하기 위해 가장 중요한 부분이 오브젝트입니다. 쿠버네티스는 상태를 관리하기 위한 대상을 오브젝트로 정의합니다. 기본으로 수십가지의 오브젝트를 제공하고, 새로운 오브젝트를 추가하기가 쉽기 때문에 확장성이 좋습니다. 

 

Basic Object

Pod

쿠버네티스에서 실행되는 최소 단위로 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가집니다. Pod에 속한 컨테이너는 독립적인 공간과 IP를 가지며, 스토리지와 네트워크를 공유하고, 서로 localhost로 접근할 수 있습니다. 

 

Namespace

쿠버네티스 클러스터에서 사용되는 리소스들을 논리적으로 구분해서 관리하는 그룹입니다. pod나 service 등은 네임스페이스 별로 생성, 관리될 수 있고, 사용자의 권한도 네임스페이스 별로 나눠서 부여할 수 있습니다.

 

Volume 

저장소와 관련된 오브젝트입니다. Pod가 사라지더라도 저장/보존이 가능하며 Pod에서 사용할 수 있는 디렉터리를 제공합니다.

 

Service 

네트워크와 관련된 오브젝트입니다. Pod는 유동적이기 때문에 접속 정보가 고정되지 않습니다. 따라서 Service를 이용하여 Pod을 외부 네트워크와 연결해주고 여러 개의 Pod을 바라보는 내부 로드 밸런서를 생성합니다. 내부 DNS에 서비스 이름을 도메인으로 등록하기 때문에 서비스 디스커버리 역할도 합니다.

 

자주 사용되는 오브젝트

ReplicaSet

Pod를 한 개 이상 복제하여 관리하는 오브젝트입니다. 복제할 개수, 개수를 체크할 라벨 선택자, 생성할 Pod의 설정값 등을 가지고 있습니다. 주로 Deployment 등 다른 오브젝트에 의해 사용됩니다.

 

Object spec

오브젝트들은 오브젝트의 특성을 기술한 오브젝트 스펙으로 기술됩니다. 오브젝트 스펙을 기술하기 위해서는 CLI 명령어를 실행시키거나, yaml, json 파일과 같은 템플릿 형식으로 정의합니다.

 

쿠버네티스 배포 방식

쿠버네티스 애플리케이션을 배포하기 위해서는 원하는 상태를 가양한 오브젝트에 라벨을 붙여 정의하고, API 서버에 전달하는 방식을 사용합니다.

 


쿠버네티스 아키텍처

쿠버네티스의 모든 명령은 마스터의 API 서버를 호출하고 노드가 마스터와 통신하며 필요한 작업을 수행합니다. 클러스터 전체를 관리하는 컨트롤러를 마스터라고 하고, 컨테이너가 배포되는 물리적인 머신을 노드라고 합니다.

 

Master 컴포넌트

  • kube-apiserver : API 서버
    마스터의 핵심 모듈로 쿠버네티스 클러스터의 api를 사용할 수 있도록 하는 컨트롤 플레인 컴포넌트입니다. 쿠버네티스의 프론트 엔드로서 클러스터로 온 요청이 유효한지 검증하고, 다른 컴포넌트가 서로 필요한 정보를 주고받을 수 있게 합니다. 
  • etcd : 분산 데이터 저장소
    쿠버네티스에서 필요한 모든 데이터를 RAFT 알고리즘을 이용해 키-값 형태로 저장하는 데이터베이스 역할을 합니다. 안정성이 높고 속도가 빠릅니다. watch 기능을 통해 어떤 상태가 변경되면 바로 체크하여 로직을 실행할 수 있습니다.
  • kube-scheduler
    할당되지 않은 Pod을 여러 가지 조건(필요한 자원, 라벨)에 따라 적절한 노드 서버에 할당해주는 모듈입니다.
  • kube-controller-manager 
    쿠버네티스에 있는 거의 모든 오브젝트의 상태를 관리합니다. 컨트롤러 각각은 논리적으로 개별 프로세스이지만, 복잡도를 줄이기 위해 모든 컨트롤러를 바이너리 파일로 컴파일하여 단일 프로세스로 실행합니다.
  • cloud-controller-manager
    클라우드에 특화된 모듈로 노드를 추가, 삭제하고, 로드 밸런서를 연결하거나 볼륨을 붙일 수 있습니다.

Node 컴포넌트

  • kubelet
    클러스터 안 모든 노드에서 실행되는 에이전트로 노드에 할당된 Pod의 생명주기를 관리합니다. Pod을 생성하고 Pod 안의 컨테이너에 이상이 없는지 확인하면서 주기적으로 마스터에 상태를 전달합니다. 단, 노드 안에 있는 컨테이너라도 쿠버네티스를 통해 만들어지지 않은 컨테이너는 관리하지 않습니다.
  • kube-proxy
    가상 네트워크의 동작을 관리하는 컴포넌트입니다. TCP, UDP, SCTP 스트림을 포워딩하고, 여러 개의 Pod를 라운드로빈 형태로 묶어 서비스를 제공할 수 있습니다. 
  • 컨테이너 런타임
    실제로 컨테이너를 실행시키는 컴포넌트입니다. 주로 Docker를 사용합니다.

 

'클라우드 > Kubernetes' 카테고리의 다른 글

00. 쿠버네티스 개요 및 소개  (0) 2022.02.21