목차
- 쿠버네티스의 구조
- 각 구성 요소의 특징
- 구성 요소 끼리의 통신
- 각 구성 요소의 인스턴스 실행 방식 차이
- 구성 요소 실행 방법
쿠버네티스의 구조
이전에 설명드렸던 쿠버네티스는 다음과 같은 구조로 되어 있습니다. 구성 요소들은 모두 개별 프로세스로 실행되고, 다음 그림에는 구성요소와 구성 요소 간의 종속성 또한 표현이 되어 있습니다.
쿠버네티스가 제공하는 기능을 온전히 사용하기 위해 이러한 구성요소들은 모두 실행 중이어야 합니다. 그러나 일부는 다른 구성 요소 없이도 개별적으로 유용한 작업을 실행할 수 있는데, 각 구성요소가 어떻게 작동하는지 살펴보려합니다.
각 구성 요소의 특징
- etcd
Kubernetes 컨트롤 플레인의 기본 데이터 저장소 역할을 하는 분산 키-값 저장소입니다. 이는 클러스터의 구성 데이터와 상태를 보유하여 클러스터의 상태가 일관되고 가용성이 높도록 보장하므로 Kubernetes의 중요한 구성 요소입니다. Etcd는 분산 시스템에서 고가용성과 내결함성을 유지할 수 있는 Raft 합의 알고리즘을 기반으로 합니다.
Kubernetes 클러스터(위 사진)에서 etcd는 배포된 애플리케이션의 현재 상태, 원하는 상태, 클러스터 관리에 필요한 메타데이터와 같은 정보를 저장합니다. API 서버, 스케줄러 및 컨트롤러 관리자와 같은 Kubernetes 컨트롤 플레인 구성 요소는 etcd와 상호 작용하여 이 정보를 읽고 업데이트합니다. - API 서버
Kubernetes 클러스터 내의 사용자, 관리자 및 기타 구성 요소 간의 기본 상호 작용 지점입니다. API 서버는 RESTful API 요청을 처리하고 유효성을 검사하며 etcd 데이터 저장소의 해당 개체를 업데이트합니다.
API 서버는 클러스터의 상태를 관리하고 Kubernetes 컨트롤 플레인의 일관성, 보안 및 안정성을 보장하는 데 중요한 역할을 합니다. 사용자 및 구성 요소가 Kubernetes 클러스터와 상호 작용하여 인증, 권한 부여, 유효성 검사 및 승인 제어를 처리하는 기본 인터페이스 역할을 합니다. - 스케줄러
스케줄러는 새로 생성되거나 예약되지 않은 파드를 클러스터 내의 적절한 노드에 할당하는 쿠버네티스 컨트롤 플레인의 핵심 구성 요소입니다. 주요 기능은 리소스 가용성, 제약 조건 및 정의된 정책을 기반으로 포드를 실행할 위치를 지능적으로 결정하여 워크로드가 클러스터 전체에 효율적으로 분산되도록 하는 것입니다.
Kubernetes 클러스터 내에서 워크로드 및 리소스 활용의 효율적인 분산을 보장하는 데 중요한 역할을 합니다. 사용 가능한 리소스를 평가하고 제약 조건과 정책을 준수하며 확장 가능한 일정 알고리즘을 사용하여 포드 배치에 대한 지능적인 결정을 내립니다. - 컨트롤러 매니저
컨트롤러 관리자는 클러스터의 원하는 상태를 자동화하고 유지 관리하는 다양한 컨트롤러를 관리하는 Kubernetes 제어 평면의 핵심 구성 요소입니다. 컨트롤러는 클러스터의 현재 상태를 지속적으로 모니터링하고 구성 파일 또는 API 개체에 지정된 원하는 상태와 일치하도록 필요한 조정을 수행하는 제어 루프입니다.
Kubernetes 클러스터의 원하는 상태를 자동화하고 유지 관리하는 데 중요한 역할을 합니다. 여러 컨트롤러를 동시에 실행하며 각 컨트롤러는 클러스터의 특정 측면을 관리합니다. 클러스터의 상태를 지속적으로 모니터링하고 이벤트에 반응함으로써 컨트롤러 관리자는 원하는 상태가 적용되고 리소스가 효율적으로 활용되며 클러스터가 오류 및 기타 예기치 않은 이벤트에 대한 복원력을 유지하도록 합니다. - kube-proxy
kube-proxy는 Kubernetes 클러스터의 각 작업자 노드에서 실행되는 중요한 구성 요소로, 서비스와 포드 간의 적절한 네트워크 통신을 보장합니다. 로드 밸런싱 및 서비스 검색을 달성하기 위해 네트워크 규칙을 유지하고 연결을 프록싱하여 Kubernetes Service 개념의 일부를 구현하는 일을 담당합니다.
kube-proxy는 각 작업자 노드에서 부하 분산, 서비스 검색 및 네트워크 규칙 유지 관리를 담당하는 Kubernetes 네트워킹의 필수 구성 요소입니다. kube-proxy는 서비스와 포드 간의 네트워크 통신을 관리하여 클러스터가 효율적이고 안정적으로 작동하도록 합니다. - Kubelet
kubelet은 Kubernetes 클러스터의 각 노드에서 실행되는 중요한 구성 요소로, 컨테이너가 포드 내에서 예상대로 실행되도록 하는 역할을 합니다. 컨트롤 플레인과 통신하고 노드에서 컨테이너의 수명 주기를 관리하는 기본 노드 에이전트 역할을 합니다.
kubelet은 각 노드에서 실행되는 필수 구성 요소로, 컨테이너의 수명 주기를 관리하고 포드 내에서 예상대로 작동하도록 합니다. kubelet은 상태 확인을 수행하고, 리소스를 관리하고, 컨트롤 플레인과 통신함으로써 Kubernetes 클러스터의 안정성과 효율성을 유지하는 데 도움이 됩니다.
구성 요소 내 통신
쿠버네티스 시스템 구성 요소는 오직 API 서버하고만 통신하게 됩니다. 즉, 서로 직접 통신은 불가능합니다. 위 그림에서 알 수 있듯이, etcd와 통신하기 위해서는 API 서버를 꼭 거쳐야합니다. 따라서 다른 구성 요소는 API 서버로 클러스터 상태를 변경하게 됩니다.
위 사진을 보면 알 수 있듯이 API서버와 다른 구성 요소 사이의 통신은 대부분 다른 구성 요소에서 시작합니다. 하지만 다음 몇가지 경우에서는 API 서버가 Kubelet에 접속하게 됩니다.
- kubectl을 사용해 log를 가져오는 경우
- kubectl attach로 실행 중인 컨테이너에 연결할 때
- kubectl port-foward를 실행할 때
각 구성 요소의 인스턴스 실행 방식 차이
각 컨트롤 플레인 구성 요소 인스턴스를 둘 이상 실행해 가용성을 높일 수 있습니다. 이 때 etcd, API서버와 스케줄러, 컨트롤러 매니저는 약간의 차이가 있습니다.
- etcd, API 서버 : 여러 인스턴스를 동시에 활성화해 작업을 병렬로 수행할 수 있습니다.
- 스케줄러, 컨트롤러 매니저 : 여러 인스턴스를 실행가능 하지만 하나의 인스턴스만 활성화 되고 나머지는 대기 상태에 들어갑니다.
구성 요소 실행 방법
먼저 시스템에 직접 배포하거나 파드로 실행하는 것은 마스터에서 가능합니다. 하지만 kube-proxy의 경우 마스터가 아니더라도 이것이 가능합니다. 이러한 특징은 kubelet에 대해 알고나면 이해가 되리라 생각됩니다.
kubelet은 항상 일반 시스템 구성 요소로 실행되는 유일한 구성 요소이며, kubelet이 다른 구성 요소를 파드로 실행하게 됩니다. 컨트롤 플레인 구성 요소를 파드로 실행하기 위해 kubelet도 마스터 노드에 배포 됩니다. 위 사진에서 보이는 것처럼 모든 컨트롤 플레인 구성 요소는 마스터 노드에서 파드로 실행되고 있는데, 두 개의 워커 노드는 kube-proxy를 실행해 파드를 위한 오버레이 네트워크를 제공하게 됨으로 직접 배포나 파드 실행이 가능하게 되는 것 입니다.
Flannel 파드도 kube-proxy와 같은 작용을 하는데 이 내용은 다음에 다루도록 하겠습니다. 다음 포스팅에서는 기본 구성요소인 파드(pod)에 대해 먼저 다루고, 이후에 Docker에 대해서 조금더 살펴보고 오늘 다뤘던 각 구성요소의 특징과 기능들을 하나씩 잘근잘근 씹어먹어 보겠습니다.
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubectl 명령어 모음 [1] 생성, 삭제, 복사 (0) | 2023.04.02 |
---|---|
[Kubernetes] Kubernetes가 애플리케이션을 배포, 운영하는 방식 (0) | 2023.04.02 |
[Kubernetes] 쿠버네티스 VM에 설치하기 (0) | 2023.03.30 |
[Kubernetes] 쿠버네티스의 구성 요소 (0) | 2023.03.30 |
[Kubernetes] 왜 쿠버네티스를 사용하는가? (쿠버네티스 장점) + 개인적으로 생각하는 팁 (0) | 2023.03.29 |