[Kubernetes] 쿠버네티스를 사용해야 하는 이유
오늘날 많은 서비스들이 Container를 통해 운영되고 있다.
개발과 운영환경 간의 동일 서비스 보장, 대규모 시스템에서의 마이크로서비스 등 Container가 쓰이고 있는 이유는 정말 다양하다.
하지만 단순히 Container 기술뿐만 아니라 이렇게 다량으로 운영되고 있는 Container를 관리해줄 중앙 구심점 역시도 필요하다.
Kubernetes 란
Kubernetes, 줄여서 K8S라고도 부르는 쿠버네티스는 Google에서 개발한 오픈소스 Container Orchestration 플랫폼이다.
Container Orchestration 도구는 Kubernetes 말고도 RedHat 사의 OpenShift 등 여러가지가 있지만
완전 오픈소스인데다 어디서든 Reference를 구할 수 있을 만큼 생태계가 풍부하고, On-premise나 Cloud Native 등 환경에 구애받지 않고 어디서든 구동할 수 있다는 점 때문에 현재 Container Orchestration의 표준이 되었다.
Container Orchestration 이란
간단히 말하자면 그냥 수많은 Container들을 관리해주는 것인데, 아래의 Action들을 포함한다
자동화된 스케일링
- 트래픽의 변동에 따라 Container를 자동으로 증가시키거나 감소
자동화된 Roll-out, Roll-back
- Roll-out: 업데이트 시, 점진적으로 새 버전을 배포하고 모니터링하여 문제가 없으면 점차적으로 전체 시스템에 배포
- Roll-back: 문제가 발생하면 자동으로 이전 버전으로 롤백하여 서비스 중단을 최소화
자동화된 복구
- 컨테이너 상태를 계속 감시하고 있는 control tower 필요
- 문제가 발생한 Container를 재시작하고 가용성을 높이고 다운타임을 감소
자동화된 Bin Packing
- Bin packing: 리소스를 최대한 효율적으로 사용하기 위해 컨테이너를 클러스터 노드에 자동으로 배치하는 기능
시크릿과 구성 관리
- 애플리케이션에서 사용하는 secret을 안전하게 저장
- 환경 설정이나 구성 파일을 중앙에서 관리하여 운영의 일관성을 유지
Service Discovery와 로드 밸런싱
- 각 서비스가 서로 통신할 수 있도록 네트워크를 설정
- 로드 밸런서를 사용하여 Container 간에 트래픽을 균등하게 분배하여 특정 Container에 과부하가 걸리지 않도록 관리
Storage Orchestration
- 클라우드 기반의 스토리지 서비스나 로컬 디스크를 Container에 mount
IaC를 사용한 운영
- 인프라 설정을 코드로 정의하고 자동으로 provisioning
Kubernetes의 구성
Kubernetes는 크게 Control Plane과 Data plane으로 나뉜다
Control plane (Master node) 은 Kubernetes 전체를 통제/관리하는 역할을 담당하며, 아래의 4가지를 포함한다.
- kube-apiserver
- etcd
- kube-scheduler
- kube-controller-manager
Data plane (Worker node) 은 실제 Container Runtime이 있는 부분이며, 실제 애플리케이션이 배포되는 곳이다.
아래 4가지를 포함한다.
- kubelet
- kube-proxy
- continer runtime
사용자가 Kubernetes를 사용하기 위해 kubectl (보통 '쿠베시티엘' 이라고 발음) 이라는 명령어를 사용하는데, 이 명령어는 Control plane 으로 전달되며 Container 워크로드에 대한 작업을 수행하게 된다.