쿠버네티스?
쿠버네티스는 컨테이너 오케스트레이션을 위한 솔루션으로 여기서 오케스트레이션이란 복잡한 단계를 관리하고 요소들의 유기적인 관계를 미리 정의해 손쉽게 사용하도록 서비스를 제공하는 것을 의미합니다.
다수의 컨테이너를 유기적으로 연결, 실행, 종료할 뿐만 아니라 상태를 추적하고 보존하는 등 컨테이너를 안정적으로 사용할 수 있게 만들어주는 것이 컨테이너 오케스트레이션입니다.
쿠버네티스는 그 이름 자체가 하나의 긴 단어이기 때문에 문자 수를 표시하는 방법으로 약어를 만들어
k<ubernete = 8글자>s의 형식으로 k8s라고 부르기도 합니다.
쿠버네티스의 구성 요소 간 통신 방법
개발자나 관리자나 파드라는 것을 배포할 때 구성 요소의 연결 관계를 표현하면 다음 그림과 같습니다.
그림에 나와 있는 숫자는 실제로 관리자나 개발자가 파드 배포 명령을 수행했을 때 실행되는 순서로, 하나씩 살펴보도록 하겠습니다.
여기서 파드는, 한 개 이상의 컨테이너로 단일 목적의 일을 하기 위해서 모인 단위입니다. 즉, 웹서버 역할을 할 수도 있고, 로그나 데이터를 분석할 수도 있습니다. 여기서 핵심은 파드는 언제라도 죽을 수 있는 존재라는 것인데, 가상 머신은 언제라도 죽을 수 있다 가정하고 생성하지 않지만, 파드는 언제라도 죽을 수 있다고 가정하고 설계했다는 차이점이 있습니다.
쿠버네티스의 클러스트에서 마스터 노드와 워커 노드로 나뉘게 되는데, 마스터 노드는 전체 쿠버네티스 시스템을 관리하고 통제하는 시스템이며, 워커노드는 마스터에 의해 명령을 받아 실제 워크 로드를 생성하여 서비스하는 컴포넌트입니다.
마스터 노드
kubectl - 쿠버네티스 클러스터에 명령을 내리는 역할로, 다른 구성 요소들과 다르게 바로 실행되는 명령 형태로 배포되기 때문에, 마스터 노드에 있을 필요는 없지만, 통상적으로 주로 API 서버와 통신하므로 마스터 노드에 설정되어 있습니다.
API 서버 - 쿠버네티스 클러스터의 중심 역할을 하는 통로로서, 주로 상태 값을 저장하는 etcd와 통신하지만, 그 밖의 요소들 또한 API 서버를 중심에 두고 통신하므로 API 서버의 역할이 매우 중요합니다. 회사에 비유하면 모든 직원과 상황을 관리하는 관리자에 해당하게 됩니다.
etcd - 구성 요소들의 상태 값이 모두 저장되는 곳으로, 회사의 관리자가 모든 보고 내용을 기록하는 노트라고 생각하면 편합니다. 실제로 etcd 외 다른 구성 요소는 상태 값을 저장하지 않기 때문에, etcd의 정보만 백업돼 있다면 긴급한 장애 상황에서도 쿠버네티스 클러스트를 복구할 수 있습니다. 또한, etcd를 복제해 여러 곳에 저장해두면 하나의 etcd가 장애를 일으키더라도 복제된 곳들이 살아 있기 때문에 시스템의 가용성을 확보할 수 있습니다.
컨트롤러 매니저 - 쿠버네티스의 오브젝트 상태를 관리하는 것으로, 워커 노드에서 통신이 되지 않을 경우, 상태 체크와 복구는 컨트롤러 매니저에 속한 노드 컨트롤러에서 이루어집니다. 외에도 요청받은 파드 개수대로 파드를 생성하는 리플리카셋 컨트롤러, 서비스와 파드를 연결하는 역할을 하는 엔드포인트 컨트롤러 또한 컨트롤러 매니저에 속합니다.
스케줄러 - 노드의 상태와 자원, 레이블, 요구 조건 등을 고려해 파드를 어떤 워커 노드에 생성 할 것인지를 결정하고 할당하는 역할을 담당하고 있습니다.
워커 노드
kubelet - 파드의 구성 내용을 받아서 컨테이너 런타임으로 전달하고, 파드 안의 컨테이너들이 정상적으로 작동하는지 모니터링합니다.
컨테이너 런타임 - 파드를 이루는 컨테이너의 실행을 담당하고, 파드 안에서 다양한 종류의 컨테이너가 문제 없이 작동하게 만드는 표준 인터페이스입계 순니다.
외에 그림에서 보이는 네트워크 플러그인과 CoreDNS는 통신 관계 순서와 상관 없기 때문에 10번대로 구분지어 있습니다.
네트워크 플러그인 - 클러스터의 통신을 위해 네트워크 플러그인을 선택하고 구성해야 하는데, 이때 네트워크 플러그인은 일반적으로 CNI로 구성되어 있습니다.
CoreDNS - 빠르고 유연한 DNS 서버로, 클러스터에서 도메인 이름을 이용해 통신하는 데 사용하며, 실무에서 쿠버네티스 클러스터를 구성하여 사용할 때는 IP보다 도메인 네임을 편리하게 관리해 주는 CoreDNS를 사용하는 것이 일반적입니다.
파드가 배포된 이후 배포된 파드에 접속하는 과정
쿠버네티스 클러스트는 파드가 위치한 노드에 kube-proxy를 통해 파드가 통신할 수 있는 네트워크를 설정하게 됩니다.
이때 실제 통신은 br_netfilter와 iptables로 관리하게 되고, 네트워크 설정을 마친 배포된 파드에 접속하여 필요한 내용을 전달받게 됩니다. 이때 대부분 사용자는 파드가 어느 워커 노드에 위치하는지 신경 쓰지 않아도 됩니다.
'Devops' 카테고리의 다른 글
[Vagrant] 가상머신 설정 자동 구축하기 (0) | 2023.08.13 |
---|---|
[Vagrant] 기존 파일로 가상 머신 만들어보기 (0) | 2023.08.13 |
[Terraform] 단일 웹 서버 배포하기 (0) | 2023.08.06 |