kube-apiserver?

kube-apiserver는 Kubernetes Cluster를 구성하데 필수적인 컴포넌트로, Cluster를 구성하는 컴포넌트들과 통신을 통해 최신의 상태를 유지할 수 있도록 합니다.

운용자가 kubectl을 통해 CLI 명령을 한다면, kubectl은 사용자의 인증을 진행한 후 변수에 설정된 kube-apiserver주소로 REST Query를 수행합니다. 운용자가 kubectl get node명령어를 통해 현재 cluster에 join 한 노드들의 정보를보려고 한다고 가정하겠습니다. kubectl은 가장 먼저 kube-apiserver는 요청의 정당성을 확인 한 후, kubectl을 통해 요청한 정보 처리를 위해 관련된 정보를 etcd에 쿼리하여 정보를 받아서 운용자에게 응답합니다.

REST Server

kube-apiserver로 REST API로 query를 한다고 했듯이, kube-apiserver는 REST API를 제공하고 있어, 해당하는 서버로 직접 통신할 수 있습니다. 운용자는 curl과 같은 REST Client를 통해서 인증 과정을 거친 후 Pods create와 같은 명령을 REST Client를 통해서 할 수 있습니다.

kube-scheduler

kube-schedulerkube-apiserver를 계속해서 모니터링합니다. kubectl get pod와 같이 GET operation이 아닌 Pod를 생성하는 명령이 진행된다면 kube-apiserver는 에kube-scheduler Pod 생성이라는 이벤트를 전달합니다. kube-scheduler는 가용 가능한 Node들을 확인하고 해당 노드를 회신합니다.

kube-apiserver는 Node정보를 획득한 후 etcd에 상태업데이트 후 Node에 설치되어 있는 kubelet에 Pod생성을 요청합니다. kubelet는 Worker Node에 설치되어있는 컨테이너 런타임(CRI-O, Containerd, Docker 등)을 통해 Pod를 생성 후 kube-apiserver에 결과를 통보합니다. kubelet으로 부터 정보를 받은 후에는 다시 etcd에 상태정보를 업데이트합니다.

Pod 생성과 같은 작업 뿐만 아니라 그 외에 많은 Cluster 관리 명령들은 위 예시와 대동소이하게 동작합니다. 설명 중간에 etcd 조회 및 업데이트 작업이 있는데, kube-apiserver는 타 컴포넌트들과의 오케이스트레이션을 담당하기 때문에 etcd에 대한 업데이트 권한은 kube-apiserver밖에 없습니다. 이처럼 kube-apiserver는 클러스터를 구성하는 Control Plane Components들의 오케스트레이션을 담당하는 중요한 역할을 수행합니다.