쿠버네티스 어나더 클래스 (지상편) - Sprint 1, 2

컴포넌트 동작 흐름

쿠버네티스를 깊게 이해하기 위해서는 각 컴포넌트의 역할과 그 동작 흐름을 파악하는 것이 중요하다.

Pod 생성과 Probe 요청

kubernetes flow pod probe

1. Deployment 생성 요청

사용자가 kubectl을 통해 Deployment를 생성하면, kube-apiserver가 리소스 정보를 etcd에 저장한다.

2. ReplicaSet 및 Pod 생성

kube-controller-managerkube-apiserver를 통해 새로운 Deployment가 생성된 사실을 감지하고, 해당 Deployment에 대한 ReplicaSet을 생성한다. 이후 ReplicaSet을 기반으로 원하는 수의 Pod 생성 API 요청을 다시 kube-apiserver에 전달한다.

3. 스케줄링

kube-scheduler는 생성된 Pod들을 확인하고, 클러스터 내 각 노드의 자원을 모니터링한 뒤, 적절한 노드에 해당 Pod을 할당한다. 이때, nodeSelector, resources 등의 스펙도 고려된다.

4. Kubelet이 Pod 감지

각 노드의 kubelet은 자신에게 스케줄링된 Pod이 있는지 kube-apiserver를 통해 주기적으로 확인한다. 해당 Pod이 감지되면, container-runtime에게 컨테이너 생성을 요청한다.

5. Probe 요청 수행

컨테이너가 생성된 후, kubelet은 Pod에 설정된 readinessProbe, livenessProbe, startupProbe 정보를 기반으로 주기적인 헬스 체크를 수행한다. Probe 방식은 HTTP, TCP, Exec 중 하나로 구성되며, 이를 통해 애플리케이션의 상태를 지속적으로 점검한다.


Service 동작

kubernetes flow service

1. Service 설정

사용자가 Service 오브젝트를 생성하면서 type: NodePort를 지정하면, 해당 포트가 클러스터 노드에 개방된다.

2. 네트워크 생성 요청

kubelet은 Pod 생성 시, 네트워크 인터페이스를 생성하고 IP를 할당하며, 트래픽 경로와 네트워크 정책을 설정하기 위해 CNI 플러그인(Calico 등)을 호출한다.

3. 트래픽 라우팅 규칙 설정

kube-proxykube-apiserver를 통해 Service 정보를 감지하고, 해당 정보를 기반으로 iptables(또는 ipvs)에 트래픽 라우팅 규칙을 설정한다.

4. 트래픽 전달

외부에서 들어온 트래픽이 NodePort를 통해 들어오면, 설정된 iptables 규칙에 따라 적절한 Pod으로 전달된다. 이 과정에서 CNI가 설정한 네트워크 경로를 따라 트래픽이 해당 컨테이너로 전달된다.


HPA 동작

kubernetes flow hpa

1. CPU/Memory 조회

containerd는 실제 컨테이너의 자원 사용량(CPU, Memory 등)을 알고 있으며, kubelet은 이를 주기적으로 조회하여 리소스 사용 정보를 수집한다.

2. 사용량 수집

metrics-server는 각 노드의 kubelet으로부터 수집된 리소스 사용량 데이터를 주기적으로 받아 저장한다.

3. 임계값 및 metric 확인

kube-controller-manager는 HPA 설정 정보를 바탕으로metrics-server에 저장된 리소스 사용량을 확인한다. 이때, 설정된 임계값과 비교하여 스케일링이 필요한지를 판단한다.

4. 스케일링

사용량이 설정된 임계값을 초과하거나 부족할 경우, kube-controller-manager는 Deployment의 Replica 수를 자동으로 조정하여 Pod 수를 늘리거나 줄인다.


(참고)Secret 사용 시 주의사항

Kubernetes의 Secret은 민감한 정보를 저장하고 Pod에 주입하는 데 사용된다. 하지만 Secret을 사용할 때는 다음과 같은 동작 특성과 주의사항을 이해하고 있어야 한다.

1. Secret은 메모리 볼륨에 마운트된다

Secret을 volumeMount 형태로 마운트하면, 해당 파일은 노드의 메모리(tmpfs) 영역에 생성된다.
메모리는 휘발성 자원이기 때문에 전원이 꺼지면 사라지며, Secret을 많이 생성하고 마운트할 경우 노드 메모리를 많이 점유하게 된다.

2. Secret 수정은 실시간 반영되지 않는다

Secret 객체를 수정하더라도, 이를 마운트한 컨테이너에서는 즉시 반영되지 않는다. 이는 kubelet이 Secret을 주기적으로 감시(polling) 하여 변경사항을 감지한 후 해당 파일을 업데이트하기 때문이다.