네임스페이스의 기본 메모리 request·limit 구성하기
네임스페이스의 기본 메모리 request·limit 구성하기
이 페이지에서는 네임스페이스의 기본 메모리 request와 limit을 구성하는 방법을 보여줘요.
쿠버네티스 클러스터는 네임스페이스로 나눌 수 있어요. 기본 메모리 limit이 있는 네임스페이스가 있고, 그 네임스페이스에서 컨테이너가 자신만의 메모리 limit을 지정하지 않는 파드를 만들면, LimitRange가 그 컨테이너에 기본 메모리 limit을 할당해요.
쿠버네티스는 이 페이지 나중에 설명할 특정 조건에서 기본 메모리 request도 할당해요.
출처: 문서
본문
시작하기 전에
클러스터에서 네임스페이스를 만들 수 있는 접근 권한이 있어야 해요.
클러스터의 각 노드에는 최소 2 GiB의 메모리가 있어야 합니다.
네임스페이스 만들기
이 연습에서 만드는 리소스가 클러스터의 다른 부분과 격리되도록 네임스페이스를 만들어요.
kubectl create namespace default-mem-example
LimitRange와 Pod 만들기
다음은 예시 LimitRange의 매니페스트예요. 매니페스트는 기본 메모리 request와 기본 메모리 limit을 지정합니다.
default-mem-example 네임스페이스에서 LimitRange를 만들어요:
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example
이제 default-mem-example 네임스페이스에서 파드를 만들 때, 그 파드 안의 어떤 컨테이너가 메모리 request와 limit에 대해 자신만의 값을 지정하지 않으면 LimitRange가 256MiB의 메모리 request와 512MiB의 메모리 limit이라는 기본값을 적용해요.
다음은 컨테이너 하나를 가진 파드의 예시 매니페스트예요. 컨테이너는 메모리 request와 limit을 지정하지 않습니다.
파드를 만들어요.
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example
파드에 대한 상세 정보를 확인해요:
kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
출력은 파드의 컨테이너가 메모리 request 256 MiB와 limit 512 MiB를 가진 것을 보여줘요. 이는 LimitRange가 지정한 기본값입니다.
containers:
- image: nginx
imagePullPolicy: Always
name: default-mem-demo-ctr
resources:
limits:
memory: 512Mi
requests:
memory: 256Mi
파드를 삭제해요:
kubectl delete pod default-mem-demo --namespace=default-mem-example
컨테이너의 limit을 지정했지만 request는 지정하지 않았다면?
다음은 컨테이너 하나를 가진 파드의 매니페스트예요. 컨테이너는 메모리 limit을 지정하지만 request는 지정하지 않습니다.
파드를 만들어요:
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example
파드에 대한 상세 정보를 확인해요:
kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example
출력은 컨테이너의 메모리 request가 메모리 limit과 일치하도록 설정된 것을 보여줘요. 컨테이너에 기본 메모리 request 값인 256Mi가 할당되지 않았다는 점을 주목하세요.
resources:
limits:
memory: 1Gi
requests:
memory: 1Gi
컨테이너의 request를 지정했지만 limit은 지정하지 않았다면?
다음은 컨테이너 하나를 가진 파드의 매니페스트예요. 컨테이너는 메모리 request를 지정하지만 limit은 지정하지 않습니다.
파드를 만들어요:
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example
파드의 스펙을 확인해요:
kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example
출력은 컨테이너의 메모리 request가 컨테이너 매니페스트에 지정된 값으로 설정된 것을 보여줘요. 컨테이너는 네임스페이스의 기본 메모리 limit과 일치하는 512MiB 이하의 메모리만 사용하도록 제한됩니다.
resources:
limits:
memory: 512Mi
requests:
memory: 128Mi
LimitRange는 적용하는 기본값의 일관성을 확인하지 않아요. 즉 LimitRange가 설정한 limit 기본값이 클라이언트가 API 서버에 제출한 스펙의 컨테이너 request 값보다 작을 수 있어요. 이 경우 최종 파드는 스케줄 가능하지 않습니다. 자세한 내용은 리소스 limit·request에 대한 제약을 참고하세요.
기본 메모리 limit·request의 동기
네임스페이스에 메모리 리소스쿼터가 구성되어 있다면 메모리 limit의 기본값을 마련해 두는 것이 유용해요. 다음은 리소스 쿼터가 네임스페이스에 부과하는 세 가지 제한입니다:
- 네임스페이스에서 실행되는 모든 파드에 대해 파드와 각 컨테이너는 메모리 limit이 있어야 한다. (파드 안 모든 컨테이너에 메모리 limit을 지정하면 쿠버네티스는 컨테이너 limit을 더해 파드 레벨 메모리 limit을 유추할 수 있어요.)
- 메모리 limit은 해당 파드가 스케줄된 노드에 리소스 예약을 적용한다. 네임스페이스의 모든 파드에 예약된 총 메모리 양은 지정된 limit을 초과해서는 안 된다.
- 네임스페이스의 모든 파드가 실제로 사용하는 총 메모리 양도 지정된 limit을 초과해서는 안 된다.
LimitRange를 추가하면:
그 네임스페이스에서 컨테이너를 포함한 어떤 파드가 자신만의 메모리 limit을 지정하지 않으면, 컨트롤 플레인이 그 컨테이너에 기본 메모리 limit을 적용하고, 파드는 메모리 ResourceQuota로 제한되는 네임스페이스에서 실행이 허용될 수 있어요.
정리하기
네임스페이스를 삭제해요:
kubectl delete namespace default-mem-example
더 알아보기 (Learn more)
클러스터 관리자용
- 네임스페이스의 기본 CPU request·limit 구성하기
- 네임스페이스의 최소·최대 메모리 제약 구성하기
- 네임스페이스의 최소·최대 CPU 제약 구성하기
- 네임스페이스의 메모리·CPU 쿼터 구성하기
- 네임스페이스의 파드 쿼터 구성하기
- API 오브젝트 쿼터 구성하기