쿠버네티스 아키텍처
이 글은 쿠버네티스의 창시자 중 한명인 브렌던 번스의 매니징 쿠버네티스를 참고해 작성했습니다.
기본 개념
이 단락에서는 쿠버네티스의 기본 구성 요소인 노드(node), 파드(pod), 서비스(Service), 퍼시스턴트 볼륨(Persistent Volume), 컨피그맵(ConfigMap), 시크릿(Secret)을 설명합니다.
노드
Node
Docker 데몬이 동작하는 호스트로 가상(virtual) 또는 물리(physical) 머신을 말합니다.
쿠버네티스는 하나 이상의 마스터와 워커(슬레이브, 미니언) 노드로 구성됩니다.
이중 클러스터 제어용 프로그램이 동작(API)하는 노드가 마스터 노드입니다.
노드 taint를 제거해 마스터/워커(미니언)을 겸용 가능하나 일반적으로 그렇게 사용하지 않습니다.
파드
pod는 고래 떼를 말합니다
파드는 쿠버네티스의 가장 작은 단위이자 컨테이너의 추성으로 하나 또는 긴밀하게 연계되는 컨테이너 세트를 생성할 수 있습니다.
파드는 각각 하나의 사설 ip를 할당받고, 같은 파드 안의 컨테이너는 루프백 네트워크(localhost)로 통신할 수 있습니다.
또한 프로세스, IPC와 네임스페이스를 공유하고 있어 공유 메모리나 시그널링 툴을 사용해
파드의 여러 프로세스를 제어할 수 있습니다.
파드는 하나의 컨테이너일 수도, 한 시스템일 수도 있어 헷갈릴 수 있습니다 (일반적으로 하나의 애플리케이션만 사용합니다). 쿠버네티스에서 파드는 스케일링과 복제의 단위입니다. 파드는 디플로이먼트에 기술해 상태와 레플리카를 관리할 수 있습니다.
주의해야할 점은, 파드는 단명(ephemeral) 하는 특징을 지녔다는 것입니다. 이는 노드에 문제가 생기거나, 자원이 모자라면 쿠버네티스가 파드를 다른 곳에 할당할 수 있다는 뜻입니다. 이때 사용하던 데이터와 할당된 사설 IP가 바뀌고 파드간 통신에 문제가 생길 수 있습니다. 다음 단락에서 이 문제를 어떻게 해결하는지 확인해 봅시다.
서비스
Service
서비스는 각 파드에 고정 IP 주소를 붙일 수 있는 요소입니다.
파드와 서비스의 생명주기는 연결되지 않기때문에, 파드의 변경에도 서비스는 고정된 주소를 제공합니다.
정확히는 레플리카셋으로 생성된 로드밸런서의 엔드포인트를 제공합니다.
또한, 서비스는 TCP/UDP에 없는 다음 세가지를 제공합니다.
자체 IP 주소
가상 IP 주소로 네트워크 인터페이스와 일치하지는 않습니다. 대신 로드 밸런싱될 IP 주소로 네트워크 패브릭에 프로그래밍 됩니다. 네트워크 패브릭은 레플리카셋에 따라 동적으로 재프로그래밍 됩니다. 즉, Service IP 주소 연결은 신뢰할 수 있습니다.
쿠버네티스 클러스터 DNS
클러스터의 다른 컨테이너가 name.namespace.svc로 DNS를 이용할 수 있습니다.
로드 밸런싱 규칙
규칙을 정하지 않으면 라운드 로빈이나 대상 IP 주소 튜플에 기반해 결정합니다.
쿠버네티스 구성 요소 묘사
스토리지
초기 볼륨 인터페이스는 코드를 작성해 확장이 가능했습니다. 이제는 쿠버네티스 외부에서 개발해 컨테이너 스토리지 인터페이스(CSI)를 사용합니다. 이는 이식성과 자동 볼륨 생성을 모두 가능하게 합니다.
퍼시스턴트 볼륨
persistent volume
구체적인 제공자를 지정하지 않고 일반적인 스토리지를 요청하는 경우,
파드 정의가 필요합니다. 이를 위해 pv와 pvc(persistent volume claim)을 제공합니다.
스토리지는 같은 환경(local) 뿐만 아니라, 클러스터 밖의 외부 스토리지도 사용할 수 있습니다. 주의할점은, 쿠버네티스는 이들을 관리하지 않는다는 것입니다.
컨피그맵
ConfigMap
컨피그맵은 외부 설정(External Configuration)의 모음을 나타냅니다.
파드에 컨피그맵 기반 볼륨을 추가하면 실행중인 컨테이너의 지정된 디렉터리에 나타납니다.