본문 바로가기

K8S

쿠버네티스(Kubernetes) NameSpace CPU 자원 할당

728x90

■ 쿠버네티스(Kubernetes) NameSpace CPU 자원

  • 쿠버네티스 CPU 할당에 사용되는 단위는 정수 또는 소수점 형태로 표기 한다. 
  • CPU 자원 할당은 노드의 타입에 따라 다르다. 물리 서버인 경우 1 물리 CPU 코어가 되고, 가상 서버일 경우 1가상 코어에 해당 함.
  • CPU 자원이 1.0일 경우 1,000 밀리 CPU (1,000m), 0.1일 경우 100 밀리 CPU (= 100m)를 의미 한다.
  • 쿠법네티스에서는 1m 보다 더 정밀한 단위로 표기할 수 없고, 표기 방법은 0.0005 보다 5m 처럼 직관적인 방식으로 표현하는 것이 좋음. 

■ 쿠버네티스(Kubernetes) NameSpace CPU 할당

  • 네임스페이스에 리소스 쿼터가 설정되어 있는 경우, CPU 상한에 기본값을 설정하는 것이 좋음.
    • 리소스 쿼터가 설정 된 네임스페이스에서 실행되는 모든 컨테이너는 CPU 상한이 있어야 한다 
    • CPU 상한은 파드가 스케줄링 될 노드에 리소스 예약을 적용함.
    • 네임스페이스의 모든 파드에 대해 예약된 CPU 총량이 지정된 상한을 초과하지 않아야 한다.
  • 컨테이너에 CPU 상한이 명시되어 있지 않다면 컨트롤 플레인이 해당 컨테이너에 기본 CPU 상한을 할당 한다.
  • 네임스페이스 생성  및  기본 CPU 요청/상한 설정
# 네임스페이스 생성
kubectl create namespace default-cpu-example

# 네임스페이스의 리밋레인지 (LimitRange) 정의
# admin/resource/cpu-defaults.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container

# 리밋레인지 적용
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults.yaml --namespace=default-cpu-example

 

■ 쿠버네티스(Kubernetes) NameSpace와 Pod CPU 요청/상한 미설정

  • 컨테이너 생성 시 CPU 요청/상한 미설정
  • 쿠버네티스 컨트롤 플레인인 네임스페이스의 기본 CPU 요청/상한 정보를 참조하여 할당
# Pod 정의
# admin/resource/cpu-defaults-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo
spec:
  containers:
  - name: default-cpu-demo-ctr
    image: nginx

# default-cpu-example 네임스페이스에 Pod 생성
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod.yaml --namespace=default-cpu-example

 # Pod 정보 조회
kubectl get pod default-cpu-demo --output=yaml --namespace=default-cpu-example

containers:
- image: nginx
  imagePullPolicy: Always
  name: default-cpu-demo-ctr
  resources:
    limits:
      cpu: "1"
    requests:
      cpu: 500m

 

■ 쿠버네티스(Kubernetes) NameSpace와 Pod CPU 상한 설정  요청 미설정 

  • 컨테이너 생성 시 CPU 상한 설정 및 요청 미설정 
  • 네임스페이스에 설정한 값이 아닌 컨테이너 생성 시 정의한 CPU 상한값과 동일하게 요청값이 정의 됨.
# Pod 정의
# admin/resource/cpu-defaults-pod-2.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo-2
spec:
  containers:
  - name: default-cpu-demo-2-ctr
    image: nginx
    resources:
      limits:
        cpu: "1"

# Pod 생성
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-2.yaml --namespace=default-cpu-example

# Pod 정보 조회
kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example

resources:
  limits:
    cpu: "1"
  requests:
    cpu: "1"

 

■ 쿠버네티스(Kubernetes) NameSpace와 Pod CPU 상한 미설정   요청 설정

  • 컨테이너 생성 시 CPU 상한 미설정 및 요청 설정
  • 요청값은 컨테이너 생성 시 정의한 값이 참조 되었고, 상한값은 네임스페이스의 기본 메모리 상한값이 정의 되었음.
# Pod 정의
# admin/resource/cpu-defaults-pod-3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo-3
spec:
  containers:
  - name: default-cpu-demo-3-ctr
    image: nginx
    resources:
      requests:
        cpu: "0.75"

# Pod 생성
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-defaults-pod-3.yaml --namespace=default-cpu-example

# Pod 정보 조회
kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 750m

 

 

요청(↓ Request) // 상한( → Limit) 미설정 설정
미설정 ▪ 네임스페이스 리밋레인지 정보를 참조
▪ K8S 컨트롤러 자동 할당
▪ 네임스페이스 기본 요청값 무시 
 요청값 == 상한값 으로 설정 
설정 ▪ 네임스페이스 기본 상한값 적용
 요청값은 명세대로 적용
 설정된 값 적용

■ 쿠버네티스(Kubernetes) NameSpace 최대 / 최소 CPU 할당

  • 컨테이너가 사용하는 CPU의 최소값과 최대값을 설정, 기본값을 지정하지 않아도 자동으로 생성 됨.
  • 최대 및 최소 제약 조건은 파드를 생성하거나 업데이트할 때만 적용되며 리밋레인지를 변경해도, 이전에 생성된 파드에는 영향을 미치지 않음.
  • Pod가 리밋레인지에 의해 부과된 제약 조건을 충족하지 않으면, 네임스페이스에 생성 될 수 없음. 리밋레인지가 설정되면 해당 네임스페이스에 Pod 생성 시 3단계 검사를 수행 함
    1. 해당 파드의 어떤 컨테이너도 자체 메모리 요청량(request)과 상한(limit)을 명시하지 않으면, 컨트롤 플레인이 해당 컨테이너에 메모리 요청량과 상한의 기본값(default)을 지정
    2. 해당 파드의 모든 컨테이너의 CPU 요청량이 리밋레인지의 최소값 이상인지 확인한다.
    3. 해당 파드의 모든 컨테이너의 CPU 요청량이 리밋레인지의 최대값 이하인지 확인한다. 
    4. 최소값 / 최대값 제약사항을 위반하면 Pod는 생성되지 않는다.  
# 네임스페이스 생성
kubectl create namespace constraints-cpu-example

# 리밋레인지 정의
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    type: Container
    
# 리밋레인지 적용
kubectl apply -f https://k8s.io/examples/admin/resource/cpu-constraints.yaml --namespace=constraints-cpu-example

# 리밋레인지 조회
kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example

limits:
- default:
    cpu: 800m
  defaultRequest:
    cpu: 800m
  max:
    cpu: 800m
  min:
    cpu: 200m
  type: Container
  • 리밋레인지 최소 / 최대값 제약 조건을 위반할 경우 Pod는 생성되지 않음
    • 최대값 위반:
      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.​
    • 최소값 위반:
      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.​
    • 최소/최대값 제약사항을 위반하게 되면 오류 메시지와 함께 pod가 생성되지 않는다.

 

 

 

728x90