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