해당 스터디는 90DaysOfDevOps
https://github.com/MichaelCade/90DaysOfDevOps
를 기반으로 진행한 내용입니다.
Day 10 - Is Kubernetes Too Complicated?
쿠버네티스는 컨테이너 워크로드를 관리하기 위한 오케스트레이션 플랫폼으로, 개발자들이 분산된 이프라 전반에 걸쳐 어플리케이션을 배포하고 확장할 수 있게 해준다.
기본적으로 쿠버네티스는 개발자들이 기반 인프라에 대해 걱정하는 대신 자신에 어플리케이션에 집중할 수 있도록 해준다. 보안, 로깅, 이중화, 확장성 등 어플리케이션이 이미 쿠버네티스 패브릭에 내장되어 있어, 개발자는 단지 어플리케이션의 코드를 작성하는 데만 집중하면 된다.
또한, 쿠버네티스는 여러 어플리케이션을 동시에 실행하고, 어떤 앱이 얼마나 많은 메모리나 저장소가 필요한지 파악하여, 문제가 생긴 앱은 자동으로 재시작한다.
이러한 관리능력은 단일 서버를 넘어 여러 서버와 물리적 위치에 걸쳐 작동하는데, 이 모든 것은 '컨테이너 (Container)'라는 기술 덕분에 가능하다.
Container는 어플리케이션이 원활하게 실행되는 데 필요한 모든 것, 즉 모든 종속성과 구성을 포함하는 패키지이다.
컨테이너화를 사용하면, 기존의 monolithic 어플리케이션을 훨씬 작고 독립적인 조각으로 나눌 수 있으며, 로컬과 서버의 호환성 문제를 부딪힐 위험이 없다.
쿠버네티스는 크게 클러스터의 '두뇌' 역할을 하는 컨트롤 플레인(Control Plane)과 실제 작업을 수행하는 워커 노드(Worker Node)로 구성된다.
API 서버: 쿠버네티스의 프론트엔드 역할을 하며, 모든 명령을 받아 처리하고 검증
스케줄러 (Scheduler): 생성된 워크로드를 리소스 상태에 따라 가장 적절한 워커 노드에 할당
컨트롤러 매니저 (Controller Manager): 클러스터의 현재 상태가 우리가 원하는 상태와 일치하는지 지속적으로 감시하고 조율
etcd: 클러스터의 모든 구성 데이터와 상태를 저장하는 분산 키-값 저장소(데이터베이스)
Kubelet : 각 노드에서 컨트롤 플레인과 통신하며, 컨테이너가 의도대로 실행되도록 보장
컨테이너 런타임 (Container Runtime): 도커(Docker)나 컨테이너디(containerd)처럼 실제로 컨테이너를 실행하는 소프트웨어
Kube Proxy : 컨테이너와 외부 인터넷 간의 네트워크 연결을 관리
요약하자면, 컨트롤 플레인이 클러스터를 제어하고 조정하면, 워커 노드가 실제 워크로드를 실행하는 구조이다.
쿠버네티스는 인프라의 개념을 애플리케이션과 최대한 분리시켰기 때문에 큰 인기를 얻었다.
과거의 모놀리식(Monolithic) 방식에서는 로깅, 오류 처리, 확장성 같은 기능들이 애플리케이션 코드 안에 직접 포함되어 있었고, 개발자가 이 모든것을 구현해야했다.
반면, 쿠버네티스 접근 방식에서는 이러한 공통 기능들이 쿠버네티스 생태계 안으로 들어오게 되어, 애플리케이션 코드는 훨씬 작고 단순해지며, 개발자는 더 빠르게 코드를 배포할 수 있게 되었다.
개발자 관점
개발자에게 배포는 매우 간단해진다.
kubectl create deployment my-secret-app --image=...
와 같은 간단한 명령어로 애플리케이션을 배포할 수 있고, 개발자는 인프라를 신경 쓸 필요 없이 잘 정의된 API와 통신하기만 하면 된다.
운영자(인프라) 관점
반면, 인프라를 관리하는 운영자에게는 상황이 더 복잡해질 수 있습니다.
쿠버네티스는 "플랫폼을 구축하기 위한 플랫폼"이라는 말이 있다. 이는 쿠버네티스가 완성된 솔루션이 아니라 시작점이라는 의미이다.
쿠버네티스가 '뼈대'이며, 어떤 네트워킹, 어떤 보안을 사용할지는 운영자가 직접 선택하고 구성해야하며, CNCF 생태계의 수많은 도구들 속에서 올바른 선택을 하는 것은 쉽지 않은 과제이다.
해당 강의에서의 답변은 '커리어의 어느 단계에 있는지에 따라 다르다'라고 한다.
만약 IT 기초가 부족하다면, 쿠버네티스보다 먼저
와 같은 기본 지식을 쌓는 것이 좋다고 한다.
쿠버네티스는 빙산과 같아 기초를 배우고 나면 수면 아래에 훨씬 더 많은 배울 것이 있다는 것을 깨닫게 된다고 한다. (필자도 동의하는 바이다)
만약 기본기가 탄탄하다면, 다음 방법들을 통해 쿠버네티스 학습을 시작할 것을 권장한다.
필자는 참고로 학과서버 온프레미스 쿠버네티스 구축을 통해 공부를 진행했다.
"쿠버네티스는 단순화인 동시에 복잡하다"
쿠버네티스는 개발자가 인프라 대신 애플리케이션에 집중하게 함으로써 많은 측면을 단순화했다. 하지만 그 잠재력을 온전히 활용하기 위해서는 개발자 혹은 운영자가 시간과 자원을 투자해야 하는 복잡한 시스템이기도 하다.
따라서 클라우드 네이티브의 대중화를 위해, 쿠버네티스의 복잡성을 낮추고 더 많은 사람이 쉽게 접근할 수 있는 방법을 끊임없이 모색해야 한다고 강의에서 주장한다.