kubernetes 구조 #2
kubernetes의 구조를 이해해보자

Data Plane
Kubernetes의 Data Plane은 클러스터에서 실제로 애플리케이션 워크로드가 실행되고, 데이터 트래픽이 처리되는 영역입니다. Control Plane이 클러스터의 제어와 관리 기능을 담당하는 반면, Data Plane은 그 명령에 따라 실질적인 작업을 수행합니다.
Data Plane은 주로 노드(Node), 파드(Pod), **컨테이너(Container)**를 포함한 여러 요소들로 구성되며, 애플리케이션의 트래픽 처리와 리소스 사용을 관리합니다. 여기서 Kubernetes는 스케줄링된 파드를 실제로 실행하고, 애플리케이션과 데이터 간의 네트워크 트래픽을 처리하는 작업이 일어납니다.
Kubernetes Data Plane 구성 요소
1. 노드 (Node)
Kubernetes 클러스터에서 노드는 컨테이너화된 애플리케이션이 실제로 실행되는 물리적 또는 가상 머신입니다. 클러스터에는 여러 개의 노드가 있으며, 각 노드에는 다양한 파드가 배치되어 실행됩니다.
노드는 Control Plane과 통신하며, Control Plane의 명령에 따라 작업을 수행합니다.
노드 구성 요소:
Kubelet: 각 노드에 설치된 에이전트로, 노드에서 실행 중인 파드 및 컨테이너 상태를 관리합니다.
컨테이너 런타임: Docker, containerd와 같은 컨테이너 런타임을 통해 파드 내 컨테이너를 실행합니다.
Kube-proxy: 네트워크 프록시로, 클러스터 내 서비스 간 네트워크 트래픽을 처리하고, 각 파드의 네트워크 규칙을 관리합니다.
2. 파드 (Pod)
**파드(Pod)**는 Kubernetes에서 애플리케이션의 최소 실행 단위로, 하나 이상의 컨테이너를 그룹으로 묶어 실행합니다. 파드는 컨테이너들이 같은 IP 주소를 공유하며, 같은 스토리지를 사용하는 단위입니다. 각 파드는 클러스터의 노드에서 실행됩니다.
파드의 주요 특징:
공유 네트워킹: 파드 내 컨테이너들은 동일한 네트워크 네임스페이스를 공유하며, 서로 localhost를 통해 통신할 수 있습니다.
공유 스토리지: 파드 내 컨테이너는 공유 볼륨을 통해 데이터 접근이 가능합니다.
수명 주기 관리: 파드는 일시적인 객체로, 주로 한 번 배포되면 자원이 부족하거나 새로운 배포가 필요할 때 삭제되고 다시 생성됩니다.
파드는 Kubernetes Data Plane에서 실제로 애플리케이션을 실행하는 단위이며, Control Plane에서 받은 명령을 수행합니다.
3. 컨테이너 런타임 (Container Runtime)
컨테이너 런타임은 파드 내에서 컨테이너를 실행하고 관리하는 소프트웨어입니다. Kubernetes는 여러 컨테이너 런타임을 지원하며, 이를 통해 실제로 애플리케이션 컨테이너가 실행됩니다.
주요 컨테이너 런타임:
containerd: Docker의 하위 계층으로 시작된, 경량화된 컨테이너 런타임.
CRI-O: Kubernetes의 CRI(Container Runtime Interface)와 OCI(Open Container Initiative) 표준을 따르는 경량 런타임.
Docker: 컨테이너화를 위해 많이 사용되었으나, 최근에는 containerd와 같은 런타임으로 대체되고 있습니다.
컨테이너 런타임은 컨테이너 이미지에서 컨테이너를 생성하고 실행시키며, 이를 통해 애플리케이션이 실제로 동작할 수 있게 합니다.
4. kubelet
Kubelet이란?
Kubelet은 Kubernetes 클러스터에서 각 노드(Node)에서 실행되는 핵심 에이전트(Agent)로, 컨테이너가 정상적으로 실행되도록 관리하는 역할을 합니다. Kubernetes의 Control Plane이 노드에 워크로드를 배포하면, Kubelet이 이를 받아서 컨테이너를 실행하고 모니터링합니다.
1. Kubelet의 핵심 역할
Kubelet은 기본적으로 노드에서 실행되며, 다음과 같은 역할을 수행합니다.
(1) Pod 실행 및 관리
Kubernetes API 서버 (kube-apiserver) 로부터 PodSpec을 받아서 컨테이너를 실행합니다.
PodSpec에는 실행할 컨테이너의 정보(이미지, 리소스 요청, 네트워크 설정 등)가 포함됩니다.
Kubelet은 이 정보를 기반으로 컨테이너 런타임(Container Runtime, 예: Docker, containerd, CRI-O 등)을 통해 컨테이너를 실행합니다.
(2) 컨테이너 상태 모니터링
실행 중인 컨테이너의 상태를 주기적으로 확인합니다.
컨테이너가 비정상적으로 종료되거나, 헬스 체크(Health Check, Readiness & Liveness Probe)를 통과하지 못하면, 이를 감지하여 재시작하거나 경고를 보냅니다.
(3) Kubernetes API 서버와 통신
Kubelet은 주기적으로 kube-apiserver에 현재 노드의 상태와 실행 중인 Pod 정보를 보고합니다.
Control Plane이 새로운 워크로드를 배포하면, Kubelet이 이를 받아 실행합니다.
(4) 노드 및 리소스 관리
CPU, 메모리, 네트워크 등 노드의 리소스를 모니터링하고, Pod에게 할당된 리소스가 적절하게 사용되는지 확인합니다.
특정 Pod가 과도한 리소스를 사용하면 이를 제한하거나, OOM(Out of Memory) 발생 시 해당 Pod를 종료합니다.
(5) Pod의 라이프사이클 관리
Pod이 정상적으로 실행될 수 있도록 다양한 상태 변경을 감지하고 조치합니다.
노드가 종료되거나 장애가 발생하면 해당 노드의 Pod를 종료하고 다른 노드로 이동할 수 있도록 Kubernetes와 협력합니다.
2. Kubelet의 작동 방식
Kubelet은 다음과 같은 주요 컴포넌트들과 상호작용하면서 동작합니다.
(1) 컨테이너 런타임과 상호작용
Kubelet은 Container Runtime Interface (CRI) 를 사용하여 컨테이너 런타임과 통신합니다.
지원하는 컨테이너 런타임:
Docker (과거 사용, Kubernetes 1.20부터 공식적으로 deprecated)
containerd (현재 Kubernetes 기본 런타임)
CRI-O
기타 CRI 호환 런타임
(2) Pod 실행 과정
kube-apiserver에서 PodSpec을 가져옴
Kubelet은 kube-apiserver와 통신하여 현재 노드에 할당된 PodSpec을 가져옵니다.
컨테이너 런타임을 통해 컨테이너 생성
Kubelet은 컨테이너 런타임에게 PodSpec을 전달하여 컨테이너를 생성하고 실행시킵니다.
네트워크 및 볼륨 설정
CNI(Container Network Interface)를 사용하여 네트워크를 설정하고, 필요한 볼륨을 마운트합니다.
Pod 상태 주기적 체크
컨테이너가 정상적으로 실행 중인지 확인하고, 필요하면 재시작합니다.
Pod 상태를 kube-apiserver에 보고
실행 중인 컨테이너의 상태 정보를 주기적으로 kube-apiserver에 전달합니다.
3. Kubelet이 실행되지 않으면?
해당 노드에서 새로운 Pod를 실행할 수 없습니다.
기존에 실행 중이던 Pod의 상태를 Kubernetes가 확인할 수 없기 때문에, 일정 시간이 지나면 해당 노드가 "NotReady" 상태로 표시됩니다.
Kubernetes는 다른 노드에서 해당 Pod를 재배치할 수 있습니다.
4. Kubelet의 주요 설정 파일 및 명령어
(1) Kubelet 설정 파일
Kubelet의 설정 파일은 일반적으로 /var/lib/kubelet/config.yaml
또는 /etc/kubernetes/kubelet.conf
에 위치합니다. 주요 설정 항목은 다음과 같습니다.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: 0.0.0.0
port: 10250
authentication:
anonymous:
enabled: false
webhook:
enabled: true
cgroupDriver: systemd
runtimeRequestTimeout: "2m"
(2) Kubelet 실행 명령어
Kubelet은 일반적으로 systemd
서비스로 실행되며, 명령어는 다음과 같습니다.
Kubelet 상태 확인:
systemctl status kubelet
Kubelet 시작:
systemctl start kubelet
Kubelet 로그 확인:
journalctl -u kubelet -f
5. Kubelet과 관련된 주요 개념
(1) Readiness Probe & Liveness Probe
Kubelet은 컨테이너가 정상적으로 동작하는지 확인하기 위해 Readiness Probe와 Liveness Probe를 사용합니다.
Readiness Probe: 서비스 트래픽을 받기 전 준비 상태를 확인하는 검사
Liveness Probe: 컨테이너가 정상적으로 실행 중인지 확인하는 검사
(2) Static Pod
Kubelet이 직접 관리하는 Pod로, kube-apiserver 없이도 실행할 수 있음.
/etc/kubernetes/manifests/
디렉토리에 YAML 파일을 배치하면 자동 실행됨.
apiVersion: v1
kind: Pod
metadata:
name: static-pod-example
spec:
containers:
- name: nginx
image: nginx
6. Kubelet과 관련된 주요 포트
Kubelet은 여러 포트를 사용하여 Kubernetes 컴포넌트 및 외부 도구들과 통신합니다.
10250
Kubelet API 서버 (TLS 사용)
10255
Kubelet Read-Only API (Kubernetes 1.20 이후 폐기됨)
4194
cAdvisor (컨테이너 리소스 모니터링)
7. Kubelet의 주요 옵션
Kubelet 실행 시 다양한 옵션을 설정할 수 있습니다.
kubelet \
--kubeconfig=/etc/kubernetes/kubelet.conf \
--container-runtime=remote \
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock \
--network-plugin=cni \
--cgroup-driver=systemd
--kubeconfig
kube-apiserver와 통신할 인증 정보
--container-runtime
사용할 컨테이너 런타임 (docker, containerd 등)
--network-plugin
사용할 네트워크 플러그인 (CNI)
--cgroup-driver
cgroup 드라이버 설정 (systemd 또는 cgroupfs)
8. 정리
Kubelet은 Kubernetes 클러스터에서 각 노드에서 실행되며, Pod와 컨테이너를 관리하는 핵심 에이전트입니다.
컨트롤 플레인과 통신하여 PodSpec을 받아 컨테이너를 실행하고 모니터링합니다.
컨테이너 런타임(Docker, containerd 등)과 상호작용하여 실제 컨테이너를 실행합니다.
노드의 리소스를 모니터링하고, 필요한 경우 컨테이너를 재시작하거나 종료합니다.
Kubernetes API 서버에 노드 및 Pod의 상태를 보고합니다.
즉, Kubelet이 없다면 Kubernetes 클러스터는 정상적으로 동작할 수 없습니다.
5. kube-proxy
kube-proxy는 Kubernetes 노드에서 네트워크 트래픽을 처리하고, 클러스터 내에서 서비스 간 통신이 원활하게 이루어지도록 하는 컴포넌트입니다. 각 노드에 하나씩 실행되며, Kubernetes 서비스의 네트워킹을 담당합니다.
kube-proxy의 주요 역할:
로드 밸런싱: 클러스터 내 여러 파드로 들어오는 트래픽을 분산시켜, 파드 간 부하를 균등하게 배분합니다.
네트워크 규칙 설정: iptables 또는 IPVS와 같은 네트워크 규칙을 사용하여, 클러스터 내의 트래픽 흐름을 제어하고 보안 규칙을 설정합니다.
네트워크 연결 유지: kube-proxy는 클러스터 내 서비스와 파드 간의 네트워크 연결을 유지하고, 서비스가 장애 발생 시 자동으로 트래픽을 다른 파드로 라우팅합니다.
6. 클러스터 네트워킹 및 서비스
Data Plane에서 중요한 부분 중 하나는 네트워킹과 서비스 관리입니다. 파드가 클러스터 내에서 서로 통신하고 외부에서 접근할 수 있게 하려면, Kubernetes의 네트워크 구성과 서비스가 필요합니다.
파드 네트워킹: 각 파드는 클러스터 내에서 고유한 IP 주소를 가지며, 다른 파드와 통신할 수 있습니다. Kubernetes는 CNI(Container Network Interface) 플러그인을 사용해 이러한 네트워킹을 관리합니다.
서비스(Service): Kubernetes의 서비스는 파드의 수명 주기와 상관없이 파드에 안정적인 네트워크 엔드포인트를 제공하는 논리적인 단위입니다. 예를 들어, 여러 파드를 하나의 서비스로 묶어 로드 밸런싱을 제공하거나, 외부 트래픽이 클러스터 내부의 파드로 라우팅되도록 설정할 수 있습니다.
Data Plane의 중요성
Data Plane은 애플리케이션이 실제로 실행되고 데이터 트래픽이 처리되는 영역이기 때문에 Kubernetes 클러스터의 핵심 실행 환경을 담당합니다.
실행: 클러스터의 노드에서 파드가 실제로 애플리케이션을 실행하며, kubelet과 컨테이너 런타임을 통해 이를 제어하고 관리합니다.
네트워크 관리: kube-proxy와 네트워크 플러그인을 통해 파드 간 통신 및 외부 네트워크와의 트래픽 처리를 관리합니다.
성능 및 안정성: Data Plane의 성능이 Kubernetes 클러스터의 전체 성능과 안정성에 직결되며, 워크로드가 원활하게 실행될 수 있도록 보장합니다.
결론
Kubernetes의 Data Plane은 애플리케이션을 실제로 실행하는 부분으로, 노드, 파드, 컨테이너, 네트워킹 등을 포함한 중요한 구성 요소들로 이루어져 있습니다. Data Plane은 Control Plane의 명령에 따라 실제 워크로드를 처리하고, Kubernetes 클러스터의 실질적인 작업을 수행하는 핵심 영역입니다.
Last updated