Home 팟 생성 시 Scheduler부터 kubelet의 역할
Post
Cancel

팟 생성 시 Scheduler부터 kubelet의 역할

팟 생성 시 스케쥴러부터 kubelet의 역할. 스케쥴러 공식문서

Kubernetes에서 스케줄러와 kubelet이 Pod를 생성하고 실행하는 전체 과정을 정리하면 다음과 같습니다:

1. 스케줄러 (Scheduler)의 역할

  1. Pod 객체 감지:
    • ReplicaSet Controller에 의해 생성된 새로운 Pod 객체가 etcd에 저장됩니다.
    • 스케줄러는 etcd에서 새로 생성된 Pending 상태의 Pod 객체를 감지합니다.
  2. 노드 선택:
    • 리소스 요구사항(예: CPU, 메모리), 노드의 상태 등을 기반으로 적절한 노드를 선택합니다.
  3. Pod 스케줄링:
    • 스케줄러는 노드를 선택하는 두 단계인 필터링스코어링을 거칩니다.
    • 필터링: 스케줄러는 Pod의 요구사항을 충족할 수 없는 노드를 제외하고, 가능한 노드 목록을 생성합니다.
    • 스코어링: 필터링을 통과한 노드들에 점수를 부여하여 가장 적합한 노드를 선택합니다. 점수를 매긴다.
    • 스케줄러는 가장 높은 점수를 받은 노드를 선택하여 Pod 객체에 할당하고, 이를 etcd에 업데이트합니다. 이 과정에서 Pod 객체는 특정 노드에 할당된 상태가 됩니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "nginx-pod",
    "namespace": "default",
    "labels": {
      "app": "nginx"
    }
  },
  "spec": {
    "containers": [
      {
        "name": "nginx",
        "image": "nginx:1.14.2",
        "ports": [
          {
            "containerPort": 80
          }
        ]
      }
    ],
    "nodeName": "node-1"
  },
  "status": {
    "phase": "Pending"
  }
}

2. kubelet의 역할

  1. Pod 감지 및 다운로드:
    • 각 노드에서 실행 중인 kubelet은 자신이 담당하는 노드에 할당된 새로운 Pod 객체를 감지합니다.
    • kubelet은 API 서버를 통해 etcd에서 해당 Pod의 정보를 가져옵니다.
  2. 컨테이너 이미지 다운로드:
    • kubelet은 Pod 스펙에 정의된 컨테이너 이미지를 컨테이너 런타임(예: Docker, containerd)을 통해 다운로드합니다.
    • 이미지가 이미 노드에 존재하는 경우, 이를 다시 다운로드하지 않고 기존 이미지를 사용합니다.
  3. Pod 생성:
    • 이미지 다운로드가 완료되면, kubelet은 컨테이너 런타임에게 해당 이미지를 사용하여 컨테이너를 생성하도록 요청합니다.
    • 컨테이너 런타임은 요청을 받아 컨테이너를 생성하고, 네트워크 설정 등을 완료하여 컨테이너를 실행합니다.
  4. 상태 보고:
    • kubelet은 Pod의 상태를 주기적으로 API 서버에 보고합니다.
    • Pod의 상태가 Pending에서 Running으로 변경됩니다.
    • 만약 Pod 실행 중 문제가 발생하면, kubelet은 이를 감지하고 API 서버에 상태를 보고합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "nginx-pod",
    "namespace": "default",
    "labels": {
      "app": "nginx"
    }
  },
  "spec": {
    "containers": [
      {
        "name": "nginx",
        "image": "nginx:1.14.2",
        "ports": [
          {
            "containerPort": 80
          }
        ]
      }
    ],
    "nodeName": "node-1"
  },
  "status": {
    "phase": "Running",
    "conditions": [
      {
        "type": "Initialized",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2024-06-21T12:00:00Z"
      },
      {
        "type": "Ready",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2024-06-21T12:01:00Z"
      },
      {
        "type": "ContainersReady",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2024-06-21T12:01:00Z"
      },
      {
        "type": "PodScheduled",
        "status": "True",
        "lastProbeTime": null,
        "lastTransitionTime": "2024-06-21T11:59:00Z"
      }
    ],
  }
}
This post is licensed under CC BY 4.0 by the author.

Kubernetes 오브젝트는 etcd에 저장되는 JSON 객체

k8s 오브젝트는 etcd에 저장되는 Json 오브젝트와 프로세스로 실행되는 오브젝트로 구분된다.

Trending Tags