본문 바로가기

K8S

쿠버네티스(Kubernetes) Pod Quality of Service (QoS)

728x90

■ 쿠버네티스(Kubernetes) Pod Quality of Service (QoS) 개요

  • QoS (Quality of Service)는 기본적으로 전체 서비스에 대한 품질을 보장하는 것이 아닌, 중요도가 높은 서비스의 품질을 보장 하는 기술을 의미한다. 
  • 쿠버네티스에서도 동일한 의미로 해당 기술을 사용하며, 노드에 충분한 가용 리소스가 없을 경우 QoS를 사용하여 Pod를 노드에서 제거하여 가용 리소스 확보를 목적으로 사용한다.
  • Memory QoS는 Kubernetes에서 메모리 자원을 보장하기 위해 cgroup v2의 메모리 컨트롤러를 사용 함.
  • 쿠버네티스에서 기본적으로 Pod 생성 시 예외없이 QoS Class (Guaranteed, Burstable, BestEffort) 3개중 하나를 부여하여 Pod를 분류하며, 분류의 기준은 컨테이너의 자원 요청(Resource Request)에 근거한다.
    • 컨테이너에 대한 자원 요청 (Resource Request)을 지정하면 kube-scheduler는 해당 정보를 사용하여 Pod가 배치될 노드를 결정하고, 리소스 제한 (Limit)을 지정하면 kubelet은 실행 중인 컨테이너가 설정한 제한보다 많은 리소스를 사용할 수 없도록 제약한다. 
    • 노드에 가용할 수 있는 자원의 여유가 있으면 요청 (request)보다 많이 사용할 수 있으나 제한(limit)보다 많이 사용할 순 없다. 컨테이너의 프로세스가 제한량을 초과하는 리소스를 사용하려 하면 시스템 커널은 OOM (Out of Memory) 오류와 함께 할당을 시도한 프로세스를 종료 한다. 

 

 쿠버네티스(Kubernetes) Pod Quality of Service (QoS) Class 종류

  • Guaranteed 설명
    • 가장 엄격한 자원 제약을 적용받으며, Pod 제거 우선순위가 가장 낮다.
    • Guaranteed 클래스는 자원 제약(limit)을 초과하지 않고, 노드에 선점할 수 있는 우선순위가 낮은 Pod가 없는 경우 제거 되지 않음.
  • Guaranteed 조건
    • 파드 내 모든 컨테이너는 메모리 상한과 메모리 요청량을 가지고 있어야 한다.
    • 파드 내 모든 컨테이너의 메모리 상한이 메모리 요청량과 일치해야 한다.
    • 파드 내 모든 컨테이너는 CPU 상한과 CPU 요청량을 가지고 있어야 한다.
    • 파드 내 모든 컨테이너의 CPU 상한이 CPU 요청량과 일치해야 한다.
  • Burstable 설명
    • 요청에 따라 하한선의 자원은 보장하지만 특정한 제약을 요구 하지 않음. 만약 제약(limit)을 설정하지 않을 경우 쿠버네티스는 노드의 상태에 따라 제약을 정의 합니다. 노드의 가용 자원이 많을 경우 유연하게 리소스를 늘릴 수 있음. 
    • Pod 축출이 발생 할 경우 BestEffort Pod가 모두 제거 된 뒤에 Burstable Pod가 추축 됩니다. 
  • Burstable 조건
    • 파드가 Guaranteed QoS 클래스 기준을 만족하지 않는다.
    • 파드 내에서 최소한 하나의 컨테이너가 메모리 또는 CPU 요청량/상한을 가진다.
  • BestEffort 설명
    • 노드의 자원은 사용할 수 있으나, 다른 Pod QoS Class에서 선점한 자원은 사용하지 못함. 
    • 예) 노드에 가용한 CPU 자원 16개가 있을 경우, Guarantee Class에서 CPU 자원 4개를 요청할 경우 Best Effort QoS Class는 12개의 자원만 사용할 수 있음. 
    • 노드의 자원이 없어 노드 축출이 발생 할 경우 가장 먼저 축출되는 Class 이다. 
  • BestEffort 조건
    • Guaranteed 또는 Burstable Qos 클래스 기준을 만족하지 않는다. 
    • 파드의 컨테이너에 메모리 또는 CPU의 상한이나 요청량이 없음

 

 

 쿠버네티스(Kubernetes) Pod Quality of Service (QoS) 특징

  • 자원 제약을 초과한 컨테이너가 kubelet에 의해 재시작되거나 종료 될 때 Pod내 다른 컨테이너에게 영향을 주지 않는다. 
  • 컨테이너가 요청한 자원 이상을 사용하거나 노드가 자원 압박으로 인해 Pod 추출을 수행이 필요한 경우, 해당 컨테이너가 소속되어 있는 Pod는 축출 대상이 되고 실제 축출이 되면 Pod내에 있는 모든 컨테이너가 종료 됨. 쿠버네티스는 대체 Pod를 생성하고 다른 노드에 배치 함.
  • kube-scheduler는 QoS Class를 고려하지 않고 Pod 선점을 수행. 즉, 자원이 부족한 상황에서는 QoS Class에 상관없이 필요한 자원을 확보하기 위해 Pod를 중단 시킬 수 있음.

 

 쿠버네티스(Kubernetes) Pod Quality of Service (QoS) Class 예제

  • Guaranteed 
# qos-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "700m"
      requests:
        memory: "200Mi"
        cpu: "700m"
        
# Pod 생성
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod.yaml --namespace=qos-example

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

# status 정보 확인 // guaranteed
spec:
  containers:
    ...
    resources:
      limits:
        cpu: 700m
        memory: 200Mi
      requests:
        cpu: 700m
        memory: 200Mi
    ...
status:
  qosClass: Guaranteed

 

  • Burstable 
# qos-pod-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-2
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
        
# Pod 생성
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-2.yaml --namespace=qos-example

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

# status 확인 // burstable
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: qos-demo-2-ctr
    resources:
      limits:
        memory: 200Mi
      requests:
        memory: 100Mi
  ...
status:
  qosClass: Burstable
  • BestEffort 
# qos-pod-3.yaml

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo-3
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-3-ctr
    image: nginx

# pod 생성
kubectl apply -f https://k8s.io/examples/pods/qos/qos-pod-3.yaml --namespace=qos-example

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

# status 확인 // besteffort
spec:
  containers:
    ...
    resources: {}
  ...
status:
  qosClass: BestEffort

 

 


참고: 파드에 대한 서비스 품질(QoS) 구성 | Kubernetes

728x90