๐Ÿš€ Kubernetes์—์„œ Too many open files ์˜ค๋ฅ˜ ํ•ด๊ฒฐ โ€“ ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜ ์กฐ์ •ํ•˜๊ธฐ

1โ€“2๋ถ„

1๏ธโƒฃ ๋ฌธ์ œ ์ƒํ™ฉ

Kubernetes v1.27 + containerd ํ™˜๊ฒฝ์—์„œ PostgreSQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ CrashLoopBackOff ์ƒํƒœ์— ๋น ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ์„œ๋น„์Šค๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ERROR: could not open file "pg_wal/00000001000000000000000A": Too many open files
LOG: could not create file "base/pgsql_tmp/pgsql_tmp1234": Too many open files
FATAL: too many open files in system


๐Ÿ” ์›์ธ ๋ถ„์„

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ “Too many open files”๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ํ˜ธ์ŠคํŠธ OS์—์„œ ํŒŒ์ผ ํ•ธ๋“ค(file descriptors) ๊ฐœ์ˆ˜ ์ œํ•œ์„ ์ดˆ๊ณผํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜ ์ œํ•œ์€ ๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ fs.file-max ๊ฐ’๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ,

containerd ์„œ๋น„์Šค์—์„œ๋„ nofile ์„ค์ •์ด ๋‚ฎ๊ฒŒ ์žกํ˜€ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2๏ธโƒฃ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

โœ… 1. OS์˜ ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜ ์ œํ•œ(fs.file-max) ์ฆ๊ฐ€

์šฐ์„ , ํ˜„์žฌ ์‹œ์Šคํ…œ์—์„œ ์„ค์ •๋œ ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜ ์ œํ•œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ cat /proc/sys/fs/file-max

์ œํ•œ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด /etc/sysctl.conf ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

$ vi /etc/sysctl.conf

์•„๋ž˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

fs.file-max = 500000

๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ sysctl 

์ด์ œ OS์—์„œ ํ—ˆ์šฉํ•˜๋Š” ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.


โœ… 2. containerd์˜ nofile ์ œํ•œ ๊ฐ’ ์ฆ๊ฐ€

containerd ์„œ๋น„์Šค์—์„œ๋„ ์—ด๋ฆฐ ํŒŒ์ผ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.


$ vi /usr/lib/systemd/system/containerd.service

๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

```
LimitCORE=infinity
LimitNOFILE=500000
```

์ดํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•˜๊ณ  containerd ์„œ๋น„์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

$ systemctl daemon-reload
$ systemctl restart containerd


3๏ธโƒฃ ์ ์šฉ ํ™•์ธ

์„ค์ •์ด ์ •์ƒ์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

$ cat /proc/sys/fs/file-max

PostgreSQL ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ kubectl get pods -n <namespace>

๋งŒ์•ฝ Running ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋ฉด, CrashLoopBackOff ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


4๏ธโƒฃ ๊ฒฐ๋ก 

“Too many open files” ์˜ค๋ฅ˜๋Š” ํŒŒ์ผ ํ•ธ๋“ค ๊ฐœ์ˆ˜ ์ œํ•œ์ด ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์„ค์ •๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด OS์˜ fs.file-max ๊ฐ’์„ ์กฐ์ •ํ•˜๊ณ , containerd์˜ nofile ์„ค์ •์„ ์ฆ๊ฐ€ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถฉ๋ถ„ํ•œ ํŒŒ์ผ์„ ์—ด ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น ์ด๋ฒˆ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์–ป์€ ๊ตํ›ˆ

  • Kubernetes์—์„œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ, ๋ฆฌ์†Œ์Šค ์ œํ•œ ์„ค์ •์„ ๋ฏธ๋ฆฌ ์ ๊ฒ€ํ•˜์ž.
  • fs.file-max, nofile ๊ฐ’์ด ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด PostgreSQL ๊ฐ™์€ DB ์ปจํ…Œ์ด๋„ˆ์—์„œ Too many open files ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ๋Š” OS๋ฟ๋งŒ ์•„๋‹ˆ๋ผ containerd์˜ ์„ค์ •๋„ ํ•จ๊ป˜ ์กฐ์ •ํ•ด์•ผ ํ•œ๋‹ค.

์•ž์œผ๋กœ๋„ Kubernetes ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์œผ์…จ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ ์ฃผ์„ธ์š”! ๐Ÿ˜Š