[Docker Mastery] - 11

쿠버네티스 아키텍쳐

시작

쿠버네티스란

컨테이너 배포에 도움을 줄 오케이스레이션 도구입니다. 왜 사용하는지 어떻게 사용하는지 알아봅시다.
인스턴스에 도커를 설치하고 컨테이너를 실행하는 과정을 보면 아래와 같은 문제를 만날 수 있습니다.

  • 컨테이너가 충돌하거나 다운될 수 있으며 새 컨테이너로 교체해야 합니다.
  • 인스턴스를 직접 관리 구성하고 필요한 패키지도 구성해야 합니다.
  • 컨테이너에 문제가 발생한 경우 수동으로 다시 실행해주어야합니다.
  • 트래픽 급증 시 더 많은 컨테이너가 필요합니다. 컨테이너를 증가시켜 고르게 분산하고 트래픽이 준다면 컨테이너를 제외해야 합니다. (스케일링)

왜 쿠버네티스를 쓰는가

ECS 서비스의 경우 컨테이너 상태를 확인하므로 충돌이 발생한 경우 복구하게 됩니다. 오토 스케일링에도 도움을 주죠. 인스턴스 수를 늘리거나 트래픽이 줄어든 경우 제거하죠 또한 로드밸런서도 지원됩니다.

다만 한 가지 단점이 있습니다. 기본적으로 AWS에서 정의한대로 구성해야합니다. 마이크로소프트 애저에서는 작동하지 않죠. 다른 프로바이더로 전환하려면 해당 프로바이더의 개념 및 지식을 알아야합니다. 도커를 아는 것만이 아닌 ECS와 같은 프로바이더 개념도 알아야하는거죠.

이것을 쿠버네티스가 도와줄 겁니다.

정확히 쿠버네티스가 무엇인가

자동 배포 스케일링, 로드밸런싱, 관리 기능 컨테이너를 실행하는데 전반적인 관리 도구를 지원합니다. 여러 프로바이더 서비스에서도 쿠버네티스 환경설정을 그대로 이식이 가능합니다. 또한 자체 머신에 쿠버네티스를 수동으로 설치하고 사용할 수 있죠.

다만 아래와 같은 경우는 쿠버네티스에 대한 내용이 아니니 주의해야합니다.

  • 클라우드 서비스(AWS, Azure)가 아닙니다. 오픈소스 프로젝트입니다.
  • 클라우드 서비스 프로바이더에 이식이 충분히 가능합니다.
  • 특정 클라우드 프로바이더, 서비스에 국한되지 않습니다.
  • 쿠버네티스는 도커 컨테이너의 대안은 아니며 같이 사용하기 좋습니다.
  • 유료 서비스가 아닙니다.

쿠버네티스는 여러 머신을 위한 Docker-Compose라고 볼 수 있습니다. 단일다중 컨테이너를 구성하고 여러 컴퓨터 여러 머신에서 사용가능하며 모니터링하죠. 도커 컴포즈의 윗 단계라고 볼 수 있겠네요.

컨셉 및 아키텍쳐

Pod (Container)는 쿠버네티스 세계관에서 가장 작은 단위이며 단순히 컨테이너를 보유합니다. 내부에 컨테이너가 있는 이 파드는 워커 노드에서 실행됩니다. 워커 노드를 가상 머신, 인스턴스라고 볼 수 있습니다. EC2 인스턴스 처럼요.
워커 노드는 특정 양의 CPU, GPU를 가지고 있으며 파드를 실행할 수 있습니다. 워커 노드 파드 외에도 프록시가 존재합니다. 워커 노드의 파드 네트워크 트래픽을 제어하며 기본적으로 인터넷 연결, 내부에서 실행되는 컨테이너를 외부에 어떻게 노출시킬 것인지 등을 프록시로 구성해야 합니다.
쿠버네티스로 작업 할때 하나 이상의 머신이 필요합니다. 일반적으로 다른 파드를 실행할 수 있는 워커노드가 필요하겠죠. 둘 이상의 서버가 필요할 수도 있으며 이 경우 스케일링도 필요하겠죠.
다른 워커 노드에 파드를 추가하고 제거하고 프록시로 연결 설정을 하고 이런 명령은 컨트롤 플레인을 가진 마스터 노드에서 수행합니다. 직접 파드를 생성하고 제거할 수 있지만 그렇게 사용하는 일은 드뭅니다. 쿠버네티스의 컨트롤 플레인이 그 역할을 전담하죠 원하는 종료 상태를 정의하면 쿠버네티스는 이를 감지하고 워커노드와 워커노드상 파드와 상호작용합니다. 더 큰 배포의 경우 고가용성 보장을 위해 여러 머신에 분활될 수 있는 마스터 노드가 존재하게 됩니다. 워커 노드는 다른 인스턴스(워커노드), 마스터 노드와 독립적인 다른 머신이 됩니다.
따라서 하나의 워커 노드가 다운되도 다른 워커 노드가 대체할 수 있습니다. 이 모든 것이 클러스터를 형성합니다. 마스터, 워커 노드 연결된 하나의 네트워크로 구성합니다.

쿠버네티스는 인프라를 관리하지 않는다.

쿠버네티스를 사용하기 위해서는 환경을 쿠버네티스를 사용하기 위한 환경을 구성해야합니다. 클러스터와 워커노드 쿠버네티스를 설치하고 마스터 노드를 설치하고 구성해야 합니다.
노드에 모든 쿠버네티스 소프트웨어를 설치하고 필요한 경우 부가 리소스(로드 밸런서)를 설치해야 합니다.
위와 같이 환경이 구성되고 나면 파드를 생성할 수 있습니다. 파드를 모니터링하고 재생성하고 스케일링을 합니다. 쿠버네티스를 컨테이너 배포를 위한 도커 컴포즈와 비슷합니다. 도커 컴포즈가 로컬 컴퓨터를 구성하지 않는 것처럼 쿠버네티스 또한 로컬 컴퓨터를 침범하지 않습니다. 로컬 컴퓨터를 사용해 컨테이너를 시작할 뿐이죠 원격 머신에서 쿠버네티스를 연동하기 위해 특정 환경이 필요합니다. 쿠버네티스를 배포하는 방법과 사용하는 법, 컨테이너 구성, 클러스터 구성에 대해 알아보도록 해봅시다.

워커노드

워커노드는 EC2인스턴스와 같습니다. 마스터 노드에서 관리하며 워커 노드 내부에 파드가 존재합니다. 파드는 하나이상의 앱 컨테이너 모든 리소스 호스팅, 볼륨 설정이 포함됩니다. 이러한 것은 마스터 노드 즉 쿠버네티스에 의해 관리됩니다. 파드를 생성하거나 삭제할 수 있죠. 파드가 생성되면 파드내 하나 이상의 컨테이너를 가질 수 있습니다. 컨테이너들이 사용할 볼륨도 사용할 수 있죠. 또한 다른 파드도 생성, 복제가 가능합니다. 워커 노드는 바로 로컬 컴퓨터, 로컬 머신이라고 볼 수 있습니다.
도커 설치도 필요합니다. 컨테이너를 생성하고 실행하는 파드에 포함되기 때문이죠. 그리고 워커 노드에 마스터 노드와의 통신 장치인 kubelet하는 또 다른 소프트웨어가 실행됩니다. 마스터 노드가 이 워커 노드의 파드를 제어할 수 있도록 합니다.
그리고 외부에 접근을 허용할 kube-proxy도 실행됩니다. 허용된 트래픽이 파드에 접근하고 허용된 트래픽만이 워커 노드를 떠날 수 있게 합니다. 이것이 워커 노드입니다.

AWS에는 이 쿠버네티스 정의를 위한 기능을 지원합니다. 실습시 이용해보도록 합시다.

마스터 노드

  • 마스터 노드엔 가장 중요한 서비스 API 서버가 실행됩니다. 워커노드의 kubelet과 통신하죠.
  • 스케쥴러가 실행됩니다. 파드를 모니터링하고 스케일링으로 인해 새 파드를 생성하는 도구이죠. 워커 노드에 무엇을 알려야 하는지 API 서버로 알립니다.
  • Kube-Controller-Manager라는 서비스로 워커 노드 전체를 감시하고 적당한 수의 파드를 가동 중인지 확읺여 스케쥴러와 API와 연동됩니다.
  • Cloud-Controller-ManagerAWS, Azure와 같은 클라우드 프로바이더에게 무엇을 해야하는지 전달합니다. 명령을 번역하고 클라우드 프로바이더에게 명령을 전달하죠. 즉 마스터와 워커 노드를 수동으로 생성하고 서비스를 모두 설치하지 않아도 됩니다.

중요 개념

  • 클러스터 : 노드 머신, 마스터, 워커노드, 배포 혹은 최종 상태를 구성을 포함
  • 노드 : 하나 또는 여러개 파드를 호스팅하는 하드웨어를 탑재하고 있으며 클러스터와 통신, 내에서 통신하는 물리적인 머신 혹은 가상머신입니다. 컨트롤 플레인, 파드를 관리 제어하는 마스터노드, 파드를 호스팅하고 앱 커테이너를 실행하는 워커노드가 있죠.
  • 파드 : 앱 컨테이너와 요구 리소스 컨테이너를 감싼 shell입니다. 컨테이너를 시작하고 관리하죠 관리 주체는 마스터 노드입니다. 파드가 생성되는 것은 파드에서 컨테이너를 실행하는 것과 같습니다.
  • 컨테이너 : 일반 Docker 컨테이너 파드가 내부적으로 docker run명령을 실행하죠
  • 서비스 : 고유한 파드, 컨테이너에 독립적 IP 주소를 가진 파드 그룹. 파드 접근 및 컨테이너 접근에 필요하며 프록시와 연관 관계가 있습니다. 외부로 노출시켜 특정 IP, 도메인으로 특정 파드에 연결할 수 있도록 합니다. 그냥 용어일 뿐입니다.