
하나의 k8s 클러스터는 개념적으로 완전히 구분된 영역을 나타내는 N개의 Namespace로 구성된다.
각 Namespace는 무한대로 클러스터이 갖고 있는 자원을 사용할 수는 없고, ResourceQuota로 정의한 만큼만 자원을 최대로 사용할 수 있다.
그리고, Namespace에 새로운 컴포넌트를 생성할 때, 그 하나의 컴포넌트는 LimitRange에 정의된 범위 이내에서만 생성할 수 있다.
이렇게 ResourceQuota와 imitRange는 자원의 최대 사용량을 설정하기 위해서 사용되는 컴포넌트들이다.
이 컴포넌트들은 amespace 뿐만 아니라, 클러스터에 할당하여 클러스터 전체의 자원을 관리할 수도 있다.
위에서 이야기한 각각을 어떻게 생성하는지 알아보자.
apiVersion: v1
kind: Namespace
metadata:
name: namespace-1
별도의 Namespace는 위와 같이 간단하게 만들어줄 수 있다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: resource-quota-1
namespace: namespace-1
spec:
hard:
requests.memory: 3Gi
limits.memory: 6Gi
pods: "2"
ResourceQuota는 위와 같이 yml을 작성하여 생성할 수 있다.
ResourceQuota로 제한할 수 있는 것은 CPU 뿐만 아니라 Memory, Storage도 있고, Pod, Service와 같은 컴포넌트의 개수 또한 제한할 수 있다.
apiVersion: v1
kind: LimitRange
metadata:
name: limit-range-1
namespace: namespace-1
spec:
limits:
- type: Container
min:
memory: 0.1Gi
max:
memory: 1Gi
defaultRequest:
memory: 0.2Gi
default:
memory: 0.5Gi
maxLimitRequestRatio:
memory: "3"
LimitRange는 한번에 생성 가능한 컴포넌트의 자원의 최소값(min)과 최대값(min)을 설정할 수 있을 뿐만 아니라, 자원 스펙이 명시되지 않은 컴포넌트를 생성할 경우 request의 기본값(defaultRequest)과 limits의 기본값(default)을 설정할 수도 있다.
또, requests에 명시된 값과 limits에 명시된 값의 비율(maxLimitRequestRatio)도 제한할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: pod-4
namespace: namespace-1
spec:
containers:
- name: container-1
image: kai1114/hello
resources:
requests:
memory: 0.1Gi
limits:
memory: 0.2Gi
ResourceQuota나 LimitRange가 존재한다고 해서, 사실 컴포넌트를 생성할 때 특별히 달라지는 것은 없고, 위와 같이 자원에대한 Spec을 명시해서 생성해주면 된다.