1. cgroup
cgroup 이란 cpu, memory 등 리소스를 제한/관리하는 리눅스 커널의 기능이며,
리눅스 커널은 cgroup v1, cgroup v2 두 가지 버전의 cgroup을 제공합니다.
cgroup v2는 2016년부터 리눅스 커널에서 개발되어 왔으며,
K8s v1.25 버전부터 cgroup v2 기능이 GA (general availability) 되었습니다.
cgroup v2에서 향상된 기능은 아래와 같습니다.
- API의 단일 통합 계층 설계
- 컨테이너에 대한 더 안전한 하위 트리 위임
- Pressure Stall Information 와 같은 최신 기능
- 향상된 리소스 할당 관리 및 여러 리소스 간 격리
- 다양한 유형의 메모리 할당(네트워크 및 커널 메모리 등)에 대한 통합 계정
- 페이지 캐시 쓰기 되돌림과 같은 즉각적이지 않은 리소스 변경에 대한 설명
일부 Kubernetes 기능은 향상된 리소스 관리 및 격리를 위해 cgroup v2를 독점적으로 사용합니다. 예를 들어 MemoryQoS 기능은 메모리 활용도를 개선하고 이를 활성화하기 위해 cgroup v2 기능에 의존합니다. kubelet의 새로운 리소스 관리 기능은 앞으로 나아가는 새로운 cgroup v2 기능을 활용할 것입니다.
Ubuntu 21.10 버전부터 cgroup v2가 기본으로 설정되어있지만, 이하 버전에서도 커널 5.8 이상(권장)에서 cgroup v2를 사용하도록 설정할 수 있습니다.
Ubuntu 20.04에서 설정방법
### cgroup v2 사용설정 방법
1. systemd.unified_cgroup_hierarchy=1 옵션 추가
/etc/default/grub 파일의 [grep GRUB_CMDLINE_LINUX=""] 항목에 옵션 추가
-> GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=1"
2. grub 업데이트
$ update-grub
3. 재기동
$ reboot
### 확인방법
1.
root@k8s-worker02:~# stat -c %T -f /sys/fs/cgroup
cgroup2fs
# 결과가 cgroup2fs이면 cgroupv2를 사용하는 것
# 결과가 tmpfs이면 cgroupv1을 사용하는 것
2.
아래 파일이 있으면, cgroupv2를 사용하는 것
root@k8s-worker02:~# ls -l /sys/fs/cgroup/cgroup.controllers
-r--r--r-- 1 root root 0 Mar 7 01:20 /sys/fs/cgroup/cgroup.controllers
참고)
https://sleeplessbeastie.eu/2021/09/10/how-to-enable-control-group-v2/
https://kubernetes.io/docs/concepts/architecture/cgroups/#check-cgroup-version
https://kubernetes.io/blog/2022/08/31/cgroupv2-ga-1-25/
2. MemoryQoS
MemoryQoS는 k8s v1.22에서 추가된 기능으로 현재까지 alpha 단계입니다.
K8s feature-gate 옵션으로 활성화하여 사용 할 수 있습니다.
cgroup v1에서는 cpu_share, cpu_set, cpu_quota, cpu_period와 같이 CPU 리소스만 제한할 수 있으며, MemoryQoS는 사용할 수 없으며, cgroup v2에서는 memoryQoS 기능을 지원합니다.
- 파드 및 컨테이너 메모리 요청 및 제한에 대한 메모리 가용성에 대한 보장을 제공합니다.
- 노드 리소스의 메모리 가용성에 대한 보장 제공
- 파드 및 컨테이너 수준 cgroup에 대한 새로운 cgroup v2 memory knobs(memory.min/memory.high) 사용
- 노드 레벨 cgroup에 대한 새로운 cgroup v2 memory knobs(memory.min) 사용
requests.memory | cgroup이 항상 보유해야 하는 최소 메모리 양을 지정 |
memory.max | cgroup의 메모리 사용이 이 제한에 도달하고 줄일 수 없는 경우 cgroup에서 시스템 OOM 킬러가 호출 특정 상황에서 사용량이 일시적으로 memory.high 한도를 초과할 수 있습니다. |
memory.low | the best-effort memory protection |
memory.high | 메모리 사용량 스로틀 제한 memory.high = limits.memory/node allocatable memory |
memory.high 계산 방법
[k8s v1.22]
requests.memory=50, limits.memory=100 경우 조절 계수 0.8을 곱하여 memory.high=80이 됩니다.
throttling factor = 0.8
memory.high=(limits.memory or node allocatable memory) * memory throttling factor,
where default value of memory throttling factor is set to 0.8
[k8s v1.27]
컨테이너 메모리 제한이 지정되지 않은 경우 조절 계수 0.9를 곱하여 적용됩니다.
throttling factor = 0.9
memory.high=floor[(requests.memory + memory throttling factor * (limits.memory or node allocatable memory - requests.memory))/pageSize] * pageSize, where default value of memory throttling factor is set to 0.9
k8s v1.25에서 MemoryQoS 활성화 방법
# MemoryQoS 활성화
/etc/kubernetes/kubelet-config.yamlS에 아래 옵션 추가 후 kubelet 재기동
...
featureGates:
MemoryQoS: true
...
#확인방법
root@k8s-worker02:~# ctr -n k8s.io c info 8b9e8c3f8815425dafea3530281fb967c23f97acd2a83009708b9ce46a6755c4 | grep memory
"memory": {
"memory.high": "107374182",
"memory.min": "67108864"
*kubespray에서 설정방법
vi ~/roles/kubespray-defaults/defaults/main.yaml
kubelet_feature_gates: []
-> kubelet_feature_gates: [MemoryQoS=true]
*cgroup v2를 사용해야 MemoryQoS를 활성화 할 수 있습니다.
참고)
https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2570-memory-qos/#readme
https://kubernetes.io/blog/2021/11/26/qos-memory-resources/
추가
*MemoryQoS 기능 활성화 후 비정상적인 부하 증가로 인하여, 기능 disable 함.
'Kubernetes' 카테고리의 다른 글
[Nexus3] proxy docker registry 구성 (0) | 2023.04.03 |
---|---|
쿠버네티스 지식 조각모음(작성 중) (0) | 2023.03.26 |
[K8s] 유용한 명령어 (0) | 2023.03.08 |
API 사용법 (0) | 2023.02.21 |
Ceph-CSI 구성 (0) | 2023.02.10 |