실제 쿠버네티스에서 파드가 배포되는 흐름을 알기 전에 쿠버네티스의 몇가지 특징을 먼저 살펴본다.
선언적 API
쿠버네티스의 가장 큰 설계 원칙은 API가 선언적인 것이다. 선언적 API는 컨테이너가 원하는 상태를 선언하면 쿠버네티스는 계속해서 컨테이너의 상태를 확인하여 원하는 상태에 맞게 맞춘다는 것이다.
MSA 아키텍쳐
쿠버네티스는 마이크로서비스 아키텍쳐(MSA, Microservices Architecture)로 구성되어 있어 독립적인 여러 개의 서비스들로 이루어져 있다.
실제 쿠버네티스의 파드가 배포되는 흐름은 아래와 같다.
kubectl
명령어를 이용하여 파드 생성하는 명령어를 입력한다.Kubectl
명령어를 통해 API 서버
에 명령을 내린다. 이때 사용자는 kubectl
명령어가 아닌 API를 바로 이용할 수도 있다.API 서버
는 etcd
에 가장 먼서 정보를 동기화한다. etcd
는 API 서버
와 1대1로 동기화하기 때문에 만약 문제가 생기면 etcd
에 있는 정보를 복원하면 된다.컨트롤러 매니저
는 API 서버
와 통신하여 API 서버
의 값을 보고 파드 생성에 필요한 레플리카셋이나 여러 컨트롤하는 값들을 설정해둔다. 그리고 API 서버
에 업데이트한다. 이때 API 서버
가 먼저 컨트롤러 매니저
에게 파드 요청 메세지를 보내지 않고 파드가 잘 생성되었는지 감시하는 역할만 한다.스케줄러
는 API 서버
와 통신하여 실제 파드가 워커 노드가 밸런스있게 생성될 수 있도록 스케줄링 해준다. 이때도 마찬가지로 API 서버
는 스케줄러
에게 메세지를 보내지 않고 새로운 파드가 워커 노드에 잘 들어갔느지 감시하는 역할을 한다.Kubelet
이 API 서버
와 통신하여 파드를 생성해야 한다는 것을 알아차린다.Kubelet
이 컨테이너 런타임
에게 파드 생성 요청을 한다.컨테이너 런타임
이 파드를 생성한다.Kube-proxy
를 거친다.Kube-proxy
를 통해 파드와 통신이 가능하게 된다.이러한 네트워크는 사용자가 직접 선택하여 구성할 수 있는 영역이다. 이것을 컨테이너 네트워크 인터페이스
라고 하고 그 중에 CALICO
가 그 예시이다.
위의 동작 흐름을 살펴보면 API 서버
가 모든 흐름의 중심에 있다는 것을 볼 수 있다. API 서버
는 쿠버네티스 클러스터를 이루는 모든 것의 게이트웨이이고, 모든 것의 집합체이다.
=> API 서버
는 매우 중요한 요소이다.