반응형

 

파드 및 컨테이너 리소스 관리

파드를 생성 및 지정할 때, 컨테이너에 필요한 리소스의 자원을 선택하여 지정할 수 있다. 지정할 가장 일반적인 리소스는 CPU와 메모리(RAM) 그리고 다른 것들이 있다.

파드에서 컨테이너에 대한 리소스 요청(request) 을 지정하면, kube-scheduler는 이 정보를 사용하여 파드가 배치될 노드를 결정한다. 컨테이너에 대한 리소스 제한(limit) 을 지정하면, kubelet은 실행 중인 컨테이너가 설정한 제한보다 많은 리소스를 사용할 수 없도록 해당 제한을 적용한다. 또한 kubelet은 컨테이너가 사용할 수 있도록 해당 시스템 리소스의 최소 요청 자원을 예약한다.

요청 및 제한

파드가 실행 중인 노드에 사용 가능한 리소스가 충분하면, 컨테이너가 해당 리소스에 지정한 request 보다 더 많은 리소스를 사용할 수 있도록 허용된다. 그러나, 컨테이너는 리소스 limit 보다 더 많은 리소스를 사용할 수는 없다.

예를 들어, 컨테이너에 대해 256MiB의 memory 요청을 설정하고, 해당 컨테이너가 8GiB의 메모리를 가진 노드로 스케줄된 파드에 있고 다른 파드는 없는 경우, 컨테이너는 더 많은 RAM을 사용할 수 있다.

해당 컨테이너에 대해 4GiB의 memory 제한을 설정하면, kubelet(그리고 컨테이너 런타임)이 제한을 적용한다. 런타임은 컨테이너가 구성된 리소스 제한을 초과하여 사용하지 못하게 한다. 예를 들어, 컨테이너의 프로세스가 허용된 양보다 많은 메모리를 사용하려고 하면, 시스템 커널은 메모리 부족(out of memory, OOM) 오류와 함께 할당을 시도한 프로세스를 종료한다.

제한은 반응적(시스템이 위반을 감지한 후에 개입)으로 또는 강제적(시스템이 컨테이너가 제한을 초과하지 않도록 방지)으로 구현할 수 있다. 런타임마다 다른 방식으로 동일한 제약을 구현할 수 있다.

 

파드와 컨테이너의 리소스 요청 및 제한

각 컨테이너에 대해, 다음과 같은 리소스 제한(limit) 및 요청(request)을 지정할 수 있다.

  • 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>

 

쿠버네티스의 리소스 단위

CPU 리소스 단위

CPU 리소스에 대한 제한 및 요청은 cpu 단위로 측정된다. 쿠버네티스에서, 1 CPU 단위는 노드가 물리 호스트인지 아니면 물리 호스트 내에서 실행되는 가상 머신인지에 따라 1 물리 CPU 코어 또는 1 가상 코어 에 해당한다.

요청량을 소수점 형태로 명시할 수도 있다. 컨테이너의 spec.containers[].resources.requests.cpu를 0.5로 설정한다는 것은, 1.0 CPU를 요청했을 때와 비교하여 절반의 CPU 타임을 요청한다는 의미이다. CPU 자원의 단위와 관련하여, 0.1 이라는 수량 표현은 "백 밀리cpu"로 읽을 수 있는 100m 표현과 동일하다. 어떤 사람들은 "백 밀리코어"라고 말하는데, 같은 것을 의미하는 것으로 이해된다.

CPU 리소스는 항상 리소스의 절대량으로 표시되며, 상대량으로 표시되지 않는다. 예를 들어, 컨테이너가 싱글 코어, 듀얼 코어, 또는 48 코어 머신 중 어디에서 실행되는지와 상관없이 500m CPU는 거의 같은 양의 컴퓨팅 파워를 가리킨다.

참고: 쿠버네티스에서 CPU 리소스를 1m보다 더 정밀한 단위로 표기할 수 없다. 이 때문에, CPU 단위를 1.0 또는 1000m보다 작은 밀리CPU 형태로 표기하는 것이 유용하다. 예를 들어, 0.005 보다는 5m으로 표기하는 것이 좋다.

메모리 리소스 단위

memory 에 대한 제한 및 요청은 바이트 단위로 측정된다. E, P, T, G, M, k 와 같은 수량 접미사 중 하나를 사용하여 메모리를 일반 정수 또는 고정 소수점 숫자로 표현할 수 있다. Ei, Pi, Ti, Gi, Mi, Ki와 같은 2의 거듭제곱을 사용할 수도 있다. 예를 들어, 다음은 대략 동일한 값을 나타낸다.

128974848, 129e6, 129M, 128974848000m, 123Mi

접미사의 대소문자에 유의한다. 400m의 메모리를 요청하면, 이는 0.4 바이트를 요청한 것이다. 이 사람은 아마도 400 메비바이트(mebibytes) (400Mi) 또는 400 메가바이트 (400M) 를 요청하고 싶었을 것이다.

 

 

 

 

YAML을 이용하여 request 리소스 pod 생성

# reqeust 리소스를 이용하여 cpu 0.25 코어 RAM 500M 생성
master@master:~$ cat request.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: request 
spec:
  containers: 
  - name: nginx
    image: nginx
    resources:
      requests:
        cpu: 250m
        memory: 500Mi
master@master:~$

master@master:~$ kubectl apply -f request.yaml 
pod/request created
master@master:~$ 

master@master:~$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
volume-nginx   1/1     Running   1          2d4h
env-pod        1/1     Running   1          2d3h
request        1/1     Running   0          6s
master@master:~$ 

master@master:~$ kubectl get pod request -oyaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"request","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"nginx","resources":{"requests":{"cpu":"250m","memory":"500Mi"}}}]}}
  creationTimestamp: "2022-08-09T12:33:02Z"
  name: request
  namespace: default
  resourceVersion: "15774"
  selfLink: /api/v1/namespaces/default/pods/request
  uid: 53aec9d6-6831-4d6e-b7ff-870a35eff92a
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
    resources:
      requests:
        cpu: 250m
        memory: 500Mi

 

 

YAML을 이용하여 limit 리소스 pod 생성

# limit 리소스를 이용하여 cpu 0.5 코어 RAM 1G 생성
master@master:~$ cat limits.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: limit 
spec:
  containers: 
  - name: nginx 
    image: nginx
    resources:
     limits:
       cpu: 500m
       memory: 1Gi
master@master:~$ 

master@master:~$ kubectl apply -f limits.yaml 
pod/limit created
master@master:~$ 

master@master:~$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
volume-nginx   1/1     Running   1          2d4h
env-pod        1/1     Running   1          2d4h
request        1/1     Running   0          14m
limit          1/1     Running   0          13m
master@master:~$ 

master@master:~$ kubectl get pod limit -oyaml
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"limit","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"nginx","resources":{"limits":{"cpu":"500m","memory":"1Gi"}}}]}}
  creationTimestamp: "2022-08-09T12:34:54Z"
  name: limit
  namespace: default
  resourceVersion: "15864"
  selfLink: /api/v1/namespaces/default/pods/limit
  uid: 25e779dd-5f44-4c14-af31-108df5f8658d
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
    resources:
      limits:
        cpu: 500m
        memory: 1Gi
      requests:
        cpu: 500m
        memory: 1Gi

 

 

 

 

 

 

 

 

 

참고자료

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

반응형

+ Recent posts