1
1
---
2
+
3
+
4
+
5
+
2
6
title : 파드 오버헤드
3
7
content_type : concept
4
8
weight : 30
5
9
---
6
10
7
11
<!-- overview -->
8
12
9
- {{< feature-state for_k8s_version="v1.18" state="beta" >}}
10
-
13
+ {{< feature-state for_k8s_version="v1.24" state="stable" >}}
11
14
12
- 노드 위에서 파드를 구동할 때, 파드는 그 자체적으로 많은 시스템 리소스를 사용한다.
15
+ 노드 상에서 파드를 구동할 때, 파드는 그 자체적으로 많은 시스템 리소스를 사용한다.
13
16
이러한 리소스는 파드 내의 컨테이너들을 구동하기 위한 리소스 이외에 추가적으로 필요한 것이다.
14
- _ 파드 오버헤드_ 는 컨테이너 리소스 요청과 상한 위에서 파드의 인프라에 의해
15
- 소비되는 리소스를 계산하는 기능이다.
16
-
17
-
18
-
19
-
17
+ 쿠버네티스에서, _ 파드 오버헤드_ 는 리소스 요청 및 상한 외에도
18
+ 파드의 인프라에 의해 소비되는 리소스를 계산하는 방법 중 하나이다.
20
19
21
20
<!-- body -->
22
21
@@ -25,33 +24,30 @@ _파드 오버헤드_ 는 컨테이너 리소스 요청과 상한 위에서 파
25
24
[ 어드미션] ( /docs/reference/access-authn-authz/extensible-admission-controllers/#what-are-admission-webhooks )
26
25
이 수행될 때 지정된다.
27
26
28
- 파드 오버헤드가 활성화 되면, 파드를 노드에 스케줄링 할 때 컨테이너 리소스 요청의 합에
29
- 파드의 오버헤드를 추가해서 스케줄링을 고려한다. 마찬가지로, kubelet은 파드의 cgroups 크기를 변경하거나
30
- 파드의 축출 등급을 부여할 때에도 파드의 오버헤드를 포함하여 고려한다.
27
+ 파드를 노드에 스케줄링할 때, 컨테이너 리소스 요청의 합 뿐만 아니라 파드의 오버헤드도 함께 고려된다.
28
+ 마찬가지로, kubelet은 파드의 cgroups 크기를 변경하거나 파드의 축출 등급을 부여할 때에도
29
+ 파드의 오버헤드를 포함하여 고려한다.
31
30
32
- ## 파드 오버헤드 활성화하기 {#set-up}
31
+ ## 파드 오버헤드 환경 설정하기 {#set-up}
33
32
34
- 기능 활성화를 위해 클러스터에서
35
- ` PodOverhead ` [ 기능 게이트] ( /ko/docs/reference/command-line-tools-reference/feature-gates/ ) 가 활성화되어 있고(1.18 버전에서는 기본적으로 활성화),
36
33
` overhead ` 필드를 정의하는 ` RuntimeClass ` 가 사용되고 있는지 확인해야 한다.
37
34
38
35
## 사용 예제
39
36
40
- 파드 오버헤드 기능을 사용하기 위하여 , ` overhead ` 필드를 정의하는 런타임클래스가 필요하다.
37
+ 파드 오버헤드를 활용하려면 , ` overhead ` 필드를 정의하는 런타임클래스가 필요하다.
41
38
예를 들어, 가상 머신 및 게스트 OS에 대하여 파드 당 120 MiB를 사용하는
42
39
가상화 컨테이너 런타임의 런타임클래스의 경우 다음과 같이 정의 할 수 있다.
43
40
44
41
``` yaml
45
- ---
46
- kind : RuntimeClass
47
42
apiVersion : node.k8s.io/v1
43
+ kind : RuntimeClass
48
44
metadata :
49
- name : kata-fc
45
+ name : kata-fc
50
46
handler : kata-fc
51
47
overhead :
52
- podFixed :
53
- memory : " 120Mi"
54
- cpu : " 250m"
48
+ podFixed :
49
+ memory : " 120Mi"
50
+ cpu : " 250m"
55
51
` ` `
56
52
57
53
` kata-fc` 런타임클래스 핸들러를 지정하는 워크로드는 리소스 쿼터 계산,
68
64
runtimeClassName: kata-fc
69
65
containers:
70
66
- name: busybox-ctr
71
- image: busybox
67
+ image: busybox:1.28
72
68
stdin: true
73
69
tty: true
74
70
resources:
@@ -88,13 +84,15 @@ spec:
88
84
파드는 거부된다. 주어진 예제에서, 오직 런타임클래스의 이름만이 정의되어 있기 때문에, 어드미션 컨트롤러는 파드가
89
85
` overhead` 를 포함하도록 변경한다.
90
86
91
- 런타임클래스의 어드미션 수행 후에, 파드의 스펙이 갱신된 것을 확인할 수 있다.
87
+ 런타임클래스 어드미션 컨트롤러가 변경을 완료하면,
88
+ 다음의 명령어로 업데이트된 파드 오버헤드 값을 확인할 수 있다.
92
89
93
90
` ` ` bash
94
91
kubectl get pod test-pod -o jsonpath='{.spec.overhead}'
95
92
` ` `
96
93
97
94
명령 실행 결과는 다음과 같다.
95
+
98
96
```
99
97
map[ cpu:250m memory:120Mi]
100
98
```
@@ -106,23 +104,26 @@ kube-scheduler 는 어떤 노드에 파드가 기동 되어야 할지를 정할
106
104
해당 파드에 대한 컨테이너의 리소스 요청의 합을 고려한다. 이 예제에서, 스케줄러는
107
105
리소스 요청과 파드의 오버헤드를 더하고, 2.25 CPU와 320 MiB 메모리가 사용 가능한 노드를 찾는다.
108
106
109
- 일단 파드가 특정 노드에 스케줄링 되면, 해당 노드에 있는 kubelet 은 파드에 대한 새로운 {{< glossary_tooltip text="cgroup" term_id="cgroup" >}}을 생성한다.
107
+ 일단 파드가 특정 노드에 스케줄링 되면, 해당 노드에 있는 kubelet 은
108
+ 파드에 대한 새로운 {{< glossary_tooltip text="cgroup" term_id="cgroup" >}}을 생성한다.
110
109
기본 컨테이너 런타임이 만들어내는 컨테이너들은 이 파드 안에 존재한다.
111
110
112
- 만약 각 컨테이너에 대하여 QoS가 보장되었거나 향상이 가능하도록 QoS 의 리소스 상한 제한이 걸려있으면,
113
- kubelet 은 해당 리소스(CPU의 경우 cpu.cfs_quota_us, 메모리의 경우 memory.limit_in_bytes)와 연관된 파드의
114
- cgroup 의 상한선을 설정한다. 이 상한선은 컨테이너 리소스 상한과 PodSpec에
115
- 정의된 `overhead` 의 합에 기반한다.
111
+ 만약 각 컨테이너에 대하여 리소스 상한 제한이 걸려있으면
112
+ (제한이 걸려있는 보장된(Guaranteed) Qos 또는 향상 가능한(Burstable) QoS),
113
+ kubelet 은 해당 리소스(CPU의 경우 cpu.cfs_quota_us, 메모리의 경우 memory.limit_in_bytes)와 연관된 파드의 cgroup 의 상한선을 설정한다.
114
+ 이 상한선은 컨테이너 리소스 상한과 PodSpec에 정의된 `overhead` 의 합에 기반한다.
116
115
117
- CPU의 경우, 만약 파드가 보장형 또는 버스트형 QoS로 설정되었으면, kubelet은 PodSpec에 정의된 `overhead` 에 컨테이너의
118
- 리소스 요청의 합을 더한 값을 `cpu.shares` 로 설정한다.
116
+ CPU의 경우, 만약 파드가 보장형 또는 버스트형 QoS로 설정되었으면,
117
+ kubelet은 PodSpec에 정의된 `overhead` 에 컨테이너의 리소스 요청의 합을 더한 값을 `cpu.shares` 로 설정한다.
119
118
120
119
다음의 예제를 참고하여, 워크로드에 대하여 컨테이너의 리소스 요청을 확인하자.
120
+
121
121
```bash
122
122
kubectl get pod test-pod -o jsonpath='{.spec.containers[*].resources.limits}'
123
123
```
124
124
125
125
컨테이너 리소스 요청의 합은 각각 CPU 2000m 와 메모리 200MiB 이다.
126
+
126
127
```
127
128
map[cpu: 500m memory:100Mi] map[cpu:1500m memory:100Mi]
128
129
```
@@ -133,19 +134,21 @@ map[cpu: 500m memory:100Mi] map[cpu:1500m memory:100Mi]
133
134
kubectl describe node | grep test-pod -B2
134
135
```
135
136
136
- CPU 2250m와 메모리 320MiB 가 리소스로 요청되었으며, 이 결과는 파드의 오버헤드를 포함한다.
137
+ 결과를 보면 2250 m의 CPU와 320 MiB의 메모리가 리소스로 요청되었다. 여기에는 파드 오버헤드가 포함되어 있다.
138
+
137
139
```
138
- Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
139
- --------- ---- ------------ ---------- --------------- ------------- ---
140
- default test-pod 2250m (56%) 2250m (56%) 320Mi (1%) 320Mi (1%) 36m
140
+ Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
141
+ --------- ---- ------------ ---------- --------------- ------------- ---
142
+ default test-pod 2250m (56%) 2250m (56%) 320Mi (1%) 320Mi (1%) 36m
141
143
```
142
144
143
145
## 파드 cgroup 상한 확인하기
144
146
145
- 워크로드가 실행 중인 노드에서 파드의 메모리 cgroup들을 확인 해보자. 다음의 예제에서, [ ` crictl ` ] ( https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md ) 은 노드에서 사용되며,
146
- CRI-호환 컨테이너 런타임을 위해서 노드에서 사용할 수 있는 CLI 를 제공한다.
147
- 파드의 오버헤드 동작을 보여주는 좋은 예이며,
148
- 사용자가 노드에서 직접 cgroup들을 확인하지 않아도 된다.
147
+ 워크로드가 실행 중인 노드에서 파드의 메모리 cgroup들을 확인해 보자.
148
+ 다음의 예제에서,
149
+ [ ` crictl ` ] ( https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md ) 은 노드에서 사용되며,
150
+ CRI-호환 컨테이너 런타임을 위해서 노드에서 사용할 수 있는 CLI 를 제공한다.
151
+ 파드 오버헤드 동작을 보여주는 좋은 예이며, 사용자가 노드에서 직접 cgroup들을 확인하지 않아도 된다.
149
152
150
153
먼저 특정 노드에서 파드의 식별자를 확인해 보자.
151
154
@@ -155,39 +158,41 @@ POD_ID="$(sudo crictl pods --name test-pod -q)"
155
158
```
156
159
157
160
여기에서, 파드의 cgroup 경로를 확인할 수 있다.
161
+
158
162
``` bash
159
163
# 파드가 스케줄 된 노드에서 이것을 실행
160
164
sudo crictl inspectp -o=json $POD_ID | grep cgroupsPath
161
165
```
162
166
163
167
명령의 결과로 나온 cgroup 경로는 파드의 ` pause ` 컨테이너를 포함한다. 파드 레벨의 cgroup은 하나의 디렉터리이다.
168
+
164
169
```
165
- "cgroupsPath": "/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/7ccf55aee35dd16aca4189c952d83487297f3cd760f1bbf09620e206e7d0c27a"
170
+ "cgroupsPath": "/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/7ccf55aee35dd16aca4189c952d83487297f3cd760f1bbf09620e206e7d0c27a"
166
171
```
167
172
168
- 아래의 특정한 경우에, 파드 cgroup 경로는 ` kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2 ` 이다. 메모리의 파드 레벨 cgroup 설정을 확인하자.
173
+ 아래의 특정한 경우에, 파드 cgroup 경로는 ` kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2 ` 이다.
174
+ 메모리의 파드 레벨 cgroup 설정을 확인하자.
175
+
169
176
``` bash
170
177
# 파드가 스케줄 된 노드에서 이것을 실행.
171
178
# 또한 사용자의 파드에 할당된 cgroup 이름에 맞춰 해당 이름을 수정.
172
179
cat /sys/fs/cgroup/memory/kubepods/podd7f4b509-cf94-4951-9417-d1087c92a5b2/memory.limit_in_bytes
173
180
```
174
181
175
- 예상대로 320 MiB 이다.
182
+ 예상한 것과 같이 320 MiB 이다.
183
+
176
184
```
177
185
335544320
178
186
```
179
187
180
188
### 관찰성
181
- ` kube_pod_overhead ` 항목은 [ kube-state-metrics] ( https://github.com/kubernetes/kube-state-metrics )
182
- 에서 사용할 수 있어, 파드 오버헤드가 사용되는 시기를 식별하고,
183
- 정의된 오버헤드로 실행되는 워크로드의 안정성을 관찰할 수 있다.
184
- 이 기능은 kube-state-metrics 의 1.9 릴리스에서는 사용할 수 없지만, 다음 릴리스에서는 가능할 예정이다.
185
- 그 전까지는 소스로부터 kube-state-metric 을 빌드해야 한다.
186
-
187
189
190
+ 몇몇 ` kube_pod_overhead ` 메트릭은
191
+ [ kube-state-metrics] ( https://github.com/kubernetes/kube-state-metrics ) 에서 사용할 수 있어,
192
+ 파드 오버헤드가 사용되는 시기를 식별하고, 정의된 오버헤드로 실행되는 워크로드의 안정성을 관찰할 수 있다.
188
193
189
194
## {{% heading "whatsnext" %}}
190
195
191
-
192
- * [ 런타임클래스 ] ( /ko/docs/concepts/containers/runtime-class/ )
193
- * [ 파드오버헤드 디자인] ( https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/688-pod-overhead )
196
+ * [ 런타임클래스 ] ( /ko/docs/concepts/containers/runtime-class/ ) 에 대해 알아본다.
197
+ * 더 자세한 문맥은
198
+ [ 파드오버헤드 디자인] ( https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/688-pod-overhead ) 향상 제안을 확인한다.
0 commit comments