본문 바로가기

K8S

쿠버네티스(Kubernetes) NameSpace 메모리 자원 할당

728x90

■ 쿠버네티스(Kubernetes) NameSpace 메모리 할당

  • 네임스페이스에 리소스 쿼터가 설정되어 있는 경우, 메모리 상한에 기본값을 설정하는 것이 좋음.
    • 리소스 쿼터가 설정 된 네임스페이스에서 실행되는 모든 컨테이너는 메모리 상한이 있어야 한다 (메모리 상한을 통해 쿠버네티스가 파드 수준 메모리 상한을 추론할 수 있음)
    • 메모리 상한은 파드가 스케줄링 될 노드에 리소스 예약을 적용함.
    • 네임스페이스의 모든 파드가 실제로 사용하고 있는 메모리 총량은 지정된 상한을 초과하지 않아야 함
  • 네임스페이스 생성  및  기본 메모리 요청/상한 설정
# 네임스페이스 생성
kubectl create namespace default-mem-example

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

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

 

 

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

  • 컨테이너 생성 시 메모리 요청/상한 미설정
  • 쿠버네티스 컨트롤 플레인인 네임스페이스의 기본 메모리 요청/상한 정보를 참조하여 할당
# Pod 정의
# admin/resource/memory-defaults-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx
    
 # default-mem-example네임스페이스에 Pod 생성
 kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example
 
 # Pod 정보 조회
 kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
 
 containers:
- image: nginx
  imagePullPolicy: Always
  name: default-mem-demo-ctr
  resources:
    limits:
      memory: 512Mi
    requests:
      memory: 256Mi

 

 

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

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

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"
        
# Pod 생성
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example

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

resources:
  limits:
    memory: 1Gi
  requests:
    memory: 1Gi

 

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

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

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"
        
# Pod 생성
kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example

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

resources:
  limits:
    memory: 512Mi
  requests:
    memory: 128Mi

 

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

 

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

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

# 리밋레인지 정의
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-min-max-demo-lr
spec:
  limits:
  - max:
      memory: 1Gi
    min:
      memory: 500Mi
    type: Container
    
  
 # 리밋레인지 적용
 kubectl apply -f https://k8s.io/examples/admin/resource/memory-constraints.yaml --namespace=constraints-mem-example

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

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

 

 

728x90