본문 바로가기

⭐ Kubernetes & EKS/EKS

EKS 리소스 관리 (requests와 limits)

# 도커 컨테이너와 pod의 차이점

- 도커 : 도커 컨테이너는 일단 동작하면 부하에 따라 호스트의 CPU나 메모리를 사용할 수 있는 만큼 사용한다.
- k8s 의 pod : 쿠버네티스 에서는 파드가 사용할 CPU/메모리의 양을 설정하고 호스트에 최소한의 부하를 주도록 설정하는 구조가 있다. (pod별 리소스 사용량을 지정 가능)

1. 예제 소스 코드를 활용한 requests와 limits 설명

- 예제코드 전체

apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend-app
  labels:
    app: backend-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: backend-app
  template:
    metadata:
      labels:
        app: backend-app
    spec:
      containers:
      - name: backend-app
        image: ${ECR_HOST}/k8sbook/backend-app:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        env:
        - name: DB_URL
          valueFrom:
            secretKeyRef:
              key: db-url
              name: db-config
        - name: DB_USERNAME
          valueFrom:
            secretKeyRef:
              key: db-username
              name: db-config
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              key: db-password
              name: db-config
        readinessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 15
          periodSeconds: 30
        livenessProbe:
          httpGet:
            port: 8080
            path: /health
          initialDelaySeconds: 30
          periodSeconds: 30
        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 250m
            memory: 768Mi
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 2"]

- 리소스 사용량 설정 부분
- limits에는 pod가 사용할 수 있는 리소스 상한을 설정, requests는 pod 실행을 위한 최소한의 리소스 설정
- 이 조건들을 충족하지 않는 호스트에는 pod가 배치되지 않는다.

        resources:
          requests:
            cpu: 100m
            memory: 512Mi
          limits:
            cpu: 250m
            memory: 768Mi

- 만약 모든 호스트에 requests로 설정된 리소스양의 여유가 없을경우 Pending 상태가 되어 정상적으로 pod를 동작 시키지 않는다.

2. 파드가 요청 가능한 리소스 사용량을 관리하는 리밋 레인지

- 리밋 레인지란?
- 파드를 배포할때 requests와 limits을 정확이 설정하여 배포한다면 아무런 문제가 발생하지 않는다. 하지만 requests와 limits 설정 하는 부분을 누락하거나 잘 모르는 엔지니어 및 개발자가 배포한다면 리소스 활용을 효율적으로 운영하지 못하게 된다. 
- 이러한 문제점을 사전에 방지하기 위해 쿠버네티스에는 리밋 레인지라는 기능이 존재한다.
- 리밋레인지는 네임스페이스 기반으로, pod의 리소스 사용량의 기본값을 설정해 놓은것이다.
예를들어 k8s라는 네임스페이스의 리소스 기본 사용량을 requests = 2048m, limits = 2048m 으로 설정할 경우 k8s의 네임스페이스의 기본값으로 세팅된다. 반면에 jenkins이라는 네임스페이스는 requests=512m, limits=512m 으로 설정할 경우 jenkins 네임스페이스의 리소스 사용량은 512m로 제한된다.

3. 리소스의 총 요구량을 관리하는 리소스 쿼터

- 리소스 쿼터는 네임스페이스 기반으로 pod의 수를 제한하는 역할을 한다.

- 예제 코드

ResourceQuota:
pod: 5

- 끝 -