🤔
Kubernetes에서 리소스의requests와limits는 파드가 실행되는 노드에서 사용 가능한 리소스를 관리하고 스케줄링에 사용됩니다. 이 두 값은 다르게 작동합니다.
🫡만약 A,B노드에서 A노드의 경우 10개의 pod가 실행중이고 B의 노드의 경우 1개의 pod만이 동작한다고 가정하겠습니다.
만약 하나의 pod를 생성할 경우 개수만 보았을때에는 B노드는 1개의 pod만을 가지고 있기에 B의 배치하는 것이 좋을 것 같습니다.
그러나 만약 A노드의 10 pod는 cpu와 memory를 거의 사용하지 않는 상황이고 B의 pod는 1개지만 대부분의 리소스를 잡아먹는 상황이었다면 B에 pod를 배치하는 것은 좋지 않습니다.
또한 만약 해커가 A의 pod중 하나의 pod의 cpu사용량을 대폭 늘려버릴 경우 다른 9개의 pod들은 비정상적인 상태가 될 것입니다.🥳이를 위해
쿠버네티스에서는 리소스를 할당할 수 있게 지원하고 있습니다.
😓
requests는 해당 컨테이너에 할당된 리소스의 보장된 최소량을 나타냅니다.
노드에서 파드를 스케줄링 할 때,Kubernetes 스케줄러는 파드의 리소스requests를 기반으로 적절한 노드를 찾습니다. 즉, 노드는 해당requests를 충족시킬 수 있는 충분한 리소스가 있어야 합니다.
requests에 지정된 리소스량은 해당 컨테이너에 대해 항상 예약되고 보장됩니다. 따라서 다른 파드나 프로세스에 의해 이 리소스량이 줄어들지 않습니다.
🧐
limits는 해당 컨테이너가 사용할 수 있는 리소스의 최대량을 나타냅니다.
컨테이너가limits를 초과하여 리소스를 사용하려고 시도하면, 해당 컨테이너는 종료되고 다시 시작될 수 있습니다
apiVersion: v1
kind: Pod
metadata:
name: nginx-resource
spec:
containers:
- name: nginx-container
image: nginx:1.14
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
memory: 500Mi
cpu: 1
limits:
memory:
cpu: 2000m
😑위 파일은 nginx를 실행하는 yaml파일로
resources밑에requests와limits가 있습니다.
request의 위에서 말한대로 최소 보장 리소스를 의미하는데 이를 통해쿠버네티스의 스케쥴러가pod를 배치할때 이 값들을 활용해서 배치하게 됩니다.
cpu의 경우 1은 1core를 의미하며 0.5는 0.5core로 이해하시면 됩니다. 1core는 1000m으로 표시할 수도 있습니다.memory의 경우 Mi라는 단위를 사용하는데 1 Mi는 1,024 KiB를 의미합니다.
🫡위 yaml파일에서
requests를 없애고limits만을 남긴 상태에서 실행해보시고kubectl describe pod nginx-resource를 실행해보면request와limit이 같은 값으로 존재하는 것을 확인 할 수 있습니다.
참고자료