본문 바로가기

클라우드 이론

Kubernetes 이론 (1)

Container Orchestration Tool

이전 Docker 포스팅에서는 왜 컨테이너를 사용하는지에 대해 설명하였다. 컨테이너 런타임 도구 중 하나인 Docker를 사용하여서도 컨테이너의 실행 및 관리가 가능하지만, 서비스마다 독립된 컨테이너를 이용하여 개발하다보면 많은 양의 컨테이너를 생성하게되고 컨테이너의 관리가 힘들어지게 된다. 하나의 노드에서 관리하기 어려워 진다. 이런 어려움을 극복하기 위해 나온 도구가 컨테이너 오케스트레이션 도구(Container Orchestration tool)이다. 컨테이너 오케스트레이션 도구의 종류로는 Kuberentes, Docker swarm, Redhat OpenShift, Apache Mesos 등이 있다. 이번 포스팅에서는 가장 널리 알려진 Kubernetes(중간의 8글자를 줄여 K8s라고도 부른다.)에 대해 설명하도록 하겠다. 

 

Kubernetes

Kuberentes는 여러개의 노드를 클러스터로 묶어 관리한다. 물론 하나의 노드에서만 실행 하는 것도 가능하지만 그런 경우 컨테이너 런타임 도구만을 사용하는것이 더 효율적이다. 쿠버네티스가 지원하는 주된 기능으로는 오토스케일링, 장애복구, 로드밸런싱 등이 있다.

아래는 쿠버네티스에서 공식적으로 홍보하고 있는 주요 기능들이다.

  • 서비스 디스커버리와 로드 밸런싱 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
  • 스토리지 오케스트레이션 쿠버네티스를 사용하면 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할 수 있다
  • 자동화된 롤아웃과 롤백 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다. 예를 들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고, 모든 리소스를 새 컨테이너에 적용할 수 있다.
  • 자동화된 빈 패킹(bin packing) 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 해준다.
  • 자동화된 복구(self-healing) 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
  • 시크릿과 구성 관리 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트할 수 있다.

 

쿠버네티스는 기본적으로 마스터노드와 워커노드로 구성된다.

그림상의 마스터노드는 1개만 표시되어 있지만, 마스터 노드로써 여러 노드를 사용 할 수 있고, 모든 노드를 마스터 노드로 설정 하는 것도 가능하다. 하지만 보안 및 안정성 문제로 최소 3대 이상의 홀수개의 노드를 사용한다.

홀수개의 노드를 마스터 노드로 사용하는 이유는 네트워크나 노드상에 문제가 생겼을 경우 마스터 노드가 정확히 반반으로 나누어져 서로 다른 결정을 내리는 상황을 방지하기 위함이다. 

마스터노드의 내부는 etcd, API서버, scheduler 등 클러스터를 관리하기 위한 여러 요소들인 control plane을 구성하게 된다.

 

API 서버는  kubectl 요청 뿐 아니라 내부 노드까지의 모든 요청을 처리하는 모듈이다. 실제로는 원하는 상태(desire state)를 key-value 저장소에 저장하고, 저장된 상태를 조회하는 일을 한다. 실제로 Pod을 할당하고 상태를 체크하는 것은 다른 모듈이 한다.

etcd는 RAFT 알고리즘을 이용한 key-value 저장소이다.

Scheduler는 할당되지 않은 Pod를 여러가지 조건(자원, 라벨)에 따라 적절한 노드 서버에 할당해 준다.

 

각각의 노드는 Kubelet 과 kube-proxy로 구성된다. Kubelet은 API 서버가 전달해준 명령을 받고, 본인 노드의 현재 상태를 다시 API 서버에 전달한다. kube-proxy는 파드에 연결된 네트워크를 관리하는 역할을 한다.

 

'클라우드 이론' 카테고리의 다른 글

Kubernetes 이론 (2)  (0) 2023.10.23
Docker  (0) 2023.09.08