네임스페이스의 최소·최대 메모리 제약 구성하기
네임스페이스의 최소·최대 메모리 제약 구성하기
이 페이지는 네임스페이스에서 실행되는 컨테이너가 사용하는 메모리에 대한 최소값과 최대값을 설정하는 방법을 보여줘요. LimitRange 객체에 최소·최대 메모리 값을 지정해요. 파드가 LimitRange가 부과하는 제약을 충족하지 못하면 그 네임스페이스에서 생성될 수 없어요.
출처: 문서
본문
시작하기 전에
Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.
클러스터에서 네임스페이스를 만들 수 있는 접근 권한이 있어야 해요. 클러스터의 각 노드에는 파드를 위한 메모리가 최소 1 GiB 있어야 해요.
네임스페이스 생성
이 연습에서 만든 리소스를 클러스터의 나머지와 격리하도록 네임스페이스를 만들어요.
kubectl create namespace constraints-mem-example
LimitRange와 파드 생성
다음은 LimitRange의 예시 매니페스트예요.
apiVersion: v1
kind: LimitRange
metadata:
name: mem-min-max-demo-lr
spec:
limits:
- max:
memory: 1Gi
min:
memory: 500Mi
type: Container
LimitRange를 만들어요.
kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints.yaml --namespace=constraints-mem-example
LimitRange에 대한 상세 정보를 확인해요.
kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml
출력은 예상대로 최소·최대 메모리 제약을 보여줘요. 하지만 LimitRange의 구성 파일에 기본값을 지정하지 않았는데도 기본값이 자동으로 만들어졌다는 점에 주목해요.
limits:
- default:
memory: 1Gi
defaultRequest:
memory: 1Gi
max:
memory: 1Gi
min:
memory: 500Mi
type: Container
이제 constraints-mem-example 네임스페이스 안에서 파드를 정의할 때마다 Kubernetes는 다음 단계를 수행해요.
- 그 파드의 어떤 컨테이너도 자체 메모리 요청과 한도를 지정하지 않으면, 컨트롤 플레인이 그 컨테이너에 기본 메모리 요청과 한도를 지정해요.
- 그 파드의 모든 컨테이너가 최소 500 MiB 메모리를 요청하는지 확인해요.
- 그 파드의 모든 컨테이너가 1024 MiB(1 GiB)를 넘지 않는 메모리를 요청하는지 확인해요.
다음은 컨테이너가 하나 있는 파드의 매니페스트예요. 파드 사양 안에서 유일한 컨테이너는 600 MiB 메모리 요청과 800 MiB 메모리 한도를 지정해요. 이것들은 LimitRange가 부과하는 최소·최대 메모리 제약을 충족해요.
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo
spec:
containers:
- name: constraints-mem-demo-ctr
image: nginx
resources:
limits:
memory: "800Mi"
requests:
memory: "600Mi"
파드를 만들어요.
kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod.yaml --namespace=constraints-mem-example
파드가 실행 중이고 컨테이너가 건강한지 확인해요.
kubectl get pod constraints-mem-demo --namespace=constraints-mem-example
파드에 대한 상세 정보를 확인해요.
kubectl get pod constraints-mem-demo --output=yaml --namespace=constraints-mem-example
출력은 그 파드의 컨테이너가 600 MiB 메모리 요청과 800 MiB 메모리 한도를 가짐을 보여줘요. 이것들은 이 네임스페이스에 대해 LimitRange가 부과한 제약을 충족해요.
resources:
limits:
memory: 800Mi
requests:
memory: 600Mi
파드를 삭제해요.
kubectl delete pod constraints-mem-demo --namespace=constraints-mem-example
최대 메모리 제약을 초과하는 파드 생성 시도
다음은 컨테이너가 하나 있는 파드의 매니페스트예요. 컨테이너는 800 MiB 메모리 요청과 1.5 GiB 메모리 한도를 지정해요.
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo-2
spec:
containers:
- name: constraints-mem-demo-2-ctr
image: nginx
resources:
limits:
memory: "1.5Gi"
requests:
memory: "800Mi"
파드 생성을 시도해요.
kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-2.yaml --namespace=constraints-mem-example
출력은 파드가 생성되지 않음을 보여줘요. 허용된 것보다 더 많은 메모리를 요청하는 컨테이너를 정의하기 때문이에요.
Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-2.yaml":
pods "constraints-mem-demo-2" is forbidden: maximum memory usage per Container is 1Gi, but limit is 1536Mi.
최소 메모리 요청을 충족하지 못하는 파드 생성 시도
다음은 컨테이너가 하나 있는 파드의 매니페스트예요. 그 컨테이너는 100 MiB 메모리 요청과 800 MiB 메모리 한도를 지정해요.
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo-3
spec:
containers:
- name: constraints-mem-demo-3-ctr
image: nginx
resources:
limits:
memory: "800Mi"
requests:
memory: "100Mi"
파드 생성을 시도해요.
kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-3.yaml --namespace=constraints-mem-example
출력은 파드가 생성되지 않음을 보여줘요. 강제된 최소값보다 적은 메모리를 요청하는 컨테이너를 정의하기 때문이에요.
Error from server (Forbidden): error when creating "examples/admin/resource/memory-constraints-pod-3.yaml":
pods "constraints-mem-demo-3" is forbidden: minimum memory usage per Container is 500Mi, but request is 100Mi.
메모리 요청이나 한도를 지정하지 않는 파드 생성
다음은 컨테이너가 하나 있는 파드의 매니페스트예요. 컨테이너는 메모리 요청도 지정하지 않고 메모리 한도도 지정하지 않아요.
apiVersion: v1
kind: Pod
metadata:
name: constraints-mem-demo-4
spec:
containers:
- name: constraints-mem-demo-4-ctr
image: nginx
파드를 만들어요.
kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints-pod-4.yaml --namespace=constraints-mem-example
파드에 대한 상세 정보를 확인해요.
kubectl get pod constraints-mem-demo-4 --namespace=constraints-mem-example --output=yaml
출력은 파드의 유일한 컨테이너가 1 GiB 메모리 요청과 1 GiB 메모리 한도를 가짐을 보여줘요. 그 컨테이너는 어떻게 그 값을 얻었을까요?
resources:
limits:
memory: 1Gi
requests:
memory: 1Gi
파드가 그 컨테이너에 어떤 메모리 요청과 한도도 정의하지 않았기 때문에, 클러스터는 LimitRange에서 기본 메모리 요청과 한도를 적용했어요. 이는 그 파드의 정의가 그 값들을 보여준다는 뜻이에요. kubectl describe로 확인할 수 있어요.
# Look for the "Requests:" section of the output
kubectl describe pod constraints-mem-demo-4 --namespace=constraints-mem-example
이 시점에 파드가 실행 중일 수도 있고 아닐 수도 있어요. 이 작업의 전제 조건은 노드에 최소 1 GiB 메모리가 있다는 것이었어요. 각 노드에 1 GiB 메모리만 있다면, 1 GiB 메모리 요청을 수용할 충분한 할당 가능(allocatable) 메모리가 어떤 노드에도 없어요. 2 GiB 메모리 노드를 사용한다면 1 GiB 요청을 수용할 공간이 충분할 거예요.
파드를 삭제해요.
kubectl delete pod constraints-mem-demo-4 --namespace=constraints-mem-example
최소·최대 메모리 제약의 적용
LimitRange가 네임스페이스에 부과하는 최대·최소 메모리 제약은 파드가 생성되거나 업데이트될 때만 적용돼요. LimitRange를 변경해도 이전에 생성된 파드에는 영향이 없어요.
최소·최대 메모리 제약의 동기
클러스터 관리자로서 파드가 사용할 수 있는 메모리 양에 제한을 두고 싶을 수 있어요. 예를 들어:
- 클러스터의 각 노드에 2 GiB 메모리가 있어요. 클러스터의 어떤 노드도 그 요청을 지원할 수 없으므로, 2 GiB보다 많은 메모리를 요청하는 파드를 받아들이고 싶지 않아요.
- 클러스터를 프로덕션과 개발 부서가 공유해요. 프로덕션 워크로드는 최대 8 GiB 메모리를 소비하도록 허용하고, 개발 워크로드는 512 MiB로 제한하고 싶어요. 프로덕션과 개발용으로 별도의 네임스페이스를 만들고, 각 네임스페이스에 메모리 제약을 적용해요.
정리
네임스페이스를 삭제해요.
kubectl delete namespace constraints-mem-example
다음 단계
클러스터 관리자용
- 네임스페이스의 기본 메모리 요청·한도 구성
- 네임스페이스의 기본 CPU 요청·한도 구성
- 네임스페이스의 최소·최대 CPU 제약 구성
- 네임스페이스의 메모리·CPU 쿼터 구성
- 네임스페이스의 파드 쿼터 구성
- API 객체 쿼터 구성
애플리케이션 개발자용