본문 바로가기
서버인프라/kubernetes

[제 3강] Resource Management

by techwold ted 2022. 12. 19.

쿠버네티스에 pod에는 여러개의 컨테이너를 올릴 수 있습니다. 그래서 궁금해서 오늘 몇개나 올라가나 확인해 보고자 

kubectl create deployment web-nginx --image=nginx --replicas=200 아래와 같은 명령어를 입력해 봤습니다. nginx 를 200개를 만들어 달라고 node-1, node-2에 분배되어 생성 되겠죠? 근데 200개가 다 생성이 될까요??

node-1, node-2 둘다 같은 사양 입니다.

NODE 사양

  • CPU : 8Core
  • MeM : 4Gb
kubectl create deployment web-nginx --image=nginx --replicas=200

그리고 이렇게 실행 시켰더니 다음과 같이 실행이 되었습니다.

root@master:~# kubectl get deployments
NAME        READY    UP-TO-DATE   AVAILABLE   AGE
web-nginx   68/200   200          68          3h2m

요청한 200개 중 68개만 실행 되었고 한개 노드에 34개씩 실행 되었습니다. 근데 왜 34개가 실행 되었는지는 아직 모르겠습니다. 조금더 공부하다보면 알게 될거 같아요 예상되는 몇가지들이 있을거 같긴 한데... 나중에 확인해 보는 거로 하겠습니다. 당장 그리 중요하지 않다고 생각 됩니다. 우선 이걸로 알게 된게 k8s에서 cpu, mem를 지정해서 컨테이너 설정을 할 수 있다는 생각을 해서 찾아 보게 됐습니다.

상세한 내용은 아래애서 확인 할 수 있습니다.

https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/

 

Resource Management for Pods and Containers

When you specify a Pod, you can optionally specify how much of each resource a container needs. The most common resources to specify are CPU and memory (RAM); there are others. When you specify the resource request for containers in a Pod, the kube-schedul

kubernetes.io

CPU 리소스에 대한 제한 및 요청은 CPU 단위로 측정됩니다. Kubernetes에서 1 CPU 단위는 노드가 물리적 호스트인지 아니면 물리적 시스템 내에서 실행 중인 가상 시스템인지에 따라 1개의 물리적 CPU 코어 또는 1개의 가상 코어와 같습니다.

부분 요청이 허용됩니다. spec.containers[.resources.requests.cpu]가 0.5로 설정된 컨테이너를 정의하면 CPU 시간이 1.0 CPU를 요청한 경우에 비해 절반으로 요청됩니다. CPU 리소스 단위의 경우 수량 표현식 0.1은 100m와 동일하며 "100micpu"로 읽을 수 있습니다. 어떤 사람들은 "100 밀리코어"라고 말하는데, 이것은 같은 의미로 이해된다.

CPU 리소스는 항상 절대적인 리소스 양으로 지정되며, 상대적인 양으로 지정되지 않습니다. 예를 들어 500m CPU는 컨테이너가 단일 코어, 듀얼 코어 또는 48 코어 시스템에서 실행되는지 여부에 관계없이 거의 동일한 컴퓨팅 성능을 나타냅니다.

 

papago 번역기를 돌려 보니 저런 내용이네요 그런즉슨 제가 가지고 있는 노드는 8코어 니까 8코어를 사용할수 있는지 확인해 보겠습니다. 

kubectl delete deployment/web-nginx

위 명령어로 설치 했던 모든 컨테이너를 삭제해 줍니다.

그리고 다음과 같이 yaml 파일을 하나 만들어 줍니다.

vi resource_test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "3000Mi"
        cpu: "8"

위 내용은 메모리는 대략 3GB를 주고 cpu를 8core를 사용한다는 내용입니다. 과연 잘 동작이 될지 궁금하네요

root@master:~/yaml# kubectl create -f resource_test.yaml
pod/frontend created
root@master:~/yaml# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
frontend   0/1     Pending   0          56s   <none>   <none>   <none>           <none>

실행 되지 않고 pending 상태네요...

describe 로 확인해 보니 아래와 같은 에러 메시지가 있고, CPU가 부족하다고 나옵니다.일단 지워보고 7로 해서 다시 해봅시다.

Warning  FailedScheduling  101s  default-scheduler  0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 3 Insufficient cpu. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod..

헌데 더 중요한 문제가 생겼네요. docker hub의 다운로드 제한에 걸려서 내일로 테스트를 조금 미뤄야 겠어요

TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest

6시간당 100개 받을수 있다는 내용인거 같은데 

오늘 테스트 한지가 6시간이 지난거 같은데 아직 안되었나 봅니다. 우선 내일 다시 테스트 해보도록 하겠습니다. 

HTTP/1.1 200 OK
content-length: 2782
content-type: application/vnd.docker.distribution.manifest.v1+prettyjws
...
...
date: Mon, 19 Dec 2022 14:10:57 GMT
strict-transport-security: max-age=31536000
ratelimit-limit: 100;w=21600
ratelimit-remaining: 0;w=21600

해당 내용은 아래에 잘 나와 있습니다

https://docs.docker.com/docker-hub/download-rate-limit/

 

Download rate limit

 

docs.docker.com

이번에 다시 시간이 지나서 

아래와 같이 다시 실행했습니다. 조건만 하나 변경되었어요 CPU를 8에서 7로변경 그럼 7.5로 하면 어떻게 될까요? 

kubectl create -f resource_test.yaml

위와 같이 잘 실행 되네요. 7.7까지는 실행 됩니다. 7.8로 변경 하니 다시 cpu 부족 에러가 떠요 한가지 분명한건 자원사용 한도를 최대한 사용할 수 있겠 구성 되어 있다는 생각을 했습니다. 

그리고 메모리 역시 가진것 이상으로 설정하고 describe로 확인하면  아래와 같이 메시지를 던집니다.

0/3 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 3 Insufficient memory. preemption: 0/3 nodes are available: 1 Preemption is not helpful for scheduling, 2 No preemption victims found for incoming pod..

 

Pod 및 컨테이너의 리소스 요청 및 제한

각 컨테이너에 대해 다음을 포함하여 리소스 제한 및 요청을 지정할 수 있습니다.

  • spec.containers[].resources.limits.cpu
  • spec.containers[].resources.limits.memory
  • spec.containers[].resources.limits.hugepages-<size>
  • spec.containers[].resources.requests.cpu
  • spec.containers[].resources.requests.memory
  • spec.containers[].resources.requests.hugepages-<size>

개별 컨테이너에 대한 요청 및 제한만 지정할 수 있지만 Pod에 대한 전체 리소스 요청 및 제한에 대해 생각하는 것도 유용합니다. 특정 리소스의 경우 포드 리소스 요청/한도 는 포드의 각 컨테이너에 대한 해당 유형의 리소스 요청/한도 합계입니다.

 

그리고 requests는 limits를 초과 할 수 없습니다. 만약 제가 아래와 같이 설정을 한 yaml 파일을 실행한다면

root@master:~/yaml# cat resource_test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: nginx:latest
    resources:
      requests:
        memory: "2000Mi"
        cpu: "1"
      limits:
        memory: "1000Mi"
        cpu: "500m"
root@master:~/yaml# kubectl create -f resource_test.yaml
The Pod "frontend" is invalid:
* spec.containers[0].resources.requests: Invalid value: "1": must be less than or equal to cpu limit
* spec.containers[0].resources.requests: Invalid value: "2000Mi": must be less than or equal to memory limit

위와 같은 오류를 확인 할 수 있을 것입니다.

참고하시기 바랍니다.

댓글