본문 바로가기
  • 지요미의 IT성장일기
Kubernetes

Kubernetes - ResourceQuota관리

by 지요미=P 2024. 2. 20.
728x90

ResourceQuota

하나의 기능임!
리소스 쿼터를 사용하여 각 네임스페이스마다, 즉 가상 쿠버네티스 클러스터마다 사용 가능한 리소스를 제한할 수 있다.
리소스 쿼터는 생성이나 변경으로 그 시점에 제한이 걸린 상태가 되어도
이미 생성된 리소스에는 영향을 주지 않기 때문에 주의해야 한다.
리소스 쿼터는 크게 '생성 가능한 리소스 제한'과 '리소스 사용량 제한'으로 나눌 수 있다.

 

총량이 CPU가 4G, RAM 2G라고 정해둔다면

아무리 파드를 만들어도 이 정해진 범위를 넘어서 생성되지 않는다.


실습해보자.

 

 

kubectl create namespace jyoonchu

먼저 네임스페이스를 하나 만들어줌.

 

# vi sample-resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: sample-resourcequota
  namespace: jyoonchu
spec:
  hard:
    count/pods: 5

# kubectl apply -f sample-resourcequota.yaml

파드의 갯수는 5개로 지정함

제한된 용량을 초과하면 파드가 지워지거나 파드가 멈추기도 한다.

 

k describe resourcequotas sample-resourcequota -n jyoonchu

방금 만든 내용을 확인함.

5개가 만들어졌고, 현재 사용 중이지는 않음.

 

kubectl run new-nginx1 --image=34.22.96.240:5000/nginx:latest -n jyoonchu

GCP 도커인스턴스의 외부 IP

1개가 생성됨!!

 

5개를 만들어보았더니 모두 생성됨.

그 후 6개번째 생성하려고 했더니 파드 갯수의 제한으로 인해 Error가 뜨고 만들어지지 않음!

 

k delete pod -n jyoonchu --all

 

실습 후 모든 자원 삭제 완료~~

 


# vi sample-resourcequota-usable.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: sample-resourcequota-usable
  namespace: jyoonchu
spec:
  hard:
# 네임스페이스의 모든 파드에 대해, 각 컨테이너에는 메모리 요청량(request), 메모리 상한(limit), CPU 요청량 및 CPU 상한이 있어야 한다.
    requests.cpu: "1" # 네임스페이스의 모든 파드에 대한 총 CPU 요청량은 1 cpu를 초과해서는 안된다.
    requests.memory: 1Gi # 네임스페이스의 모든 파드에 대한 총 메모리 요청량은 1GiB를 초과하지 않아야 한다.
    requests.storage: 5Gi
    requests.ephemeral-storage: 5Gi
    requests.nvidia.com/gpu: 2
    limits.cpu: 4 # 네임스페이스의 모든 파드에 대한 총 CPU 상한은 4 cpu를 초과해서는 안된다.
    limits.memory: 2Gi # 네임스페이스의 모든 파드에 대한 총 메모리 상한은 2GiB를 초과하지 않아야 한다.
#    limits.storage: 10Gi
    limits.ephemeral-storage: 10Gi
    limits.nvidia.com/gpu: 4
    sample-storageclass.storageclass.storage.k8s.io/requests.storage: 5Gi

# k apply -f sample-resourcequota-usable.yaml

 

현재 네임스페이스에 리소스가 없는데도 만들어지지 않는다?

Error from server (Forbidden): pods "new-nginx1" is forbidden: failed quota: sample-resourcequota-usable: must specify limits.cpu,limits.memory,requests.cpu,requests.memory

이 에러의 의미:

리소스를 쿼터를 지정하지 않았기 때문에 만들어지지 않는다.

 

 

# vi sample-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
  namespace: jyoonchu
spec:
  containers:
  - name: nginx-container
    image: 34.22.96.240:5000/nginx:latest
    
# kubectl apply -f sample-pod.yaml

이렇게 해도 만들어지지 않는다!!

 

# vi sample-resource.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-resource
  namespace: jyoonchu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: nginx-container
        image: 34.22.96.240:5000/nginx:latest
        resources:
          requests: # 최소
            memory: "1Gi"
            cpu: "2"
          limits: # 최대
            memory: "2Gi"
            cpu: "4"
            
# k apply -f sample-resource.yaml

 

용량을 넣었더니 일단 들어는 감!

 

deploy에는 있는데 pod가 없네?!

결국 생성되지 않은것임..

 

 

이유를 확인해보자구

k describe deployments.apps sample-resource -n jyoonchu

 cpu 1개를 초과하지 말라고 했는데 yaml 파일을 보면 2개로 지정되어 있음..

request가 오버되어 pod가 생성되지 않은 것이다.

 

k describe resourcequotas -n jyoonchu sample-resourcequota-usable

보면 파드가 아예 생성 자체가 되지 않은 것을 확인할 수 있다.

 

 

아까 정의했던 sample-resource.yaml 내용을 변경해보기!!

# vi sample-resource.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-resource
  namespace: jyoonchu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: nginx-container
        image: 34.22.96.240:5000/nginx:latest
        resources:
          requests: # 최소
            memory: "250Mi"
            cpu: "250m"
          limits: # 최대
            memory: "500Mi"
            cpu: "1"

# k apply -f sample-resource.yaml

 

바로 1개가 생김!!

 

 

그렇다면~

k edit deployments.apps -n jyoonchu sample-resource

edit에서 replicas 갯수를 4개로 변경해 보았음!

 

파드가 4개로 바로 변경된 것을 확인할 수 있었음....!

 

어렵다 ㅠㅠ

 

 

만약 scale out으로 갯수를 5개로 만들어본다면?

k edit deployments.apps -n jyoonchu sample-resource

CPU가 250으로 설정되기에 초과했어도 파드가 생기지 않는다.

 

 

 

실습자원 삭제하기!

k delete -f sample-resource.yaml
728x90