kubernetes - LimitRange, Resource Quota

우야·2021년 6월 18일
0
post-custom-banner

LimitRange 사용 목적?

  • 네임스페이스에 대한 리소스의 기본 cpu, 메모리 요청량(request)과 상한(limit)을 구성하는것
  • 최대, 최소값으로 pod 생성시 필요 조건을 체크할 수 있음
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - max:
      cpu: "2"
      min:
      cpu: "200m"      
  - default:
      cpu: 1
      memory: 512Mi
    defaultRequest:
      cpu: 0.5
      memory: 256Mi
    type: Container
  • 리소스 명시 하지 않고 파드 생성
apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx

----
결과
containers:
- image: nginx
  imagePullPolicy: Always
  name: default-mem-demo-ctr
  resources:
    limits:
      cpu: 1
      memory: 512Mi
    requests:
      cpu: 0.5
      memory: 256Mi
  • 리소스 상한 지정하지 않고 파드 생성
apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        cpu: 1
        memory: "128Mi"
        
---
결과
resources:
  limits:
    cpu: 1
    memory: 512Mi
  requests:
    cpu: 1
    memory: 128Mi

Resource Quota 사용 목적?

  • LimitRange는 클러스터 내에서 네임스페이스별 리소스마다의 개별 이라면,
  • Resource Quota는 클러스터 내에서 네임스페이스별 총 리스소를 제한한 제약 조건을 제공
  • 유형별로 네임스페이스에서 만들수 있는 오브젝트 수와 리소스가 사용할 수 있는 총 컴퓨트 리소스의 양을 제한할 수 있음

Resource Quota 동작 방식

  • API 서버에 --enable-admission-plugins= 플래그의 인수 중 하나로 ResourceQuota가 있는 경우 활성화
  • 각 네임스페이스에서 동작
  • ACL을 통해서 필수 사항을 적용하기 위한 지원이 계획
  • 관리자는 각 네임스페이스에 대해 하나의 리소스 쿼터를 생성
  • 사용자는 네임스페이스에 리소스를 생성하고, 쿼터 시스템은 사용량을 추적하여 리소스쿼터에 정의된 하드 리소스 제한을 초과하지 않도록한다.
  • 네임스페이스에 리소스 생성에 대한 쿼터 제약 조건을 위반하면 위반된 제약조건을 설명하는 메시지와 함께 HTTP 403 FORBIDDEN으로 요청이 실패
  • 네임스페이스에 CPU, MEMROY와 같은 리소스에 대해 쿼터가 활성화된 경우 사용자는 CPU, MEMORY값에 request, limit을 지정해야함.
    • request, limit값이 없으면 시스템이 파드 생성을 거부할 수 있음
    • 컴퓨트 리소스 요구사항이 없는 파드를 기본값으로 설정하려면, LimitRanger admission controller를 사용하면된다.

사용

  • 리소스쿼터 생성
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
  namespace: quota-mem-cpu-example
spec:
  hard:
    pods: "2"                       # pod 갯수 제한
    requests.cpu: "1"               # cpu request 제한
    requests.memory: 1Gi            # memory request 제한 
    requests.nvidia.com/gpu: "1"    # gpu request 제한
    limits.cpu: "2"                 # cpu limit 제한 
    limits.memory: 2Gi              # memory limit 제한
    limits.nvidia.com/gpu: "2"      # gpu limit 제한
    
$ kubectl get resourcequota 


apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
  namespace: quota-mem-cpu-example  
spec:
  hard:
    pods: "2"  
    limits.cpu: "1"
    limits.memory: 1Gi
    limits.nvidia.com/gpu: "1"
    requests.cpu: "2"
    requests.memory: 2Gi
    requests.nvidia.com/gpu: "2"
status:
  hard:
    pods: "2"    
    limits.cpu: "1"
    limits.memory: 1Gi
    limits.nvidia.com/gpu: "1"
    requests.cpu: "2"
    requests.memory: 2Gi
    requests.nvidia.com/gpu: "2"
  used:
    pods: "0"  
    limits.cpu: "0"
    limits.memory: "0"
    requests.cpu: "0"
    requests.memory: "0"
    requests.nvidia.com/gpu: "0"
  • cpu, memory 제한 성공의 경우
apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo
  namespace: quota-mem-cpu-example
spec:
  containers:
  - name: quota-mem-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "800Mi"
        cpu: "800m"
      requests:
        memory: "600Mi"
        cpu: "400m"
  • cpu, memory 실패인 경우
apiVersion: v1
kind: Pod
metadata:
  name: quota-mem-cpu-demo-2
  namespace: quota-mem-cpu-example
spec:
  containers:
  - name: quota-mem-cpu-demo-2-ctr
    image: redis
    resources:
      limits:
        memory: "1Gi"
        cpu: "800m"
      requests:
        memory: "700Mi"
        cpu: "400m"
Error from server (Forbidden): error when creating "examples/admin/resource/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi
  • pod 갯수 제한 실패 경우
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-quota-demo
  namespace: quota-mem-cpu-example
spec:
  selector:
    matchLabels:
      purpose: quota-demo
  replicas: 3
  template:
    metadata:
      labels:
        purpose: quota-demo
    spec:
      containers:
      - name: pod-quota-demo
        image: nginx
spec:
  ...
  replicas: 3
...
status:
  availableReplicas: 2
...
lastUpdateTime: 2017-07-07T20:57:05Z
    message: 'unable to create pods: pods "pod-quota-demo-1650323038-" is forbidden:
      exceeded quota: pod-demo, requested: pods=1, used: pods=2, limited: pods=2'
profile
Fullstack developer
post-custom-banner

0개의 댓글