팟 생성 시 스케쥴러부터 kubelet의 역할. 스케쥴러 공식문서
Kubernetes에서 스케줄러와 kubelet이 Pod를 생성하고 실행하는 전체 과정을 정리하면 다음과 같습니다:
1. 스케줄러 (Scheduler)의 역할
- Pod 객체 감지:
- ReplicaSet Controller에 의해 생성된 새로운 Pod 객체가 etcd에 저장됩니다.
- 스케줄러는 etcd에서 새로 생성된
Pending
상태의 Pod 객체를 감지합니다.
- 노드 선택:
- 리소스 요구사항(예: CPU, 메모리), 노드의 상태 등을 기반으로 적절한 노드를 선택합니다.
- 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의 역할
- Pod 감지 및 다운로드:
- 각 노드에서 실행 중인 kubelet은 자신이 담당하는 노드에 할당된 새로운 Pod 객체를 감지합니다.
- kubelet은 API 서버를 통해 etcd에서 해당 Pod의 정보를 가져옵니다.
- 컨테이너 이미지 다운로드:
- kubelet은 Pod 스펙에 정의된 컨테이너 이미지를 컨테이너 런타임(예: Docker, containerd)을 통해 다운로드합니다.
- 이미지가 이미 노드에 존재하는 경우, 이를 다시 다운로드하지 않고 기존 이미지를 사용합니다.
- Pod 생성:
- 이미지 다운로드가 완료되면, kubelet은 컨테이너 런타임에게 해당 이미지를 사용하여 컨테이너를 생성하도록 요청합니다.
- 컨테이너 런타임은 요청을 받아 컨테이너를 생성하고, 네트워크 설정 등을 완료하여 컨테이너를 실행합니다.
- 상태 보고:
- 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"
}
],
}
}