Kubernetes

Kubernetes 기초 - Pod(6)

사실 나도 모름 2023. 12. 8. 01:59
  1. Pod 개념(복습) 및 사용
  2. livenessProbe를 사용한 self-healing Pod
  3. init container
  4. infra container(pause) 이해
  5. static pod 만들기
  6. Pod에 resource 할당        ←   오늘 볼 내용
  7. 환경변수를 이용해 컨테이너에 데이터 전달
  8. pod 구성 패턴의 종류

6. Pod에 resource(자원) 할당

우리는 지금까지 파드에 리소스(자원) 제한을 하지 않았기 때문에 시스템의 리소스를 파드가 모두 사용해버릴 수도 있다.

쿠버네티스 시스템에서 파드는 여러개 동작할 수도 있으며 하나의 파드가 리소스를 점령해버리면 다른 파드는 실행되지 못한다.

 

다음 시나리오를 보자.

A기업이 리소스 제한이 없는 웹 서버 파드를 배포했다.
그런데 어느날 웹 서버에 DDoS공격이 들어오면서 해당 노드의 리소스를 모두 사용하게 되었다.
해당 노드에는 웹 서버 외에도 장바구니, 결제 시스템 등 여러 파드가 있었다.
하지만 웹 서버가 혼자 노드의 리소스를 모두 사용하게 되어 다른 애플리케이션이 있는 파드들은 동작하지 못하게 된다.
사용자들은 시스템이 동작하지 않는다고 불만을 토로하며 A기업의 신뢰도는 낮아졌다.

 

 

이런 경우도 있다.

어느 회사에서 MongoDB 파드를 하나 배포하려고한다.
node1에는 파드가 3개, node2에는 파드가 2개 존재한다.
node2의 파드 중 하나는 리소스 사용량이 많아 해당 노드의 리소스는 충분하지 않다.
관리자는 MongoDB 파드를 리소스 제한 없이 배포했으며 scheduler는 이 파드를 리소스 사용량이 적은 node1이 아니라 파드 수가 적은 node2에 배포를 했다.
그로 인해 MongoDB가 사용할 수 있는 리소스가 부족하여 동작이 느려졌다.

 

 

어디까지나 시나리오지만 충분히 발생할 수 있는 상황이므로 파드의 리소스 할당은 굉장히 중요한 부분에 속한다.

반대로 불필요하게 파드에 리소스를 쥐어주면 전체 클러스터의 리소스 활용이 비효율적이게 될 수도 있으니 주의해야한다.

 

파드와 컨테이너에게 리소스에 대해 따로 지정해주는 방법은 두가지가 있다.

 

 

Pod Resource 요청 및 제한
  • Resource Limits
    • 컨테이너가 사용할 수 있는 리소스를 제한하여 지정한 리소스를 초과하여 사용하지 못하게 한다.
    • Memory 제한을 초과해서 사용하는 경우 OOM(Out of Memory) Killer로 인해 해당 프로세스(컨테이너)를 종료시키며 이로 인해 파드가 종료되고 다시 스케줄링 할 수도 있다.
    • CPU 제한을 초과하면 해당 프로세스는 일정 시간 동안 일부 프로세싱 시간을 받지 못하게 되는데 이는 일종의 슬로우 다운을 의미하며, 성능이 저하될 뿐 컨테이너가 바로 종료되지는 않는다.
  • Resource Requests
    • 컨테이너가 필요한 최소 리소스양을 지정하여 scheduler에게 지정한 리소스 이상 남아있는 노드에 파드를 배포하도록 요청할 수 있다.

실습을 통해서 Requests와 Limits의 차이를 확인해보자.

 참고 : 
※ 메모리 1MB와 1MiB는 다르다.
1MB는 일반적으로 10의 6승 인 1,000,000 바이트를 나타냄
1MiB는 2의 20승 인 1,048,576 바이트를 나타냄

1MB는 사람이 알기 쉽게 사용하고 1MiB는 컴퓨터 메모리 및 디스크 용량을 나타낼 때 사용한다.
여기서는 MiB단위를 사용하며 yaml코드에는 Mi까지만 기재한다.

※ CPU의 코어 분배
1코어는 1000mc이며 여기서는 m까지만 기재하여 CPU 리소스를 할당한다.

 

 

requests

 

pod-nginx-resources.yaml

# pod-nginx-resources.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-resources
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      requests:
        memory: 500Mi
        cpu: 300m

 

위 yaml코드는 nginx 컨테이너를 최소 메모리 500MiB, CPU 300m의 공간이 있는 노드에 배포하도록 스케줄러에게 요청한다.

 

 

상세 정보를 확인

# 파드의 상세 정보 확인
kubectl describe pod nginx-container-resources

Requests가 적용된 컨테이너

 

 

 

limits

 

pod-nginx-resources.yaml

# pod-nginx-resources.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-resources
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        memory: 500Mi
        cpu: 300m

 

위 yaml코드는 nginx 컨테이너가 사용할 수 있는 리소스를 메모리 500MiB, CPU 300m로 제한하여 파드를 배포한다.

 

 

상세 정보를 확인

# 파드의 상세 정보 확인
kubectl describe pod nginx-container-resources

limits가 적용된 컨테이너

 

Limits를 입력했을 때와 Requests를 입력했을 때 결과가 다르다.

Requests는 상세 정보를 보면 Requests에 대한 정보만 나오는데 Limits는 입력하지도 않은 Requests와 함께 적용되었다.

즉, 컨테이너가 실행되는데 사용할 리소스를 제한했다면 안정적으로 운영하기 위해서는 그만큼의 리소스를 수용할 수 있는 공간이 노드에 있어야 한다고 쿠버네티스가 판단하여 자동으로 입력한 것이다.

이렇게 사용해도 되고 원한다면 Requests내용도 원하는 대로 조절가능하다.

 

 

pod-nginx-resources.yaml

# pod-nginx-resources.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-resources
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        memory: 1Gi
        cpu: 1
      requests:
        memory: 500Mi
        cpu: 500m

 

다음과 같이 지정해도 상관이 없지만 효율적이고 안정적인 자원 관리를 위해 애플리케이션이 요구하는 수준을 잘 고려하여 적절하게 자원을 분배해야 한다.

 

 

참고

 

현재 나의 worker node 가상머신 스펙은 CPU 2코어, 메모리 2G 로 할당되어 있다.

만약 yaml코드에 다음과 같이 리소스 요청을 한다면 어떻게 될까?

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-resources
spec:
  containers:
  - name: nginx-container
    image: nginx:1.25
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      requests:
        memory: 1Gi
        cpu: 3

파드가 스케줄되지 않는다.

 

당연한 소리겠지만 파드가 스케줄링 되지 않는다.

상태는 Pending으로 아직 적절한 노드를 찾지 못한 상태에서 스케줄러가 계속 대기하고 있는 것이다.

만약 저기서 CPU 4코어를 가진 노드가 나온다면 해당 노드로 파드는 바로 스케줄 된다.

메모리도 마찬가지다.

 

항상 적절한 수준의 리소스 할당을 해야하며 너무 많이 줘도 낭비고 너무 타이트하게 할당해도 문제가 발생하니 이는 본인의 판단대로 하면 된다.

 

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Namespace  (0) 2023.12.11
Kubernetes 기초 - Pod(7)  (0) 2023.12.09
Kubernetes 기초 - Pod(5)  (0) 2023.12.07
Kubernetes 기초 - Pod(4)  (0) 2023.12.07
Kubernetes 기초 - Pod(3)  (0) 2023.12.07