[Kubernetes] 리소스 제어 동작 확인 2

8270 단어 kubectlkubernetes

소개



지난번 리소스 제어의 기본 동작을 확인했습니다.
이번은 지난번에 이어 이런 경우는 어떻게 될까? 라는 것을 실제로 확인하고 싶습니다.
덧붙여 이번은 CPU만으로 짜서 검증해 갑니다.

자원 부족의 경우



이번 검증 환경의 worker 노드는 2vCPU(2000m) 탑재하고 있습니다.
여기에 Nginx와 Redis 두 개의 컨테이너가있는 포드를 배포하지만 requests와 limits를 아래 그림과 같이 설정합니다.
requests(하한)의 합계가 2200m가 되어, worker 노드의 자원을 넘고 있습니다.



이 Pod를 배포합니다. 매니페스트는 지난번과 유사하며 requests와 limits 값만 다릅니다.
$ kubectl apply -f nginx_redis-quota.yaml
deployment.apps/resource-quota created
$ kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
no-resource-quota-77d577889b-2lsck   2/2     Running   0          45s
no-resource-quota-77d577889b-mlgvr   2/2     Running   0          46s
resource-quota-6bfdcb475d-5hqn5      0/2     Pending   0          9s
resource-quota-6bfdcb475d-fjk29      0/2     Pending   0          9s

포드가 펜딩이 되었습니다. 자세한 내용을 확인합니다.
$ kubectl describe pod resource-quota-6bfdcb475d-5hqn5
Name:           resource-quota-6bfdcb475d-5hqn5
・・・
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  36s (x2 over 36s)  default-scheduler  0/3 nodes are available: 3 Insufficient cpu.

CPU가 부족해서 스케줄링 할 수 없네요.
전회 확인한 결과라면 requests의 값은, 무부하 상태에서는 확보되어 있지 않았습니다만, requests의 합계치가 노드의 vCPU를 넘으면 스케줄링할 수 없는 것 같네요.

자원 경합의 경우



requests와 limits의 값을 변경하여 "requests 합계

$ kubectl apply -f nginx_redis-quota.yaml
deployment.apps/resource-quota configured
$ kubectl get pod
NAME                                 READY   STATUS    RESTARTS   AGE
no-resource-quota-77d577889b-2lsck   2/2     Running   0          32m
no-resource-quota-77d577889b-mlgvr   2/2     Running   0          32m
resource-quota-7549bdf4df-845dw      2/2     Running   0          19s
resource-quota-7549bdf4df-r9rc6      2/2     Running   0          10s

설정값을 확인해 둡니다.
$ kubectl describe node k8s-worker01
Name:               k8s-worker01
・・・
Non-terminated Pods:          (5 in total)
  Namespace                   Name                                  CPU Requests  CPU Limits    Memory Requests  Memory Limits  AGE
  ---------                   ----                                  ------------  ----------    ---------------  -------------  ---
  default                     no-resource-quota-77d577889b-mlgvr    0 (0%)        0 (0%)        0 (0%)           0 (0%)         40m
  default                     resource-quota-7549bdf4df-845dw       1500m (75%)   2500m (125%)  300Mi (10%)      500Mi (18%)    8m24s
  kube-system                 calico-node-cgdgk                     250m (12%)    0 (0%)        0 (0%)           0 (0%)         80d
  kube-system                 kube-proxy-gqt42                      0 (0%)        0 (0%)        0 (0%)           0 (0%)         80d
  metallb-system              speaker-scqps                         100m (5%)     100m (5%)     100Mi (3%)       100Mi (3%)     36d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests     Limits
  --------           --------     ------
  cpu                1850m (92%)  2600m (130%)
  memory             400Mi (14%)  600Mi (21%)
  ephemeral-storage  0 (0%)       0 (0%)

Requests의 설정값은 92%입니다만, Limits는 130%와 vCPU의 값을 넘고 있군요.

동작 확인



각 컨테이너에 로그인하여 CPU에 부하를 가하여 CPU 사용률을 확인합니다.
다만, Pod 단위로 밖에 부하를 모르기 때문에, Pod를 재작성하기로 했습니다. 아래와 같이 1Pod/1 컨테이너로 했습니다.



리소스 제어하고 있는 Pod는 ReplicaSet를 스케일 해도 좋았습니다만, 설정치가 다른 경우에 어떻게 되는지 확인하고 싶었으므로, 다른 Deployment로 했습니다.
$ kubectl get pod -o wide
NAME                                 READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
no-resource-quota-77d577889b-2lsck   2/2     Running   2          23h   192.168.69.252   k8s-worker02   <none>           <none>
no-resource-quota-77d577889b-mlgvr   2/2     Running   2          23h   192.168.79.77    k8s-worker01   <none>           <none>
resource-quota1-557b598fc9-2lqqg     1/1     Running   1          17h   192.168.79.66    k8s-worker01   <none>           <none>
resource-quota1-557b598fc9-8bcdr     1/1     Running   1          17h   192.168.69.205   k8s-worker02   <none>           <none>
resource-quota2-565c7b64fc-8tr5r     1/1     Running   1          17h   192.168.79.76    k8s-worker01   <none>           <none>
resource-quota2-565c7b64fc-qtng4     1/1     Running   1          17h   192.168.69.251   k8s-worker02   <none>           <none>

우선은 requests:500m/limits:1000m의 Pod에 부하를 가합니다.
$ kubectl exec -it resource-quota1-557b598fc9-2lqqg /bin/bash
root@resource-quota1-557b598fc9-2lqqg:/# yes >/dev/null &
[1] 12
root@resource-quota1-557b598fc9-2lqqg:/# yes >/dev/null &
[2] 13

CPU 사용률을 확인합니다.
$ kubectl top pod
NAME                                 CPU(cores)   MEMORY(bytes)
no-resource-quota-77d577889b-2lsck   2m           11Mi
no-resource-quota-77d577889b-mlgvr   2m           11Mi
resource-quota1-557b598fc9-2lqqg     992m         2Mi
resource-quota1-557b598fc9-8bcdr     0m           1Mi
resource-quota2-565c7b64fc-8tr5r     0m           1Mi
resource-quota2-565c7b64fc-qtng4     0m           1Mi

거의 limits의 값이 되고 있네요.

다음으로 requests:1000m/limits:1500m의 Pod에 마찬가지로 부하를 걸어 CPU 사용률을 확인합니다.
$ kubectl top pod
NAME                                 CPU(cores)   MEMORY(bytes)
no-resource-quota-77d577889b-2lsck   1m           11Mi
no-resource-quota-77d577889b-mlgvr   1m           11Mi
resource-quota1-557b598fc9-2lqqg     625m         2Mi
resource-quota1-557b598fc9-8bcdr     0m           1Mi
resource-quota2-565c7b64fc-8tr5r     1251m        2Mi
resource-quota2-565c7b64fc-qtng4     0m           1Mi

둘 다 requests를 넘어 비슷한 비율로 자원을 나누고 있네요.
덧붙여 이 시점에서 노드의 vCPU는 다 사용하고 있습니다.
$ kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
k8s-master     209m         10%    1007Mi          36%
k8s-worker01   2000m        100%   484Mi           17%
k8s-worker02   129m         6%     525Mi           19%

또한 제한되지 않은 포드에 로그인하여 마찬가지로 부하를 가하고 CPU 사용률을 확인합니다.
$ kubectl top pod
NAME                                 CPU(cores)   MEMORY(bytes)
no-resource-quota-77d577889b-2lsck   2m           11Mi
no-resource-quota-77d577889b-mlgvr   4m           11Mi
resource-quota1-557b598fc9-2lqqg     626m         2Mi
resource-quota1-557b598fc9-8bcdr     0m           1Mi
resource-quota2-565c7b64fc-8tr5r     1280m        2Mi
resource-quota2-565c7b64fc-qtng4     0m           1Mi

5분 정도 기다려 보았습니다만, 제한을 걸지 않은 Pod(no-resource-quota-77d577889b-mlgvr)는 사용률이 거의 오르지 않았습니다.

요약



지난번 은 "리소스 제어가 없는 포드 -> 리소스 제어를 하는 포드"순으로 로드되었습니다. 리소스 제어를 하지 않은 포드만으로 CPU를 다 사용하고 있는 상태에서 리소스 제어하고 있는 포드에 부하를 가하면, requests(하한)가 아니라 limits(상한)까지 포는 CPU를 할당받았습니다.
즉, 리소스 할당은 빠른 순서가 아니며 리소스 제어 설정 값 (requests뿐만 아니라 limits도)이 우선되어 리소스 제어하지 않은 Pod는 다른 Pod의 상한값까지 할당 한 후의 나머지 의 자원이 할당된다고 하는 것이군요.

좋은 웹페이지 즐겨찾기