새소식

Recent Study/Kubernetes 학습과정

19. Component : kube - apiserver, etcd, kube - schedule, kube - proxy, kube-controller-manager

  • -

 k8s는 한 대의 Master, Workers 노드들로 구성이 되는데, Master에는 Control plane Component라고 k8s 주요 기능들을 담당하는 컴포넌트들이 있고, Worker Node Component라고 해서 컨테이너를 관리하기 위한 기능들이 있습니다.

Pod 생성 예제 및 컴포넌트 기능 설명

[ Pod 생성 예제 ]

 먼저 Master 노드에는 위와 같이 Etcd, kube-scheduler, kube-apiserver가 있는데 일반적인 설치를 했을 때 이 컴포넌트들은 Pod의 형태로 띄워져서 구동 중인 상태입니다. k8s가 기동시에 /etc/kubernetes/manifests 있는 위 3개의 .yaml 파일을 읽어서 이 Pod들을 static으로 띄웁니다. Worker 노드에는 kubelet, Container Runtime인 Docker가 구동중인 상태입니다.

 

 만약 사용자가 kubectl 명령으로 Pod 생성 요청을 날렸다고 가정했을 때 먼저 Pod 생성 명령은 kube-apiserver로 전달이 되고, 이는 Etcd에 있는 해당 Pod에 대한 입력 정보들을 저장해둡니다. (Etcd는 k8s에서 여러 데이터들을 저장하는 DB 역할) 이후 kube-scheduler로 넘어와서 수시로 각각의 노드의 자원들을 체크하고 있습니다. 추가로 Watch라는 기능이 있는데 kube-apiserver를 통해 Etcd에 Pod 생성 요청이 들어온 것이 있는지, 없는지 감시하고 있습니다. 위처럼 Pod 생성 요청이 있는 것을 발견하고, 현재 노드 자원 상태를 확인하고 해당 Pod가 어떤 노드로 가는 것이 좋을지 판단하여 Pod에 노드 정보를 붙여줍니다.

 

 각각의 노드에 있는 kubelet은 큐브 api 서버에 Watch라는 것이 있고, Pod에 자신의 노드 정보가 있는지 체크하고 있다가 붙어있다면, 이 정보를 가져와서 Pod를 만들게 됩니다. 이때 2가지 일을 하고, (1) Docker에게 컨테이너를 만들라고 요청을 하면 Docker가 바로 컨테이너를 만들어줍니다. 아까 말했던 /manifests에 kube-proxy.yaml 라는 컨트롤을 만드는 파일이 있고, 이 yaml 파일은 DaemonSet 이라서 모든 노드에 kube-proxy의 Pod가 생성되어있습니다. kubelet은 이 kube-proxy에게 Create Network 요청을 하고, kube-proxy가 새로 생성된 Container에 통신이 되도록 도와줍니다. 

 

 

Deployment 생성 예제 및 컴포넌트 기능 설명

 

[ Deployment 생성 예제 ]

 다른 컴포넌트들과 마찬가지로 manifests 폴더에 kube-controller-manage.yaml이 있어서, Controller Manager Pod가 띄워져 있고, 이 안에 여러 컨트롤러들에 대한 기능이 각각의 스레드 형태로 돌아가고 있습니다. 이제 사용자가 kubectl 명령어로 replicas 2 옵션을 줘서 생성을 한다고 가정해보겠습니다. 먼저 kube-apiserver로 전달이 되고, Etcd에 정보가 저장됩니다. 한편 Controller Manage의 deployment 스레드는 kube-apiserver에게 deployment 관련 정보가 들어오면 본인에게 알려달라는 Watch를 걸어 놓고 있는 상태인데, deployment 스레드가 이 내용을 읽고 다시 kube-apiserver에게 ReplicaSet을 만들어달라고 요청합니다. 

 

 그럼 다시 ReplicaSet이 ReplicaSet Object가 있는지 Watch를 걸고 있어서, 감지한 후 ReplicaSet 안에 Replicas가 몇 개 있는지 확인한 후 그만큼 Pod를 만들라고 요청을 합니다. 이때 kube-scheduler는 노드가 할당되지 않은 Pod를 감지하고, 현재 노드들의 자원을 고려해서 Pod들에게 스케줄링 될 노드를 할당합니다. 각 노드에 있는 kubelet은 본인에게 할당된 Pod 감지 후 Pod안에 컨테이너를 Docker에게 생성하도록 시킵니다. 하고 이후 과정은 위 예제와 같습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.