CRI-O 튜닝포인트(kubernetes)
컨테이너 런타임으로 crio를 사용하는 경우,
서비스를 올바르게 동작하려고 한다면, "최대프로세스의 수" 와 "최대 오픈 파일 수"를 조정해야 합니다.
(To ensure that services can run correctly, you must adjust the maximum number of processes and the maximum number of open files in the CRI-O container settings.)
[최대프로세스 수]
컨테이너에 허용되는 최대 프로세스 수는 pids_limit 매개변수를 설정해야 합니다.
(https://github.com/cri-o/cri-o/blob/main/docs/crio.conf.5.md)
CRIO 1.23버전까지 pids_limit의 옵션이 사용되었으며, 기본값은 1024 입니다.
CRIO 1.24버전부터 deprecated 되었으며, Kubelet의 --pod-pids-limit 플래그로 대체 되었습니다.
pids_limit=-1
Maximum number of processes allowed in a container. This option is deprecated. The Kubelet flag --pod-pids-limit should be used instead.
CRIO 1.23 버전 이하
방법1) crio.conf 파일 수정
/etc/crio/crio.conf |
[crio.runtime] pids_limit = 4096 |
CRIO 1.24 버전 이상
Kubelet의 pod-pids-limit 플래그 설정
Kubernetes pid limit policy
https://kubernetes.io/docs/concepts/policy/pid-limiting/
Start a kubelet process configured via config file
https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/
Pod PID Limits 설정하려면,
방법1) kubelet 실행시, command line paranameter "--pod-max-pids" 옵션을 설정
방법2) kubelet 구성파일에 "PodPidsLimit"값을 설정.
방법2로 진행
Kubelet의 config 파일 경로로 설정된 플래그를 사용하여 kubelet을 시작하면, 구성을 불러온다.
파일 위치 : --config=/var/lib/kubelet/config.yaml
혹은, config file을 위한 Drop-in Directory를 사용한다.
Ex) --config-dir=/etc/kubernetes/kubelet.config.d
"PodPidLimit" 값을 -1에서 2048로 변경
[최대 오픈 파일 수]
컨테이너별 ulimit을 설정하지 않은 경우, CRI-O Daemon으로 부터 상속을 받는다.
(https://github.com/cri-o/cri-o/blob/main/docs/crio.conf.5.md)
default_ulimits=[]
A list of ulimits to be set in containers by default, specified as "=:", for example:"nofile=1024:2048".
If nothing is set here, settings will be inherited from the CRI-O daemon.
현재 CRI-O Daemon의 nofile Limit을 체크하는 방법
#systemctl show crio | grep LimitNOFILE
CRI-O Daemon의 LimitNOFILE을 변경하는 방법
방법1) crio.conf 파일 수정
/etc/crio/crio.conf |
[crio.runtime] default_ulimits = [ "nofile=1048576:1048576" ] |
방법2) /etc/systemd/system/cri-o.service 파일 수정
LimitNOFILE=1048576
해당 값은 66560 이상 을 권고(recommended) 합니다.
미튜닝시 아래와 같은 현상이 발생할 수 있습니다.
Ingress-nginx-controller에서 아래와 같은 오류메시지 발생.
Sendmsg() failed (9: Bad file descriptor)
Pthread_create() failed (11: Resource temporarily unavailable)
Worker process 1055 exited with fatal code 2 and cannot be respawned
…
https://github.com/cri-o/cri-o/issues/5779
참고 : https://github.com/cri-o/cri-o/blob/main/docs/crio.conf.5.md