본문 바로가기
Infra/Kubernetes

파드 생성 과정

by TrendPilot 2025. 2. 18.

본문은 사용자로 부터 CLI(kubectl) 명령을 받아 워커 노드에 파드가 생성되는 과정을 총 7단계로 작성했습니다.

1. CLI 명령 입력

CLI (kubectl) 은 명령을 REST API 호출로 변환하여 API-SERVER와 상호작용합니다.

# nginx 파드 생성 예시
kubectl apply -f nginx.yaml

 

1-1. kubectl 명령 수행 과정

a. kubeconfig 파일 기반 클러스터 인증
b. YAML Manifest 유효성 검사
c. HTTP 요청 전송
API-SERVER 의 /api/v1/namespaces/{namespace}/pods 엔드포인트로 HTTP POST 요청을 보냅니다.
 

1-2. API-SERVER 처리 과정

a. 요청 인증(Authentication)
사용자의 신원을 확인합니다.
 
b. 권한 부여(Authorization)
사용자의 권한 확인합니다.
 
c. 어드미션 컨트롤(Admission Control)
정책 기반으로 승인/거부 합니다.
 

2. etcd 상태 저장

API-SERVER 는 유효한 요청을 수신하면 즉시 새로운 파드 오브젝트를 etcd 의 Key-Value 저장소에 기록합니다.

// etcd에 저장되는 파드 메타데이터 예시
{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "nginx",
    "namespace": "default",
    "uid": "..."
  },
  "spec": {
    "containers": [...],
    "nodeSelector": {
      "disktype": "ssd"
    }
  }
}

 
Raft 합의 알고리즘을 통해 데이터 일관성이 보장됩니다.
 

3. 스케줄러의 노드 선택

API-SERVER 가 요청을 etcd 에 저장하면, Kube-Scheduler 가 새로운 파드( nodeName 필드가 설정되지 않은)를 감지하고 적절한 워커 노드에 배치합니다.
 
이 과정에서 스케줄러 프로세스 2 단계로 진행합니다.
 
1. Filter 단계
pod 가 배포되고 실행 가능한 후보 노드들을 확인 및 필터링 합니다.
 
a. 리소스 요구 사항(cpu, memory 등),
b. 노드가 Ready / NotReady 상태 확인,
c. Taints / Tolerations 의 특정 노드인지,
d. Affinity / Anti-Affinity 규칙이 있는지,
e. PodDisruptionBudget (노드 중단 허용 조건 ) 
 
2. Score 단계
가장 적합한 후보 노드를 선택하기 위해 Score 플러그인을 사용하여 계산하고, 가장 높은 점수를 받은 노드가 선택됩니다.
 
( 상기 내용은 하기 본문의 scheduler 부분과 동일합니다. )
2025.02.12 - [Infra/Kubernetes] - Control node

Control node

kubernetes 의 가장 중요한 특징 중 하나는 선언적 동작 방식이라 생각합니다.  수 많은 인스턴스들을 관리하기 위해 나온 오케스트레이션 플랫폼인 만큼 쉽게 관리해야 되기 때문이라 생각합니

innoverse.tistory.com

 
요약)
노드 선택 -> 자원 할당 -> 스케줄링 결정
 

4. kubelet 의 파드 생성

타켓 노드의 kubelet 은 API-SERVER 를 주기적으로 폴링하며 자신에게 할당된 새 파드를 감지합니다.
 

4-1. 파드 생성 절차

a. 파드 사양 검증
리소스의 제한을 확인합니다.
 
b. 볼륨 마운트
pvc(PersistentVolumeClaim)에 바인딩합니다.
 
c. 이미지 pull
컨테이너 레지스트리에서 이미지 다운로드 합니다.
 
d. 컨테이너 런타임 호출
CRI(Container Runtime Interface)를 통해 컨테이너 생성 요청합니다.
 
e. 상태 모니터링
liveness/readiness probe를 실행합니다.
 

5. 컨테이너 런타임 실행

kubelet 은 런타임을 통해 실제 컨테이너를 생성합니다.
 

5-1. 동작 과정

a. 샌드박스 생성
파드 네트워크 namespace를 초기화합니다.
 
b. init 컨테이너 실행
c. 메인 컨테이너 실행
 

6. 상태 업데이트

워커노드에 배치되고 파드의 상태가 Running 으로 바뀌면, kubelet 은 주기적으로 상태를 API-SERVER 에 보고합니다.

  • Pending : 스케줄링 대기
  • ContainerCreating : 컨테이너 생성 진행 중
  • Running : 컨테이너 정상 실행
  • CrashLoopBackOff : 컨테이너 비정상
# Running 상태 확인
kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
nginx       1/1     Running   0          1s

 

7. 모니터링 및 상태 관리

Controller-Manager 는 실제 상태를 describe 와 지속적으로 비교, 확인합니다.

# 파드 describe 확인
kubectl describe pod nginx

 
감사합니다.

'Infra > Kubernetes' 카테고리의 다른 글

서비스  (0) 2025.02.21
CRI & 컨테이너 런타임  (0) 2025.02.20
etcd  (0) 2025.02.17
worker node  (0) 2025.02.17
Control node  (0) 2025.02.12