쿠버네티스(K8S) 이해하기

개발새발·2023년 11월 24일
1

Cloud Native

목록 보기
3/6
post-thumbnail

클라우드 네이티브 란

클라우드 핵심 기술로 손꼽히는 쿠버네티스를 알기 위해서는 우선 클라우드 네이티브라는 개념을 이해해야한다. 클라우드 네이티브는 클라우드의 장점을 최대한 활용할 수 있도록 애플리케이션을 개발하고 또 구축하고 실행하는 방식이다.

다음은 클라우드 네이티브를 대표하는 것들이다.

클라우드 네이티브 애플리케이션의 방법론인 DevOps, 애플리케이션 운영 구조인 Microservices, 애플리케이션 운영 인프라인 Containers, 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 자동화 프로세를 의미하는 CI/CD 등이 있다.

컨테이너 란

그렇다면 컨테이너는 뭘까?

컨테이너는 환경과 상관없이 실행을 위해 필요한 모든 요소를 포함하고 있는 소프트웨어 패키지이다. 컨테이너라는 분리된 공간에 애플리케이션과 운영 환경이 모두 들어있고, 그 덕에 분리된 공간마다 다른 환경을 제공할 수 있는 것이다. 마치 하나하나가 별도의 서버인 것처럼 운영할 수 있다. 소프트웨어를 컨테이너화시키면 인프라와 상관없이 어디서나 동일하게 실행할 수 있다. 운영 환경에 구애받지 않으니 환경을 구축하거나 테스트하는데 필요한 시간이 오래 걸리지 않는다. 같은 기반 위에서 한꺼번에 개발된 게 아니니, 고객의 니즈에 맞춘 수정이나 교체도 훨씬 용이하다. 프로세스 수준에서 실행되어 필요한 컴퓨팅 자원의 소비가 적고 동작과 확장(scale-out)도 빠르다. 즉, 애플리케이션을 포장하고 실행하기에 최적의 방법이라고 할 수 있다.

쿠버네티스(K8S) 란

이제 쿠버네티스가 뭔지 알아보자.

쿠버네티스는 컨테이너화된 애플리케이션을 배포, 관리, 확장 등을 관리하는 과정을 자동화하는 오픈소스 컨테이너 오케스트레이션 플랫폼이다. 컨테이너 오케스트레이션이 컨테이너의 배포, 관리, 확장 및 네트워킹을 자동화하는 것을 의미하기 때문에 쿠버네티스란 컨테이너화된 애플리케이션의 관리를 자동화할 수 있도록 도와주는 플랫폼인 것이다.

쿠버네티스는 보유 리소스를 최대 활용하고 효율적인 워크플로우를 제공하기 때문에 자연히 비용이 절감된다. 또, 이전에는 수동으로 처리되었던 많은 데브옵스 프로세스를 자동화하고 소프트웨어 개발자의 작업을 단순화해준다. 자연히 어플리케이션의 확장성을 높여주고 유연하게 뒷받침하며 이를 통해 생산성도 커진다. 또 쿠버네티스 환경에서 쓸 수 있으면 OS와 관계없이 이용할 수 있다. 즉, 쿠버네티스를 이용하면 구글에서 사용하던 컨테이너화된 애플리케이션을 AWS로 그대로 마이그레이션할 수 있는 것이다.

퍼블릭 클라우드는 물론, 프라이빗 클라우드 등 다양한 유형의 인프라에서 컨테이너를 관리할 수 있고 자동으로 배포, 확장 및 축소가 가능하다. 컨테이너화된 애플리케이션의 안정적 실행도 지원한다. 가장 많은 사람들이 이용하는 오픈소스 프로젝트 중 하나이니 만큼, 지속적인 피드백과 이에 따른 개선이 뒷받침하고 있다.

컨테이너 런타임 중 하나인 도커는 단독으로는 도커가 설치된 호스트를 동시에 여러 대 동작시키거나 중앙에서 통합, 관리를 할 수 없다. 이렇게 도커 자체로는 여러 호스트로 구성되거나 일정 규모 이상의 서비스 환경에서 사용할 수 있는 시스템을 구축하기 어려우므로, 요즘에는 쿠버네티스로 대표되는 컨테이너 오케스트레이션 엔진을 사용해 이러한 시스템을 구축하는 것이 일반적이다.

쿠버네티스 컴포넌트

쿠버네티스 내부를 살펴보자. 쿠버네티스를 배포하면 클러스터를 얻는다.

쿠버네티스 클러스터 안에는 여러가지 컴포넌트들이 있는데 크게 분류를 하자면, 쿠버네티스 기능 제어를 전체적으로 담당하는 컨트롤 플레인(Control Plane) 컴포넌트와 컨트롤 플레인 컴포넌트의 요청을 받아 각 노드에서 동작을 담당하는 노드(Node) 컴포넌트로 나누어볼 수 있다. 컨트롤 플레인 컴포넌트와 노드 컴포넌트는 세부적으로 많은 개별 구성 요소를 가지고 있다. 다음은 쿠버네티스의 컴포넌트들이다.

컨트롤 플레인(Control Plane) 컴포넌트

kube-apiserver
쿠버네티스 컨트롤 플레인의 프론트 엔드 역할로 클러스터로 들어오는 요청을 가장 앞에서 접수하는 일을 한다.

etcd
쿠버네티스 클러스터가 동작하기 위해서는 클러스터 및 리소스의 구성 정보, 상태 정보 및 명세 정보 등이 필요하다. etcd는 이를 key-value 형태로 저장하는 저장소이다. 안정적인 동작을 위해 자료를 분산해서 저장하는 구조를 채택하고 있다.

kube-scheduler
쿠버네티스 클러스터는 여러 노드로 구성되어 있고 기본 작업 단위라고 할 수 있는 파드는 여러 노드 중 특정 노드에 배치되어 동작한다. 이때 새로 생성된 파드를 감지하여 어떤 노드로 배치할지 결정하는 작업을 스케줄링이라고 한다. 이런 스케줄링을 담당하는 컴포넌트가 kube-scheduler이다.

kube-controller-manager
다운된 노드는 없는지, 파드가 의도한 복제 숫자를 유지하고 있는지, 서비스와 파드는 적절하게 연결되어 있는지, 네임스페이스에 대한 기본 계정과 토큰이 생성되어 있는지를 확인하고 적절하지 않다면 적절한 수준을 유지하기 위해 조치하는 역할을 한다.

노드(Node) 컴포넌트

kubelet
노드에서 컨테이너가 동작하도록 관리해주는 핵심 요소이다. 각 노드에서 파드를 생성하고 정상적으로 동작하는지 관리하는 역할을 담당하고 있으며, 실제로 우리가 쿠버네티스의 워크로드를 관리하기 위해 내려지는 명령은 kubelet을 통해 수행된다.

kube-proxy
쿠버네티스 클러스터 내부에서 네트워크 요청을 전달하는 역할을 한다. 파드의 IP는 매번 변하지만 kube-proxy가 이 파드에 접근할 수 있는 방법을 그때마다 관리하고 갱신하며, 서비스 오브젝트는 이 정보를 사용하여 파드가 외부에서 접근할 수 있는 경로를 제공한다.

container runtime
파드에 포함된 컨테이너 실행을 실질적으로 담당하는 애플리케이션을 의미한다. 쿠버네티스 구성 요소에 기본적으로 포함되어 있거나, 특정 소프트웨어를 지칭하는 것은 아니고 CRI(Container Runtime Interface)를 준수하여 쿠버네티스와 함께 사용할 수 있는 외부 애플리케이션들을 의미한다.

Reference

profile
블록체인 개발 어때요

0개의 댓글