-
[따배쿠] Pod - Pod에 Resource 할당하기 (CPU/memory requests, limits)kubernetes 2024. 12. 3. 10:15
Pod Resource 요청 및 제한
- Resource Requests
- 파드를 실행하기 위한 최소 리소스 양 요청
- Resource Limits
- 파드가 사용할 수 있는 최대 리소스 양 제한
- Memory limit을 초과해서 사용하는 파드는 종료(kill)되며 다시 스케줄링 된다.
- 해당 기능을 통해 파드가 과도한 리소스를 사용하는 것을 방지
- 컨테이너 별로 Resource 설정도 가능하다.
특징
- 리소스 관리
- 요청과 제한을 설정함으로써, 쿠버네티스는 클러스터의 리소스를 효율적으로 관리할 수 있습니다. 요청이 설정된 리소스는 스케줄링 시 고려되며, 제한은 Pod가 과도한 리소스를 사용하지 않도록 합니다.
- 안정성
- 요청과 제한을 통해 클러스터의 안정성을 높일 수 있습니다. 예를 들어, 특정 Pod가 갑자기 많은 리소스를 소모할 경우, 다른 Pod에 영향을 미치지 않도록 제한을 설정할 수 있습니다.
작동 방식
- Pod 생성을 위한 yaml 파일 작성 시, Resource의 request와 limits를 지정한 뒤 Create 합니다.
- 쿠버네티스 스케줄러는 각 노드의 가용 리소스를 확인하고, Pod의 요청량이 해당 노드의 가용 리소스와 일치하는지 평가합니다.
- 요청량이 노드의 가용 리소스보다 작거나 같으면, Pod는 해당 노드에 배치됩니다. 만약 모든 노드가 요청량을 수용할 수 없다면, Pod는 Pending 상태가 됩니다.
예시
1. Resource requests만 설정하기
# pod-nginx-resources.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-env spec: containers: - name: nginx-container image: nginx:1.14 ports: - containerPort: 80 protocol: TCP env: - name: MYVAR value: "testvalue" resources: requests: memory: 500Mi cpu: 200m
nginx-container의 최소 memory가 500mi, cpu는 200m를 가지게 배포해줘 !
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml pod/nginx-pod-env created
root@master:~/Getting-Start-Kubernetes/5# kubectl describe pod nginx-pod-env Name: nginx-pod-env Namespace: default Priority: 0 Service Account: default Node: node1/10.100.0.101 Start Time: Tue, 03 Dec 2024 01:18:07 +0000 Labels: <none> Annotations: cni.projectcalico.org/containerID: cf8307f690c0a81e877578af4e4566dd5ace9ead68671e8d73fbe3e77c3fd2ef cni.projectcalico.org/podIP: 192.168.166.157/32 cni.projectcalico.org/podIPs: 192.168.166.157/32 Status: Running IP: 192.168.166.157 IPs: IP: 192.168.166.157 Containers: nginx-container: Container ID: containerd://0b417795ebc01ff444332a01c56c14efcf4e43727a3ef3d2aaa4d40a918e8393 Image: nginx:1.14 Image ID: docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d Port: 80/TCP Host Port: 0/TCP State: Running Started: Tue, 03 Dec 2024 01:18:08 +0000 Ready: True Restart Count: 0 Requests: cpu: 1 memory: 500Mi Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-nhkxh (ro) Conditions: Type Status PodReadyToStartContainers True Initialized True Ready True ContainersReady True PodScheduled True Volumes: kube-api-access-nhkxh: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: Burstable Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 43s default-scheduler Successfully assigned default/nginx-pod-env to node1 Normal Pulled 42s kubelet Container image "nginx:1.14" already present on machine Normal Created 42s kubelet Created container nginx-container Normal Started 42s kubelet Started container nginx-container
2. Resource limits만 설정하기
# pod-nginx-resources.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-env spec: containers: - name: nginx-container image: nginx:1.14 ports: - containerPort: 80 protocol: TCP resources: limits: memory: 500Mi cpu: 1
nginx-container의 최대 memory가 500mi, cpu는 1 코어 개수를 가지게 배포해줘 !
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml pod/nginx-pod-env created
root@master:~/Getting-Start-Kubernetes/5# kubectl describe pod nginx-pod-env Name: nginx-pod-env Namespace: default Priority: 0 Service Account: default Node: node1/10.100.0.101 Start Time: Tue, 03 Dec 2024 01:22:40 +0000 Labels: <none> Annotations: cni.projectcalico.org/containerID: acc2c3469785ae28e11327d227ea514ee1a8ec620e65063244e03ac91d013371 cni.projectcalico.org/podIP: 192.168.166.158/32 cni.projectcalico.org/podIPs: 192.168.166.158/32 Status: Running IP: 192.168.166.158 IPs: IP: 192.168.166.158 Containers: nginx-container: Container ID: containerd://38e51906429a0ad5bca2073572dcd254cbd326baf058ba0ce168553dfa01b949 Image: nginx:1.14 Image ID: docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d Port: 80/TCP Host Port: 0/TCP State: Running Started: Tue, 03 Dec 2024 01:22:41 +0000 Ready: True Restart Count: 0 Limits: cpu: 1 memory: 500Mi Requests: cpu: 1 memory: 500Mi
resource limits만 설정했는데도, requests도 limit 값과 동일하게 생성
3. Pending 상태 확인
# pod-nginx-resources.yaml 파일 작성
root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-env spec: containers: - name: nginx-container image: nginx:1.14 ports: - containerPort: 80 protocol: TCP resources: requests: memory: 500Mi cpu: 2
# 생성 및 확인
root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml pod/nginx-pod-env created root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-pod-env 0/1 Pending 0 9s <none> <none> <none> <none>
정상적으로 생성되지 않고 pending 상태인 것을 확인 가능
즉, 모든 node에서 CPU 2코어만큼 여유가 있지 않고, 그에 따라 모든 노드에 생성할 수가 없다.
(현재 실습 환경인 node1, node2는 모두 2Core로 배포되어있다. 그러나 OS / kubelet 등등이 차지하고 있는 CPU도 있기때문에 CPU가 모자라 배포가 안된다.)
4. Resource requests와 limits 정상적으로 셋팅 후, 배포
# pod-nginx-resources.yaml 파일 작성root@master:~/Getting-Start-Kubernetes/5# vi pod-nginx-resources.yaml apiVersion: v1 kind: Pod metadata: name: nginx-pod-env spec: containers: - name: nginx-container image: nginx:1.14 ports: - containerPort: 80 protocol: TCP resources: requests: memory: 500Mi cpu: 200m limits: memory: 1Gi cpu : 1
# 생성 및 확인root@master:~/Getting-Start-Kubernetes/5# kubectl create -f pod-nginx-resources.yaml pod/nginx-pod-env created pod/nginx-pod-env created root@master:~/Getting-Start-Kubernetes/5# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-pod-env 1/1 Running 0 6s 192.168.166.159 node1 <none> <none> root@master:~/Getting-Start-Kubernetes/5# kubectl describe pod nginx-pod-env Name: nginx-pod-env Namespace: default Priority: 0 Service Account: default Node: node1/10.100.0.101 Start Time: Tue, 03 Dec 2024 01:43:42 +0000 Labels: <none> Annotations: cni.projectcalico.org/containerID: bf2328273b3450d73d4c471a0457dd726af1f4b94a971b54e627229e6e2bdddf cni.projectcalico.org/podIP: 192.168.166.159/32 cni.projectcalico.org/podIPs: 192.168.166.159/32 Status: Running IP: 192.168.166.159 IPs: IP: 192.168.166.159 Containers: nginx-container: Container ID: containerd://44056ce3f9c81f362b84f6825e498dccbc54f4cb5f0fa608c1900d241512c685 Image: nginx:1.14 Image ID: docker.io/library/nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d Port: 80/TCP Host Port: 0/TCP State: Running Started: Tue, 03 Dec 2024 01:43:43 +0000 Ready: True Restart Count: 0 Limits: cpu: 1 memory: 1Gi Requests: cpu: 200m memory: 500Mi
정상적으로 배포된 것을 확인 가능
기타
- CPU는 보통 m(밀리 코어)로 표현하거나, 코어 개수로 표현한다.
- cpu : 200m / cpu : 1
- Memory는 보통 Mi(메비 바이트), Ki(키비 바이트), Gi(기비 바이트) 로 표현한다.
- memory : 250Mi / memory : 250Ki / memory : Gi
- 1MB = 1000KB
- 1Mi(B) = 1024KiB
참고 영상
https://www.youtube.com/watch?v=lxCtyWPsb-0
'kubernetes' 카테고리의 다른 글
[따배쿠] Controller - ReplicationController란? (1) 2024.12.04 [따배쿠] Pod - Pod 환경변수 설정과 실행 패턴 (0) 2024.12.03 [따배쿠] Pod - static Pod(feat. kubelet daemon) (0) 2024.12.02 따배쿠 학습 용도 (0) 2024.12.01 [따배쿠] Pod - init container & infra container (0) 2024.12.01 - Resource Requests