본문 바로가기

Kubenetes/Kubernetes Internal

쿠버네티스 인터널 - 2 (컨트롤러의 상호 협력 방식)

2. 컨트롤러의 상호 협력 방식

 

2. 1. 관련된 컴포넌트의 이해

 

컨트롤러, 스케줄러, Kubelet은 각 리소스 유형의 변경 사항을 API 서버에서 감시하고 있다.

 

아래 그림에서 보이는 것과 같이 표시된 컴포넌트는 트리거하려는 프로세스의 일부를 수행한다. 아래 그림에는 etcd를 포함하지는 않는다. 왜냐하면 API 서버 뒤에 숨겨져 있기 때문이다. 그래서 API 서버를 개체가 저장되는 것으로 생각할 수 있다.

API 서버를 통해 API 객체를 감시하는 쿠버네티스 컴포넌트

 

2.2 이벤트 체인

 

Deployment 매니페스트가 포함하는 YAML 파일을 준비하고 이를 kubectl을 통해서 쿠버네티스에 제출한다고 고려할 때

kubectl은 쿠버네티스 API 서버로 HTTP POST 요청으로 매니페스트를 보낸다.

 

API 서버는 Deployment 명세를 확인하고 etcd에 저장한다. 그리고 kubectl에 응답한다. 이 이벤트 체인은 다음과 같다.

 

배포 리소스가 API 서버로 보내질 때 발생하는 이벤트 체인

 

ㅁ 레플리카셋(Replicaset)을 생성하는 디플로이먼트 컨트롤러(Deployment Controller)

 

 API 서버의 감시 메커니즘을 통해 디플로이먼트 목록을 감시하는 모든 API 서버 클라이언트는 새롭게 생성된 디플로이먼트 리소스를 즉시 통지한다. 그런 클라이언트 중 하나가 디플로이먼트 컨트롤러(디플리먼트를 책임지는 활성화 컴포넌트)

 

디플로이먼트는 하나 혹은 그 이상의 레플리카셋에서 이뤄지며, 실제 포드를 생성한다. 새로운 디플로이먼트 객체는 디플로이먼트 컨트롤러에 의해 감지되고 디플로이먼트 객체의 현재 스펙을 위한 레플리카셋을 생헝한다.

여기에는 새로운 레플리카셋 리소스를 쿠버네티스 API를 사용해 생성하는 것도 포함된다. 

 

ㅁ 포드 리소스를 생성하는 레플리카셋 컨트롤러 (Replicaset Controller)

 

새롭게 생성된 레플리카셋은 레플리카셋컨트롤러가 선택하여 레플리카셋 API 서버의 리소스 생성, 수정, 삭제를 감시한다. 컨트롤러는 레플리카셋에 정의된 레플리카 개수와 포드 셀렉터를 고려해 셀렉터에 맞는 포드가 충분한지 확인한다.

 

그 이후 컨트롤러는 레플리카셋의 포드 템플릿에 따라 포드 리소스를 생성한다.

 

ㅁ 새롭게  생성된 포드를 노드에 할당하는 스케줄러

 

새롭게 생성된 포드 정보는 etcd에 저장되지만 각 포드 정보에는 nodeName 속성이 설정되지 않았다. 스케줄러는 이런 포드를 감시하다가 발견했을 때 포드를 위한 최적의 노드를 선택하고 포드를 노드에 할당한다. 그 이후 포드의 정의에는 실행해야 하는 노드의 이름이 포함된다.

 

ㅁ 포드의 컨테이너를 실행하는 kubelet

 

특정 노드에 스케줄되는 포드와 함께 노드의 kubelet은 일을 시작한다. 

 

API 서버에서 포드의 변화를 감시하는 kubelet은 노드로 스케줄되는 새로운 포드를 살펴본다. 그래서 포드의 정의를 조사하고 포드의 컨테이너를 시작하기 위해 도커나 컨테이너 런타임 등에게 알려준다. 그런 후에 컨테이너 런타임은 컨테이너를 실행한다.

 

2.3 클러스터 이벤트 관찰

 

컨트롤 플레인 컴포넌트와 kubelet 모두 이런 액션을 수행하면서 API 서버로 이벤트를 내보낸다. 이벤트 리소스를 생성해 이런 동작을 한다. 이벤트 리소스는 다른 쿠버네티스 리소스와 같다. 

 

kubectl get events로 이벤트를 직접 감시할 수 있다.

 

$ kubectl get events --watch