|
| 1 | +--- |
| 2 | +title: 컨테이너 및 파드 CPU 리소스 할당 |
| 3 | +content_type: task |
| 4 | +weight: 20 |
| 5 | +--- |
| 6 | + |
| 7 | +<!-- overview --> |
| 8 | + |
| 9 | +이 페이지에서는 컨테이너의 CPU *요청량*과 CPU *상한*을 지정하는 방법을 보여준다. |
| 10 | +컨테이너는 설정된 상한보다 더 많은 CPU는 사용할 수 없다. |
| 11 | +제공된 시스템에 CPU 가용량이 남아있다면, 컨테이너는 요청량만큼의 CPU를 할당받는 것을 |
| 12 | +보장받는다. |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +## {{% heading "prerequisites" %}} |
| 18 | + |
| 19 | + |
| 20 | +{{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} |
| 21 | + |
| 22 | +태스크 예제를 수행하기 위해서는 최소 1개의 CPU가 가용한 클러스터가 필요하다. |
| 23 | + |
| 24 | +이 페이지의 몇 가지 단계를 수행하기 위해서는 클러스터 내 |
| 25 | +[metrics-server](https://github.com/kubernetes-sigs/metrics-server) |
| 26 | +서비스 실행이 필요하다. 이미 실행 중인 metrics-server가 있다면 |
| 27 | +다음 단계를 건너뛸 수 있다. |
| 28 | + |
| 29 | +{{< glossary_tooltip term_id="minikube" >}}를 사용 중이라면, |
| 30 | +다음 명령어를 실행해 metric-server를 활성화할 수 있다. |
| 31 | + |
| 32 | +```shell |
| 33 | +minikube addons enable metrics-server |
| 34 | +``` |
| 35 | + |
| 36 | +metric-server(아니면 `metrics.k8s.io`와 같은 다른 제공자의 리소스 메트릭 API)가 |
| 37 | +실행 중인지를 확인하기 위해 다음의 명령어를 실행한다. |
| 38 | + |
| 39 | +```shell |
| 40 | +kubectl get apiservices |
| 41 | +``` |
| 42 | + |
| 43 | +리소스 메트릭 API를 사용할 수 있다면 출력에 `metrics.k8s.io`에 |
| 44 | +대한 참조가 포함되어 있을 것이다. |
| 45 | + |
| 46 | + |
| 47 | +``` |
| 48 | +NAME |
| 49 | +v1beta1.metrics.k8s.io |
| 50 | +``` |
| 51 | + |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | +<!-- steps --> |
| 56 | + |
| 57 | +## 네임스페이스 생성 |
| 58 | + |
| 59 | +이 예제에서 생성한 자원과 클러스터 내 나머지를 분리하기 위해 |
| 60 | +{{< glossary_tooltip term_id="namespace" >}}를 생성한다. |
| 61 | + |
| 62 | +```shell |
| 63 | +kubectl create namespace cpu-example |
| 64 | +``` |
| 65 | + |
| 66 | +## CPU 요청량 및 상한 지정 |
| 67 | + |
| 68 | +컨테이너에 CPU 요청량을 지정하기 위해서는 컨테이너의 리소스 매니페스트에 `resources:requests` |
| 69 | +필드를 포함한다. CPU 상한을 지정하기 위해서는 `resources:limits` 필드를 포함한다. |
| 70 | + |
| 71 | +이 예제에서는, 하나의 컨테이너를 가진 파드를 생성한다. |
| 72 | +컨테이너는 0.5 CPU 요청량과 1 CPU 상한을 갖는다. 아래는 파드의 구성 파일이다. |
| 73 | + |
| 74 | +{{< codenew file="pods/resource/cpu-request-limit.yaml" >}} |
| 75 | + |
| 76 | +구성 파일 내 `args` 섹션은 컨테이너가 시작될 때 인수(argument)를 제공한다. |
| 77 | +`-cpus "2"` 인수는 컨테이너가 2 CPU 할당을 시도하도록 한다. |
| 78 | + |
| 79 | +파드 생성: |
| 80 | + |
| 81 | +```shell |
| 82 | +kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example |
| 83 | +``` |
| 84 | + |
| 85 | +파드가 실행 중인지 확인: |
| 86 | + |
| 87 | +```shell |
| 88 | +kubectl get pod cpu-demo --namespace=cpu-example |
| 89 | +``` |
| 90 | + |
| 91 | +파드에 대한 자세한 정보 확인: |
| 92 | + |
| 93 | +```shell |
| 94 | +kubectl get pod cpu-demo --output=yaml --namespace=cpu-example |
| 95 | +``` |
| 96 | + |
| 97 | +출력은 파드 내 하나의 컨테이너에 0.5 milliCPU 요청량과 |
| 98 | +1 CPU 상한이 있는 것을 보여준다. |
| 99 | + |
| 100 | +```yaml |
| 101 | +resources: |
| 102 | + limits: |
| 103 | + cpu: "1" |
| 104 | + requests: |
| 105 | + cpu: 500m |
| 106 | +``` |
| 107 | +
|
| 108 | +`kubectl top`을 실행하여 파드 메트릭 가져오기: |
| 109 | + |
| 110 | +```shell |
| 111 | +kubectl top pod cpu-demo --namespace=cpu-example |
| 112 | +``` |
| 113 | + |
| 114 | +출력은 파드가 974 milliCPU를 사용하는 것을 보여주는데, |
| 115 | +이는 파드의 1 CPU 상한보다는 약간 적은 수치이다. |
| 116 | + |
| 117 | +``` |
| 118 | +NAME CPU(cores) MEMORY(bytes) |
| 119 | +cpu-demo 974m <something> |
| 120 | +``` |
| 121 | +
|
| 122 | +만약 `-cpu "2"`로 설정한다면, 컨테이너가 2 CPU를 사용하도록 설정한 것이 된다. 하지만 컨테이너는 1 CPU까지만을 사용하도록 허용되어 있다는 사실을 기억하자. 컨테이너는 상한보다 더 많은 CPU 리소스를 사용하려고 하기 때문에, 컨테이너의 CPU 사용은 쓰로틀(throttled) 될 것이다. |
| 123 | +
|
| 124 | +{{< note >}} |
| 125 | +CPU 사용이 1.0보다 낮은 것에 대한 또 다른 원인은, 노드에 충분한 CPU 리소스가 가용하지 않기 때문일 수도 있다. |
| 126 | +"시작하기 전에"의 요구사항에서 이 예제를 위해 클러스터는 최소 1 CPU가 필요하다는 사실을 기억하자. 만약 컨테이너가 1 CPU 밖에 가지고 있지 않은 노드 위에서 실행된다면, 컨테이너는 자신에게 명시되어 있는 CPU 상한과 무관하게 1 CPU 이상으로 사용하지 못할 것이다. |
| 127 | +{{< /note >}} |
| 128 | +
|
| 129 | +## CPU 단위(unit) |
| 130 | +
|
| 131 | +CPU 리소스는 _CPU_ 단위로 측정된다. 쿠버네티스에서 1 CPU는, 다음과 같다. |
| 132 | +
|
| 133 | +- 1 AWS vCPU |
| 134 | +- 1 GCP Core |
| 135 | +- 1 Azure vCore |
| 136 | +- 1 하이퍼스레드 (베어메탈 서버의 하이퍼스레딩 인텔 프로세서) |
| 137 | +
|
| 138 | +분수 값도 가능하다. 0.5 CPU를 요청한 컨테이너는 1 CPU를 요청한 컨테이너 CPU의 절반 가량을 보장받는다. |
| 139 | +접미사 m을 사용하여 밀리(milli)를 표현할 수도 있다. 예를 들어서 100m CPU, 100milliCPU, |
| 140 | +그리고 0.1 CPU는 모두 같다. 1m보다 정밀한 표현은 허용하지 않는다. |
| 141 | +
|
| 142 | +CPU는 상대적인 수량이 아닌, 절대적인 수량으로 요청된다. |
| 143 | +즉 0.1는 싱글 코어, 듀얼 코어, 48-코어 머신에서도 같은 양을 나타낸다. |
| 144 | +
|
| 145 | +파드 삭제: |
| 146 | +
|
| 147 | +```shell |
| 148 | +kubectl delete pod cpu-demo --namespace=cpu-example |
| 149 | +``` |
| 150 | + |
| 151 | +## 노드보다 훨씬 높은 CPU 요청량을 지정할 경우 |
| 152 | + |
| 153 | +CPU 요청량과 상한은 컨테이너와 연관되어 있지만, |
| 154 | +파드가 CPU 요청량과 상한을 갖는다고 생각하는 것이 유용하다. |
| 155 | +특정 파드의 CPU 요청량은 해당 파드의 모든 컨테이너 CPU 요청량의 합과 같다. |
| 156 | +마찬가지로, 특정 파드의 CPU 상한은 해당 파드의 모든 컨테이너 CPU 상한의 합과 같다. |
| 157 | + |
| 158 | +파드 스케줄링은 요청량에 따라 수행된다. 파드는 파드 CPU 요청량을 만족할 정도로 |
| 159 | +노드에 충분한 CPU 리소스가 있을 때에만 노드에 스케줄링한다. |
| 160 | + |
| 161 | +이 예제에서는, 클러스터의 모든 노드 가용량을 초과하는 CPU 요청량을 |
| 162 | +가진 파드를 생성했다. 아래는 하나의 컨테이너를 가진 파드에 대한 설정 파일이다. |
| 163 | +컨테이너는 100 CPU을 요청하고 있는데, 이것은 클러스터의 모든 노드 가용량을 |
| 164 | +초과하는 것이다. |
| 165 | + |
| 166 | +{{< codenew file="pods/resource/cpu-request-limit-2.yaml" >}} |
| 167 | + |
| 168 | +파드 생성: |
| 169 | + |
| 170 | +```shell |
| 171 | +kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example |
| 172 | +``` |
| 173 | + |
| 174 | +파드 상태 확인: |
| 175 | + |
| 176 | +```shell |
| 177 | +kubectl get pod cpu-demo-2 --namespace=cpu-example |
| 178 | +``` |
| 179 | + |
| 180 | +출력은 파드 상태가 Pending 상태임을 보여준다. 이것은 파드는 어떤 노드에서도 실행되도록 |
| 181 | +스케줄되지 않았고, 이후에도 Pending 상태가 지속될 것이라는 것을 의미한다. |
| 182 | + |
| 183 | + |
| 184 | +``` |
| 185 | +NAME READY STATUS RESTARTS AGE |
| 186 | +cpu-demo-2 0/1 Pending 0 7m |
| 187 | +``` |
| 188 | + |
| 189 | +이벤트를 포함한 파드 상세 정보 확인: |
| 190 | + |
| 191 | + |
| 192 | +```shell |
| 193 | +kubectl describe pod cpu-demo-2 --namespace=cpu-example |
| 194 | +``` |
| 195 | + |
| 196 | +출력은 노드의 CPU 리소스가 부족하여 |
| 197 | +파드가 스케줄링될 수 없음을 보여준다. |
| 198 | + |
| 199 | + |
| 200 | +``` |
| 201 | +Events: |
| 202 | + Reason Message |
| 203 | + ------ ------- |
| 204 | + FailedScheduling No nodes are available that match all of the following predicates:: Insufficient cpu (3). |
| 205 | +``` |
| 206 | + |
| 207 | +파드 삭제: |
| 208 | + |
| 209 | +```shell |
| 210 | +kubectl delete pod cpu-demo-2 --namespace=cpu-example |
| 211 | +``` |
| 212 | + |
| 213 | +## CPU 상한을 지정하지 않을 경우 |
| 214 | + |
| 215 | +컨테이너에 CPU 상한을 지정하지 않으면 다음 상황 중 하나가 발생한다. |
| 216 | + |
| 217 | +- 컨테이너가 사용할 수 있는 CPU 리소스에 상한선이 없다. |
| 218 | + 컨테이너는 실행 중인 노드에서 사용 가능한 모든 CPU 리소스를 사용해버릴 수도 있다. |
| 219 | + |
| 220 | +- 기본 CPU 상한이 지정된 네임스페이스에서 실행 중인 컨테이너에는 해당 기본 상한이 자동으로 |
| 221 | + 할당된다. 클러스터 관리자들은 |
| 222 | + [리밋레인지(LimitRange)](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#limitrange-v1-core/)를 사용해 |
| 223 | + CPU 상한의 기본 값을 지정할 수 있다. |
| 224 | + |
| 225 | +## CPU 상한은 지정했지만 CPU 요청량을 지정하지 않을 경우 |
| 226 | + |
| 227 | +만약 CPU 상한은 지정했지만 CPU 요청량을 지정하지 않았다면, 쿠버네티스는 자동으로 |
| 228 | +상한에 맞는 CPU 요청량을 지정한다. 비슷하게, 컨테이너가 자신의 메모리 상한을 지정했지만 |
| 229 | +메모리 요청량을 지정하지 않았다면, 쿠버네티스는 자동으로 상한에 맞는 |
| 230 | +메모리 요청량을 지정한다. |
| 231 | + |
| 232 | +## CPU 요청량 및 상한 개념 도입 동기 |
| 233 | + |
| 234 | +클러스터에서 실행되는 컨테이너에 CPU 요청량과 상한을 구성하면 |
| 235 | +클러스터 내 노드들의 가용 가능한 CPU 리소스를 효율적으로 사용할 수 있게 된다. |
| 236 | +파드의 CPU 요청량을 낮게 유지하면 파드가 높은 확률로 스케줄링 될 수 있다. |
| 237 | +CPU 상한이 CPU 요청량보다 크도록 설정한다면 다음 두 가지를 달성할 수 있다. |
| 238 | + |
| 239 | +- 가용한 CPU 리소스가 있는 경우 파드가 이를 버스트(burst) 하여 사용할 수 있다. |
| 240 | +- 파드가 버스트 중 사용할 수 있는 CPU 리소스 양을 적절히 제한할 수 있다. |
| 241 | + |
| 242 | +## 정리 |
| 243 | + |
| 244 | +네임스페이스 삭제: |
| 245 | + |
| 246 | +```shell |
| 247 | +kubectl delete namespace cpu-example |
| 248 | +``` |
| 249 | + |
| 250 | + |
| 251 | + |
| 252 | +## {{% heading "whatsnext" %}} |
| 253 | + |
| 254 | + |
| 255 | + |
| 256 | +### 앱 개발자들을 위한 문서 |
| 257 | + |
| 258 | +- [컨테이너 및 파드 메모리 리소스 할당](/ko/docs/tasks/configure-pod-container/assign-memory-resource/) |
| 259 | + |
| 260 | +- [파드에 대한 서비스 품질 구성](/ko/docs/tasks/configure-pod-container/quality-service-pod/) |
| 261 | + |
| 262 | +### 클러스터 관리자들을 위한 문서 |
| 263 | + |
| 264 | +- [네임스페이스에 대한 기본 메모리 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-default-namespace/) |
| 265 | + |
| 266 | +- [네임스페이스에 대한 기본 CPU 요청량과 상한 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-default-namespace/) |
| 267 | + |
| 268 | +- [네임스페이스에 대한 메모리의 최소 및 최대 메모리 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/memory-constraint-namespace/) |
| 269 | + |
| 270 | +- [네임스페이스에 대한 CPU의 최소 및 최대 제약 조건 구성](/ko/docs/tasks/administer-cluster/manage-resources/cpu-constraint-namespace/) |
| 271 | + |
| 272 | +- [네임스페이스에 대한 메모리 및 CPU 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-memory-cpu-namespace/) |
| 273 | + |
| 274 | +- [네임스페이스에 대한 파드 쿼터 구성](/ko/docs/tasks/administer-cluster/manage-resources/quota-pod-namespace/) |
| 275 | + |
| 276 | +- [API 오브젝트 할당량 구성](/docs/tasks/administer-cluster/quota-api-object/) |
| 277 | + |
| 278 | + |
0 commit comments