쿠버네티스는 리눅스 cgroup(control group)을 사용하여 컨테이너 자원을 제한
cgroup 에 있는것들
다른 group 에 비해 상대적으로 얼마나 cpu 를 사용하는지 보여줌
ex)
다음과 같이 설정했을때
A: 100
B: 200
B 는 A 보다 2배의 cpu.shares 값을 사용할 수 있음. CPU 관점에서 A는 1/3 , B는 2/3 만큼의 CPU 를 사용할 수 있음.
CPU 를 사용한다는 것은 사용가능한 cpu 시간을 쓰는것
단위 시간동안 얼만큼의 시간을 사용하는지 따져야함.
맨먼스와 비슷함 cpu도 이와 유사하게 계산
cfs_quota_us : 사용시간 제약
cfs_quota_period : 주기
*cfs : completely faired sheduler
e.g) 나는 업무시간 8시간 중에 4시간을 과제에 사용 할 수 있다.
cfs_quota_us : 4
cfs_quota_period: 8
CPU 관점에서 나는 0.5 의 cpu 를 사용한다는 의미
그럼 나한테 6 짜리 일을 시키면? 나는 quota(4) 을 다 소모했기 때문에 남은 거에 대해서는 다음 주기까지 일을 할 수 없고 이를 throttle 이라고 함. throttle 은 cpu.stats 을 통해 확인할 수 있음
apiVersion: v1
kind: Pod
metadata:
name: test-app
spec:
containers:
- name: db_mysql
image: mysql
resources:
requests:
memory: "64Mi"
cpu: "1500m"
limits:
memory: "128Mi"
cpu: "3000m"
- name: wp
image: wordpress
resources:
requests:
memory: "64Mi"
cpu: "3500m"
limits:
memory: "128Mi"
cpu: "7000m"
- name: dev_fas
image: fastapi
resources:
requests:
memory: "64Mi"
cpu: "5000m"
limits:
memory: "128Mi"
cpu: "10000m"
cpu requests 값에 1000나눠주고 1024 를 곱해주면 이게 cpu.shares
쿠버네티스는 컨테이너들의 cpu 자원 할당을 위와같이 계산하여
해당 값들의 합이 할당 가능한 cpu 갯수*1024 를 넘을 수 없도록 관리한다
(할당가능한 cpu 코어 갯수가 10개인 경우 다음과 같이 할당될 수 있음.)
CONTAINER_NAME | CPU REQUESTS(밀리코어) | cpu.shares |
---|---|---|
db_mysql | 1500m | 1536 |
wp | 3500m | 3584 |
dev_fastapi | 5000m | 5120 |
컨테이너가 사용 가능한 최대 cpu 사용량 설정
쿠버네티스는 CFS(completely Faired Scheduler) 를 통해 설정된 limits.cpu 를 적용함
cpu requests 와 마찬가지로 밀리코어 단위로 환산함
이 값을 통해 cpu.cfs_quota_us 를 설정
쿠버네티스는 cfs_period_us 100000us(100ms) 로 고정하기 때문에 1cpu 를 사용하고 싶은 경우 cfs_quota_us 는 100000us 가 됨
사용가능한 cpu (m) = cfs_quota_us / cfs_period_us * 1000 인데 cfs_period 가 쿠버네티스에서 100000ms 로 고정되어 있기 때문에 cfs_quota_us 는 다음과 같이 계산할 수 있음.
cfs_quota_us(us) = cpu (m) * 100
cpu 1밀리코어 = 100us 를 사용
쉽게말해서 쿠버네티스는에서는 cpu 사용 주기가 0.1초(100000us) 이기 때문에 5코어를 쓴다면
cpu quota us 는 5초 , 4코어를 쓴다면 4초, 10코어를 쓴다면 10초가 된다. 단위시간을 us 로 맞춰주기 위해서
limits.cpu(ms) * 100 을 하면 us 기준 cpu 사용가능시간이 나온다는 것
그렇다면 만약에 limits.cpu 값을 두지 않으면 어떻게 될까?
limits.cpu 값을 두지 않게 되면 cpu.cfs_quota_us 값이 -1 로 설정되어 자신이 사용할 수 있는 자원만큼 계속해서 cpu 를 사용하게 됨
*추가적으로 kuberentes docs 에 나와있는 쿠버네티스 자원에 대해 주의 할 점