본문 바로가기

AWS EKS 실습/EKS Intermediate

Resource management 기본

ㅁ Resource Management 기능 정의

 

Kubernetes Request

 Pod에 사용 가능한 정의된 리소스가 충분히 있는지 확인하는데 사용된다. Pod가 지정된 것보다 더 많이 사용할 수 있다. 이것은 Soft Limit으로 간주된다.

 

Kubernetes Limit

 Pod가 지정된 범위 이상으로 사용하지 않도록 하는데 사용된다. 이것은 Hard Limit으로 간주된다.

 

Kubernetes Quotas

 Namespace당 리소스 사용량을 제한하는데 사용된다.

 

Kubernetes Pod Priority and Preemption

 Pod별 우선 순위를 적용하는데 사용된다. Pod를 Node에 배치할 수 없는 경우 우선 순위가 낮은 Pod를 선점하거나 제거할 수 있다.

 

ㅁ POD CPU 및 MEMORY 기본 관리

 

먼저 4개의 Pod를 생성한다.

 

- request deployment : Request cpu = 0.5, memory = 1G

- limit-cpu deployment: Limit cpu = 0.5, memory =1G

- limit-memory deployment: Limit cpu = 1, memory = 1G

- restricted deployment: Request cpu =1, memory = 1G | Limit cpu = 1.8, memory = 2G

 

먼저 metric server를 deploy 한다.

 

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.4.1/components.yaml

 

설치 이후 정상 상태 확인을 위하여 다음과 같이 검증한다.

 

kubectl get apiservice v1beta1.metrics.k8s.io -o json | jq '.status'
{                                                                                                                                                  
  "conditions": [                                                                                                                                  
    {                                                                                                                                              
      "lastTransitionTime": "2021-03-18T08:50:27Z",                                                                                                
      "message": "endpoints for service/metrics-server in \"kube-system\" have no addresses with port name \"https\"",                             
      "reason": "MissingEndpoints",                                                                                                                
      "status": "False",                                                                                                                           
      "type": "Available"                                                                                                                          
    }                                                                                                                                              
  ]                                                                                                                                                
}  

 

설치된 metrics-server의 deployment 수를 확인한다.

kubectl get deployment metrics-server -n kube-system
NAME             READY   UP-TO-DATE   AVAILABLE   AGE                                                                                              
metrics-server   1/1     1            1           3m13s        

 

ㅁ Deploy Pods

 

CPU와 Memory Load를 Generate 하기 위하여 다음 Tag를 사용하여 stress-ng를 실행한다.

 

- vm-keep: 일관된 메모리 사용 유지

- vm-bytes: 각 worker에 bytes 제공

- vm: spawn할 worker 수, 예. vm = 1은 1000m CPU 사용, vm = 2는 2000m CPU 사용

- oomable: OOM killer로 kill 이후 다시 respawn 되지 않음

- verbose: 모든 정보 출력 표시

- timeout: 테스트 기간

 

# Deploy Limits pod with hard limit on cpu at 500m but wants 1000m
kubectl run --limits=memory=1G,cpu=0.5 --image  hande007/stress-ng basic-limit-cpu-pod --restart=Never --  --vm-keep --vm-bytes 512m --timeout 600s --vm 1 --oomable --verbose 

# Deploy Request pod with soft limit on memory 
kubectl run --requests=memory=1G,cpu=0.5 --image  hande007/stress-ng basic-request-pod --restart=Never --  --vm-keep   --vm-bytes 2g --timeout 600s --vm 1 --oomable --verbose 

# Deploy restricted pod with limits and requests wants cpu 2 and memory at 1G
kubectl run --requests=cpu=1,memory=1G --limits=cpu=1.8,memory=2G --image  hande007/stress-ng basic-restricted-pod  --restart=Never --  --vm-keep  --vm-bytes 1g --timeout 600s --vm 2 --oomable --verbose 

# Deploy Limits pod with hard limit on memory at 1G but wants 2G
kubectl run --limits=memory=1G,cpu=1 --image  hande007/stress-ng basic-limit-memory-pod --restart=Never --  --vm-keep  --vm-bytes 2g --timeout 600s --vm 1 --oomable --verbose 

 

basic-limit-memory-pod는 Limit 1G가 할당되어 생성시 정의한 -vm-bytes의 용량 2G의 설정으로 생성이 안될 것으로 보임

 

eksuser:~/environment $ kubectl get pod                                                                                                            
NAME                     READY   STATUS      RESTARTS   AGE                                                                                        
basic-limit-cpu-pod      1/1     Running     0          8m58s                                                                                      
basic-limit-memory-pod   0/1     OOMKilled   0          5m29s                                                                                      
basic-request-pod        1/1     Running     0          6s                                                                                         
basic-restricted-pod     1/1     Running     0          5m37s  

 

kubernetes Request와 limit은 Deployment 생성시 yaml을 통해 정의 가능하다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: stress-deployment
  name: stress-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: stress-deployment
  template:
    metadata:
      labels:
        app: stress-deployment
    spec:
      containers:
      - args:
        - --vm-keep
        - --vm-bytes
        - 1500m
        - --timeout
        - 600s
        - --vm
        - "3"
        - --oomable
        - --verbose
        image: hande007/stress-ng
        name: stress-deployment
        resources:
          limits:
            cpu: 2200m
            memory: 2G
          requests:
            cpu: "1"
            memory: 1G

 

Cleanup

kubectl delete pod basic-request-pod
kubectl delete pod basic-limit-memory-pod
kubectl delete pod basic-limit-cpu-pod
kubectl delete pod basic-restricted-pod