쿠버네티스 클러스터에는 사용할 수 있는 전체 자원(memory, cpu, namespace, pod,...)이 있다.
만약 한 네임스페이스의 파드가 클러스터의 모든 memory 및 cpu 자원을 사용해버리면 다른 네임스페이스에서 자원이 부족해 문제가 생긴다.
이럴 때 ResourceQuota와 LimitRange를 사용하면 Namespace와 Pod의 자원 사용량 한계를 각각 지정할 수 있어 위와 같은 문제를 방지할 수 있다.
ResourceQuota와 LimitRange는 네임스페이스뿐만 아니라 여러 클러스터 오브젝트에 사용할 수 있다.
쿠버네티스 클러스터의 논리적인 분리 단위이다. Namespace별로 자원을 분리해서 관리하고자 할 때 사용한다. 물리적이나 기타 장치를 통해 환경을 분리한 것은 아니므로 주의해야 한다.
한 Namespace 안에서는 중복된 이름의 파드가 존재할 수 없다. 같은 오브젝트라면 다른 이름이 지정되어야 한다.
자원을 분리해서 관리하는 것이기 때문에 다른 Namespace에 있는 자원을 사용하거나 연결할 수 없다. 예를 들면, namespace1에 있는 Service는 namespace2에 있는 Pod의 label을 select해도 연결할 수 없다.
오브젝트를 사용할 수는 없지만, 다른 Namespace에 있는 Pod와 통신은 가능하다. 즉 IP 트래픽은 막아주지 않는다. 이것을 제한하기 위해서는 Network Policy라는 오브젝트를 통해 제한할 수 있다.
모든 Namespace에서 PV나 Node등은 공용으로 사용 가능하다.
Namespace를 지우게 되면 그 안에 있는 자원들도 모두 지워지기 때문에 주의해야 한다.
NodePort도 Namespace로 나눌 수 없다.
네임스페이스의 자원 한계를 설정하는 오브젝트이다.
ResourceQuota를 사용해 자원 한계를 설정한 상태에서 파드를 만들때, 자원 사용량을 설정해주지 않으면 파드가 생성되지 않는다. ResourceQuota를 설정해준 상태라면 파드를 생성할 때 사용량을 반드시 설정해주어야 한다.
네임스페이스에 이미 파드가 있는 경우, 이미 있는 파드의 사용량과 새로 만들 파드의 사용량을 더한 것이 ResourceQuota의 한계를 초과한다면 파드가 생성되지 않는다.
리소스 제한뿐만 아니라 Namespace에 있는 오브젝트의 개수도 제한할 수 있다. 모든 오브젝트를 제한할 수는 없고, 가능한 오브젝트들이 있다.
Compute Resource: cpu, memory, storage
Objects Count : Pod, Service, ConfigMap, PVC, ...
ResourceQuota를 생성하는 경우 파드에 사용량이 적혀있지 않아도 그냥 그대로 진행된다. 그래서 ResourceQuota를 생성할 때는 네임스페이스에 파드가 있는지 먼저 확인하는 것이 좋고, 파드를 생성하기 전에 ResourceQuota를 만드는 것이 좋다.각각의 파드마다 네임스페이스에 들어올 수 있는 자원인지 체크한다.
만약 yaml파일에서 type: Container로 명시해주면 컨테이너의 자원량을 체크하는 LimitRange를 생성하는 것이다.
spec:
limits:
# 파드에서 설정되는 메모리의 limit 값이 넘어야 하는 용량(최소 용량)
min:
cpu: 10m
memory: 10Mib
# 최대 용량
max:
cpu: 1000m
memory: 200Mib
# requests와 limits의 비율. 여기서는 3이므로 requests=1 limits=4 이면 4배이므로 불가능하다.
maxLimitRequestRatio:
memory: 3
# 디폴트값. 사용량을 명시하지 않고 파드를 생성하면 해당 디폴트값으로 생성된다.
defaultRequest:
memory: 1Gi
default:
memory: 2Gi
# 컨테이너 자원의 사용 가능 범위를 체크하겠다
type: Container
한 네임스페이스에 여러 개의 `LimitRange를 설정할 수 있긴 하지만 원하는 대로 작동하지 않을 수 있다. max는 첫번째꺼로 적용, default는 두번째거로 적용.... 등등 이상하게 동작할 수 있어 하나만 사용하는 것이 좋다.