K8s 클러스터 아키텍처

Jun Hwang

Kubernetes Cluster Architecture

구름은 언제나 하늘에 떠 있었지만, 이제 클라우드 없는 세상을 상상하기 어렵게 됐습니다. 바람은 구름을 움직이고, 쿠버네티스 (Kubernetes, K8s)는 클라우드를 움직입니다.

Tyk APIM은 K8s 플랫폼과 유연하게 연동됩니다.

K8s 없이는 클라우드를 조율할 수 없으니 기본 중의 기본; K8s 클러스터의 아키텍처와 각 컴포넌트들의 핵심 기능을 알아봅니다.

K8s 클러스터 아키텍처.png

마스터 노드는 Kubernetes 클러스터의 전반적인 관리를 담당하며; 통신, 스케줄링 및 컨트롤러를 처리하는 세 가지 컴포넌트: Kube API 서버, 스케줄러, 그리고 컨트롤러 관리자로 구성됩니다.

Kube API 서버를 사용하면, 이름에서 알 수 있듯이, Kubernetes API와 상호 작용할 수 있습니다. 이 Kube API 서버는 Kubernetes 제어 평면의 프런트엔드입니다.

스케줄러는 생성된 Pods를 감시하며 아직 Node 설계가 되지않은 Pod를 생성하고 특정 Node에서 실행되도록 Pod를 설계합니다.

컨트롤러 관리자는 컨트롤러를 실행합니다. 이들은 클러스터에서 작업을 실행하는 백그라운드 스레드입니다. 컨트롤러에는 실제로 다양한 역할이 있지만 모두 단일 바이너리로 컴파일됩니다. 이들 역할에는 worker의 상태를 담당하는 노드 컨트롤러, 복제된 컨트롤러에 대해 올바른 수의 Pods를 유지 관리하는 책임을 지는 리플리케이션 컨트롤러, 서비스와 포드를 함께 연결하는 엔드포인트 컨트롤러가 포함됩니다. 그리고 액세스 관리를 처리하는 서비스 계정 및 토큰 컨트롤러. 마지막으로, 저장된 간단한 분산 키 값인 CD가 있습니다. Kubernetes는 etcd를 데이터베이스로 사용하고 모든 클러스터 데이터를 여기에 저장합니다. 저장될 수 있는 정보 중 일부는 작업 일정 정보, Pod 세부 정보, 단계 정보 (stage info) 등입니다. - Pod Lifecycle 여기까지가 마스터 노드입니다.

여러분은 Kubernetes용 커맨드라인 인터페이스인 Kubectl 애플리케이션을 사용하여 마스터 노드와 상호 작용하게 됩니다. Kubectl에는 Kubeconfig라는 설정 파일이 있습니다. 이 파일에는 서버 정보와 API 서버에 접근하기 위한 인증 정보가 있습니다. 하지만, 작업자 노드 없이는 아무것도 할 수 없습니다. 이러한 작업자 노드는 여러분의 애플리케이션이 작동하는 노드입니다. 작업자 노드는 마스터 노드와 다시 통신합니다. 작업자 노드와의 통신은 Kubelet 프로세스에 의해 처리됩니다. 작업자 노드는 Pod가 노드에 맞게 설계되었는지 확인하기 위해 API 서버와 통신하는 에이전트입니다.

작업자 노드는 컨테이너 엔진을 통해 Pod 컨테이너를 실행합니다. Pod 볼륨 및 시크릿을 탑재하고 실행합니다. 그리고 마지막으로 노드에 탑재된 포드의 상태를 인지하고 Master에게 다시 응답합니다. Kubelet이 작업자 노드에서 올바르게 작동하지 않으면 문제가 발생한다고 여기는 것이 안전합니다. Kubernetes는 컨테이너 오케스트레이터이므로 작업자 노드에서 실행 중인 컨테이너 기본 플랫폼이 있어야 합니다. 그래서 이 지점에서 Docker가 도입되어서 Kubelet과 함께 작동하여 노드에서 컨테이너를 실행합니다.

다음으로 이야기할 프로세스는 Kube-proxy입니다. 이 프로세스는 단일 작업자 노드에서 서비스에 대한 네트워크 프록시이면서 로드 밸런서입니다. TCP 및 UDP 패킷에 대한 네트워크 라우팅을 처리하고 연결 전달 (connection forwarding)을 수행합니다.
Docker Daemon이 있으면 컨테이너를 실행할 수 있습니다. 애플리케이션의 컨테이너들은 Pod에서 단단하게 결합됩니다. 공식문서에 정의된 것처럼, Pod는 Kubernetes에서 배포 (deployment)로 예약할 수 있는 가장 작은 단위입니다. 이 컨테이너 그룹은 무엇보다도 스토리지, Linux 네임 스페이스, IP 주소를 공유합니다. 그들은 같은 위치에 함께 있으며 항상 같이 스케줄된 리소스를 공유합니다. 포드가 배포되고 실행되면 Kubelet 프로세스는 포드와 통신하여 상태 및 상태를 확인하고 Kube-proxy는 통신을 원할 수 있는 다른 리소스도부터 포드로 모든 패킷을 라우팅합니다. 작업자 노드는 로드 밸런서를 통해 인터넷에 노출될 수 있습니다. 그리고 노드로 들어오는 트래픽도 Kube-proxy 의해 처리되며, 이는 최종 사용자가 Kubernetes 애플리케이션과 대화를 종료하는 방식입니다.