쿠버네티스의 개념

박정호·2025년 5월 23일

쿠버네티스의 역할

k8s는 쉽게 말해 수많은 컨테이너를 관리하는 시스템이다. 특히 서버를 다수 운영한다면 서로 다른 서버에서 작동하는 수많은 컨테이너를 관리하는 것은 어려운 일이다.

예를 들어, 컨테이너 100개를 docker로 실행한다면 docker container run을 100번 입력해야 한다. 뿐만 아니라 컨테이너에 문제가 생겼을 때 대응도 어렵다.

k8s를 사용하면 여러 개의 컨테이너를 쉽게 생성하고 관리할 수 있다.

쿠버네티스의 구조

k8s 클러스터에는 마스터 노드와 워커 노드가 존재한다. 개발자는 주로 마스터 노드와 통신하며 사용자는 인터넷을 통해 워커 노드와 통신하는 경우가 많다.

마스터 노드와 워커 노드의 유기적인 통신이 중요하고 CNI(Container Network Interface)를 통해 클러스터에 존재하는 컨테이너 간의 통신을 한다. CNI를 사용하려고 k8s 네트워크 플러그인을 제공하는데, 대표적으로 Flannel과 Calico가 있다. calico가 보안적으로 더 좋다고 한다.

컨트롤 플레인(Control Plane)

마스터 노드가 다루는 것으로 클러스터 전반의 작업을 관리하는 역할을 한다.

구성요소로는 API 서버, etcd, 스케줄러, 컨트롤러 매니저가 있다.

API 서버

k8s 작업은 kubectl 명령어를 통해 마스터 노드의 kube-apiserver에게 API 요청을 보냄으로써 이루어진다. API 서버는 k8s 컨트롤 플레인에서의 프론트엔드 역할을 한다.

etcd

쿠버네티스 클러스트에 존재하는 모든 데이터를 저장하는 key-value 저장소이다.

스케줄러(Scheduler)

k8s는 pod라는 오브젝트를 통해 애플리케이션을 실행한다. 파드는 k8s 클러스터를 구성하는 노드 중 하나에 실행된다. 이때 새롭게 생성되는 파드를 어느 노드에 실행시킬지 정하는 역할을 kube-scheduler가 수행한다.

컨트롤 매니저(Controller Manager)

k8s 리소스를 관리하고 제어하는 역할을 한다.

컨트롤 매니저는 마스터 노드에서 실행되며 클러스터 상태를 모니터링한다.

컨트롤러에는 deplyment, service, replicaset 컨트롤러 등의 여러 컨트롤러가 있다.

각 컨트롤러는 특정 리소스 타입을 관리한다.

노드(Node)

k8s 노드는 다음과 같은 요소로 구성된다.

Kubelet

k8s 클러스터를 구성하는 각 노드에는 Kubelet이 실행되는데 이는 파드 내부의 컨테이너 실행을 담당한다. 파드의 상태를 모니터링하고 파드의 상태에 이상이 있다면 해당 파드를 재배포한다.

Kube-Proxy

Kube-Proxy는 노드에서 네트워크 역할을 수행한다. 노드에 존재하는 파드들이 k8s 내부/외부와 네트워크 통신을 가능하게 한다.

컨테이너 런타임(Container Runtime)

컨테이너의 생명주기를 담당한다. 이를 위해 Kubelet은 컨테이너 런타임과 통신하는데, 이에 사용되는 것이 컨테이너 런타임 인터페이스(Container Runtime Interface)이다.

k8s가 사용하는 컨테이너 런타임에는 containerd, CRI-O 등이 있다. 가장 보편적으로 사용하는 것은 containerd이다.

파드(Pod)

docker는 컨테이너가 단독으로 실행되었지만 k8s는 컨테이너가 단독이 아닌, 파드 내에서 실행된다. 파드는 컨테이너를 실행하기 위한 오브젝트인데 각 파드는 한 개 혹은 다수의 컨테이너를 담을 수 있다.

k8s의 최소 실행 단위는 파드이다. k8s에서 다수의 파드는 여러 워커 노드에 분산되어 실행되는데, 하나의 파드에 속하는 컨테이너들은 모두 같은 노드에서 실행된다. 즉, 하나의 파드가 분할되어 여러 노드에 실행되는 일은 없다.

하나의 파드는 하나의 목적을 위해 구성된 컨테이너들이다.(주로 하나이긴 함) 파드는 컨테이너처럼 일시적인 존재이다. 파드는 실행할 때마다 IP 주소를 배정받으므로 파드의 IP 주소는 실행할 때마다 변경된다.(이것을 잘 기억해야 한다. k8s에서 도메인 기반으로 관리하는 것이 이 때문이다.)

워크로드(Workload)

워크로드는 k8s에서 실행되는 애플리케이션을 의미한다. 워크로드가 하나의 컴포넌트 형태로 실행하든, 다수의 컴포넌트가 함께 실행하든 k8s는 파드 내부에서 워크로드를 실행하게 된다. 이때 파드는 실행 중인 컨테이너의 집합을 나타낸다. 워크로드의 종류는 다음과 같다.

레플리카셋(ReplicaSet)

파드의 복제를 관리하며 클라이언트가 요구하는 복제본 개수만큼 파드를 복제하고 모니터링하고 관리한다.

디플로이먼트(Deployment)

디플로이먼트는 배치라는 의미가 있다. 이 의미에 맞게 애플리케이션의 배포와 스케일링을 관리하는 역할을 담당한다.

스테이트풀셋(StatefulSet)

파드 사이에서 순서와 고유성이 보장되어야 하는 경우에 사용한다.

데몬셋(DemonSet)

k8s를 구성하는 모든 노드가 파드의 복사본을 실행하도록 한다. k8s 클러스터에 새로운 노드가 추가되면 파드 역시 추가된다.

데몬셋은 주로 로깅, 모니터링, 스토리지 등과 같은 시스템 수준의 서비스를 실행하는 데 사용된다.

잡과 크론잡(Job, Cronjob)

잡과 크론잡은 작업(Task)이 정상적으로 완료되고 종료되는 것을 담당한다.

만약, 파드가 정상적으로 종료되지 않는다면 재실행시킨다. 잡은 작업이 한 번 종료되는 것을 담당하고 크론잡은 동일한 작업이 스케줄에 따라 여러 번 수행하는 것을 담당한다.

크론잡은 리눅스에서 사용하는 크론탭과 비슷한 역할을 한다.

네트워크

k8s에서는 네트워크와 관련된 두 가지 요소가 있다

서비스(Service)

k8s는 서비스를 사용하면 파드를 여러 개 묶어서 클러스터 외부로 노출시킬 수 있다. 서비스를 사용하는 방법의 장점은 이미 실행 중인 파드를 외부로 노출시키기 위해 파드 내부를 수정할 필요가 없다는 것이다.

이로 인해, 클라이언트가 직접 접근할 수 있도록 특정 포트로 바인딩하거나, 외부 IP를 인식하도록 코드를 바꿔야 할 필요가 없어진다.

또한, 파드가 죽고 다시 생성되더라도 서비스 IP는 변하지 않아, 파드 정의나 코드를 일절 건드리지 않아도 된다. 자동으로 파드들 사이에 로드밸런싱까지 해준다.

인그레스(Ingress)

인그레스는 k8s 클러스터 내부에 존재하는 여러 서비스를 HTTP/HTTPS 요청의 도메인이나 경로(path)에 따라 외부 트래픽과 연결해주는 리소스이다.

스토리지

컨테이너 내부에 존재하는 파일들은 수명이 짧다. 컨테이너에 이런저런 문제가 생기거나 컨테이너가 삭제되거나 재실행되면 해당 컨테이너 내부에 존재하는 파일이 모두 삭제되기 때문이다.

k8s 스토리지를 활용하면 파드의 상태와 상관없이 파일을 보관할 수 있다.

0개의 댓글