리소스 쿼터 만들고 사용하기
리소스 쿼터 만들고 사용하기 (Create and use resource quotas)
노마드 엔터프라이즈는 리소스 쿼터(resource quotas)를 지원하며, 이를 통해 운영자가 네임스페이스의 총 리소스 사용량을 제한할 수 있어요. 쿼터 명세가 네임스페이스에 연결되면 노마드 클러스터는 그 네임스페이스의 작업에 의한 모든 리소스 사용량을 쿼터 한도에 집계해요. 리소스가 소진되면 다른 작업이 끝나거나 쿼터가 확장되어 리소스를 사용할 수 있게 될 때까지 네임스페이스 내의 할당은 대기열에 들어가요.
이 가이드에서는 global 리전의 리소스를 제한하는 쿼터를 만들어요. 그런 다음 작업을 배포할 네임스페이스에 쿼터를 할당해요. 마지막으로 ACL로 쿼터를 보호하는 방법을 배워요.
엔터프라이즈: 이 기능은 노마드 엔터프라이즈를 필요로 해요.
출처: 문서
본문
쿼터 정의하고 만들기
리소스 쿼터는 nomad quota 하위 명령으로 관리할 수 있어요. 쿼터 명세 만들기를 시작하려면 예시 쿼터 명세를 생성하는 nomad quota init을 실행해요.
$ nomad quota init
Example quota specification written to spec.hcl
spec.hcl 파일은 global 리전에 대한 한도를 정의해요. 다른 리전을 제한하려면 추가 한도를 지정할 수 있어요.
# spec.hcl
name = "default-quota"
description = "Limit the shared default namespace"
# Create a limit for the global region. Additional limits may
# be specified in-order to limit other regions.
limit {
region = "global"
region_limit {
cores = 0
cpu = 2500
memory = 1000
memory_max = 1000
device "nvidia/gpu/1080ti" {
count = 1
}
}
variables_limit = 1000
}
리소스 한도 (Resource limits)
리소스 한도를 지정할 때 다음 시행 동작이 정의돼요:
- limit < 0: 0보다 작은 한도는 리소스에 대한 모든 접근을 허용하지 않아요.
- limit == 0: 0의 한도는 리소스에 대한 무제한 접근을 허용해요.
- limit > 0: 0보다 큰 한도는 소비가 주어진 한도 이하(<=)임을 강제해요.
참고: 장치의 수(count)를 지정하는 한도는 다르게 동작해요. count > 0은 소비가 주어진 한도 이하임을 강제하고, 0으로 설정하면 주어진 장치의 사용을 허용하지 않아요. 다른 한도와 달리 장치 count는 음수로 설정할 수 없어요. 장치 리소스에 무제한 접근을 허용하려면 리전 한도에서 제거해 주세요.
쿼터 명세는 하나 이상의 리소스 한도로 구성돼요. 각 한도는 특정 노마드 리전에 적용돼요. limit 객체 안에서 운영자는 허용되는 CPU와 메모리 사용량을 지정할 수 있어요.
쿼터 만들기
쿼터를 만들려면 쿼터 명세의 파일 이름으로 nomad quota apply를 실행해요.
$ nomad quota apply spec.hcl
Successfully applied quota specification "default-quota"!
nomad quota list로 성공을 확인해요.
$ nomad quota list
Name Description
default-quota Limit the shared default namespace
네임스페이스에 쿼터 연결
쿼터가 시행되려면 쿼터 명세를 네임스페이스에 연결해야 해요. 이는 nomad namespace apply 명령으로 할 수 있어요. 다음과 같이 기본 네임스페이스에 새 쿼터 명세를 추가해요:
$ nomad namespace apply -quota default-quota default
Successfully applied namespace "default"!
쿼터 정보 보기
이제 네임스페이스에 쿼터를 연결했으니 기본 네임스페이스에서 작업을 실행할 수 있어요.
작업을 초기화해요.
$ nomad job init
Example job file written to example.nomad.hcl
기본 네임스페이스에서 작업을 실행해요.
$ nomad job run -detach example.nomad.hcl
Job registration successful
Evaluation ID: 985a1df8-0221-b891-5dc1-4d31ad4e2dc3
상태를 확인해요.
$ nomad quota status default-quota
Name = default-quota
Description = Limit the shared default namespace
Limits = 1
Quota Limits
Region CPU Usage Core Usage Memory Usage Memory Max Usage Variables Usage
global 0 / 2500 0 / inf 0 / 1000 0 / 1000 0 / 1000
Quota Device Limits
Region Device Name Device Usage
global nvidia/gpu/1080ti 1 / 1
새로 만든 작업이 "default-quota" 쿼터에 연결된 네임스페이스에서 실행되고 있으므로 쿼터 명세에 집계되는 것을 확인할 수 있어요.
$ nomad job run -detach example.nomad.hcl
Job registration successful
Evaluation ID: ce8e1941-0189-b866-3dc4-7cd92dc38a69
이제 count = 1을 count = 4로 바꿔 작업 인스턴스를 더 추가하고 추가 할당이 생겼는지 확인해요.
$ nomad status example
ID = example
Name = example
Submit Date = 10/16/17 10:51:32 PDT
Type = service
Priority = 50
Datacenters = dc1
Status = running
Periodic = false
Parameterized = false
Summary
Task Group Queued Starting Running Failed Complete Lost
cache 1 0 3 0 0 0
Placement Failure
Task Group "cache":
* Quota limit hit "memory exhausted (1024 needed > 1000 limit)"
Latest Deployment
ID = 7cd98a69
Status = running
Description = Deployment is running
Deployed
Task Group Desired Placed Healthy Unhealthy
cache 4 3 0 0
Allocations
ID Node ID Task Group Version Desired Status Created At
6d735236 81f72d90 cache 1 run running 10/16/17 10:51:32 PDT
ce8e1941 81f72d90 cache 1 run running 10/16/17 10:51:32 PDT
9b8e185e 81f72d90 cache 1 run running 10/16/17 10:51:24 PDT
출력은 노마드가 두 개의 할당을 더 만들었지만, 메모리에서 쿼터를 초과 구독하게 만들었을 네 번째 할당은 배치하지 않았음을 나타내요.
ACL로 쿼터 보호
쿼터에 대한 접근은 ACL로 제한할 수 있어요. 예를 들어 쿼터에 읽기 전용 접근을 허용하는 ACL 정책을 만들 수 있어요.
# Allow read only access to quotas.
quota {
policy = "read"
}
쿼터 명세를 늘리거나 제거함으로써 사용자가 쿼터 시행을 우회하지 못하게 하려면 적절한 ACL이 필요해요.
연합 클러스터 설계
노마드는 권위 있는(authoritative) 노마드 리전에서 쿼터 명세를 복제함으로써 연합 클러스터에서 쿼터를 쉽게 다룰 수 있게 해요. 이를 통해 운영자는 단일 클러스터와 상호작용하면서 모든 노마드 클러스터에 적용되는 쿼터 명세를 만들 수 있어요.
예를 들어 두 리전에 적용되는 쿼터 명세를 만들 수 있어요:
name = "federated-example"
description = "A single quota spec affecting multiple regions"
# Create a limits for two regions
limit {
region = "europe"
region_limit {
cpu = 20000
memory = 10000
}
}
limit {
region = "asia"
region_limit {
cpu = 10000
memory = 5000
}
}
명세를 적용해요.
$ nomad quota apply spec.hcl
Successfully applied quota specification "federated-example"!
이제 명세가 적용되고 각 리전에 작업이 있는 네임스페이스에 연결되었으므로, nomad quota status 명령으로 연합 클러스터 전반에 시행이 어떻게 적용되는지 관찰해요.
$ nomad quota status federated-example
Name = federated-example
Description = A single quota spec affecting multiple regions
Limits = 2
Quota Limits
Region CPU Usage Memory Usage
asia 2500 / 10000 1000 / 5000
europe 8800 / 20000 6000 / 10000
쿼터에 대해 더 알아보기
쿼터 작업에 대한 자세한 내용은 quota 명령과 HTTP API 문서를 참고해 주세요.