본문 바로가기

About/Kubernetes

[k8s] Namespace, ResourceQuota, LimitRange

Namespace

네임스페이스는 쿠버네티스 클러스터 하나를 여러 개의 논리적인 단위로 나누어서 사용하는 것입니다. 네임스페이스 덕분에 쿠버네티스 클러스터 하나를 여러 개 팀이나 사용자가 공유할 수 있습니다. 또한 클러스터 안에서 용도에 따라 실행해야 하는 앱을 구분할 때도 네임스페이스를 사용합니다. 네임스페이스별로 별도의 쿼터를 설정해서 특정 네임스페이스의 사용량을 제한할 수 도 있습니다.

쿠버네티스에서 클러스터 다음으로 분리 단위가 큰 것이 이  네임스페이스이며, 네임스페이스가 가장 먼저 검토해야 할 분리 단위 입니다. 

네임스페이스는 여러 개 팀이나, 프로젝트에 많은 사용자가 있는 환경에서 사용하기 적합하며, 사용자가 거의 없거나, 수 십명 정도가 되는 경우에는 네임스페이스를 고려할 필요가 없습니다.

쿠버네티스를 처음 설치하면 기본으로 몇 개의 네임스페이스가 생성됩니다. kubectl 명령어로 현재 생성되어 있는 네임스페이스를 확인할 수 있습니다.

$ kubectl get namespaces

 

get namepaces 결과

기본 네임스페이스 별 의미는 다음과 같습니다.

◼︎ default : 기본 네임스페이스, 쿠버네티스에서 명령을 실행할 때 별도의 네임스페이스를 지정하지 않는다면 항상 defaul 네임스페이스에 명령을 적용합니다.

◼︎ kube-system : 쿠버네티스 시스템에서 관리하는 네임스페이스, 이 네임스페이스에는 쿠버네티스 관리용 파드나 설정이 있습니다.

◼︎ kube-public : 클러스터 안 모든 사용자가 읽을 수 있는 네임스페이스, 보통 클러스터 사용량 같은 정보를 이 네임스페이스에서 관리합니다. 클러스터를 사용하는 모두가 볼 수 있기 때문입니다.

◼︎ kube-node-lease : 각 노드의 임대 오브젝트(Lease Object)들을 관리하는 네임스페이스, 쿠버네티스 1.13 이후 알파 기능으로 추가됨.

새로운 네임스페이스를 생성하고 싶은 경우 두 가지 방법이 있다.

1. YAML 파일을 이용한 Namespace 생성

예를 들어 다음과 같이 my-namespace.yaml 을 구성할 수 있다.

apiVersion: v1
kind: Namespace
metadata:
  name: <insert-namespace-name-here>

그리고 다음과 같이 실행한다.

kubectl create -f ./my-namespace.yaml

2. kubectl을 이용한 Namespace 생성

kubectl create namespace <insert-namespace-name-here>

ResourceQuota

리소스 쿼터는 네임스페이스별 총 리소스 사용을 제한하는 제약 조건을 제공합니다. 유형별로 네임스페이스에서 만들 수 있는 오브젝트 수와 해당 네임스페이스의 리소스가 사용할 수 있는 총 컴퓨트 리소스의 양을 제한할 수 있습니다. 여러 사용자나 팀이 정해진 수의 노드로 클러스터를 공유할 때 한 팀이 리소스를 과도하게 사용할 수 있다는 우려가 있는데, 리소스 쿼터는 이를 해결하기 위한 도구입니다.

ResourceQuota 구성 예시

apiVersion: v1
kind: ResourceQuota
metadata:
  name: rq-1
  namespace: nm-3
spec:
  hard:
    requests.memory: 1Gi
    limits.memory: 1Gi

리소스 쿼터는 포드가 생성될 때 이미 실행되고 있는 포드와 작성 요청을 한 포드의 Reqeuests 값을 더하여 ResourceQuota를 넘었는지 확인하고, 넘은 경우는 포드 생성이 실패됩니다.


LimitRange

기본적으로 컨테이너는 쿠버네티스 클러스터에서 무제한 컴퓨팅 리소스로 실행됩니다. 리소스 쿼터를 사용하면 클러스터 관리자는 네임스페이스별로 리소스 사용과 생성을 제한할 수 있습니다. 네임스페이스 내에서 파드나 컨테이너는 네임스페이스의 리소스 쿼터에 정의된 만큼의 CPU와 메모리를 사용할 수 있는데, 이 때 하나의 파드 또는 컨테이너가 사용 가능한 모든 리소스를 독점할 수 있다는 우려가 있습니다. LimitRange는 이를 해결할 수 있는 도구로, 네임스페이스에서 움직이는 포드 하나하나의 리소스량의 상한을 설정합니다.

따라서 Namespace, ResoureceQuota, LimitRange의 관계를 다음과 같이 나타낼 수 있습니다.

LimitRange 구성 예시

apiVersion: v1
kind: LimitRange
metadata:
  name: lr-1
spec:
  limits:
  - type: Container
    min:
      memory: 0.1Gi
    max:
      memory: 0.4Gi
    maxLimitRequestRatio:
      memory: 3
    defaultRequest:
      memory: 0.1Gi
    default:
      memory: 0.2Gi

 


Namespace, ResourceQuota, LimitRange에 대하여 알아보았습니다.

참고