코알못

[CKA] kubernetes 리소스 조정(CPU,MEM) 본문

ETC

[CKA] kubernetes 리소스 조정(CPU,MEM)

코린이s 2023. 8. 29. 20:08
728x90

하나의 노드에 여러 컨테이너 파드가 뜰 수 있으며 리소스 제한을 두지 않는다면 하나의 파드가 리소스를 다써버려 다른 파드에 장애가 나게 된다.

우리는 이를 방지 하기 위해 Resource Requests를 사용하여 리소스 제한을 두도록 한다!

그리고 너무 타이트한 파드 배치가 되지 않도록 어느정도 리소스의 여유가 있는 노드에 할당하고 싶다면 Resource Requests 기능을 이용하면 된다!

리소스 조정 항목 내용
Resource Requests 파드를 실행하기 위한 최소 리소스양을 요청
Resource Limits 파드가 사용할 수 있는 최대 리소스양을 제한

단위는 아래를 참고한다.

MB 1000KB
1Mib 1024Kib
1core 1000mc

이제 nginx 컨테이너 파드를 요청하는데 request를 memory 100Mi cpu 1개로 지정해보자!

# nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx
    name: my-nginx
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      requests:
        memory: 500Mi
        cpu: 1

위 nginx.yaml 파일을 가지고 파드를 생성한다.

[node1 ~]$ kubectl create -f nginx.yaml 
pod/my-nginx created

파드 정보를 보면 정상적으로 생성 되었으며

[node1 ~]$ kubectl get pods    
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          20s

상세 정보를 보면 아래와 같이 request 가 원하는대로 설정 된것을 볼 수 있다.

[node1 ~]$ kubectl describe pod my-nginx
Name:             my-nginx
Namespace:        default
...
IPs:
  IP:  10.5.1.2
Containers:
  my-nginx:
    Container ID:   containerd://123d6eb1bdc325b353988798c7295648bb2e8d60d9015d0b194e3ce23887f851
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:104c7c5c54f2685f0f46f3be607ce60da7085da3eaa5ad22d3d9f01594295e9c
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 29 Aug 2023 11:47:10 +0000
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        1
      memory:     500Mi

다음 실습을 위해 파드를 제거한다.

[node1 ~]$ kubectl delete pod --all
pod "my-nginx" deleted
[node1 ~]$

이제 limit 리소스 제한 설정을 진행하며 아래와 같이 설정 하면 된다.

# nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx
    name: my-nginx
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        memory: 500Mi
        cpu: 1

nginx 파드 정보를 보면 설정한 limit 만큼 request 설정도 같은 값으로 지정 되는것을 볼 수 있다.

[node1 ~]$ kubectl describe pod my-nginx
Name:             my-nginx
Namespace:        default
...
Limits:
      cpu:     1
      memory:  500Mi
    Requests:
      cpu:        1
      memory:     500Mi

다음 실습을 위해 모든 파드를 제거한다.

[node1 ~]$ kubectl delete pod --all
pod "my-nginx" deleted

만약에 리소스를 크게 설정하면 어떻게 될까 ?

yaml 파일을 아래와 같이 수정하고 생성해본다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx
    name: my-nginx
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        memory: 500Mi
        cpu: 100

pod 항목을 보면 pending 상태로 원하는 리소스를 가진 노드가 없어 노드 할당 되지 않아 Running 되지 않는다.

[node1 ~]$ kubectl get pods             
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   0/1     Pending   0          10s

이처럼 리소스 요청, 제한을 너무 크게 잡으면 파드가 생성되지 않을 수 있다는 것을 알 수 있다.
이제 request, limit 두가지를 모두 설정 하는 실습을 진행하며 아래와 같이 하면 된다.

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx
    name: my-nginx
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      limits:
        memory: 200Mi
        cpu: 2
      requests:
        memory: 100Mi
        cpu: 1

아래와 같이 정상적으로 조회 되는것을 볼 수 있다.

[node1 ~]$ kubectl describe pod my-nginx
Name:             my-nginx
Namespace:        default
...
Limits:
      cpu:     2
      memory:  200Mi
    Requests:
      cpu:        1
      memory:     100Mi

끝!

728x90
Comments