ΠΠ° Π³ΠΎΠ΄Ρ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ Kubernetes Π² production Ρ Π½Π°Ρ Π½Π°ΠΊΠΎΠΏΠΈΠ»ΠΎΡΡ Π½Π΅ΠΌΠ°Π»ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΡΡΠΎΡΠΈΠΉ, ΠΊΠ°ΠΊ Π±Π°Π³ΠΈ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ
ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΈ ΠΊ Π½Π΅ΠΏΡΠΈΡΡΠ½ΡΠΌ ΠΈ/ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡΠΌ, Π²Π»ΠΈΡΡΡΠΈΠΌ Π½Π° ΡΠ°Π±ΠΎΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² ΠΈ pod’ΠΎΠ². Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΏΠΎΠ΄Π±ΠΎΡΠΊΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΡΡ
ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ
ΠΈΠ· Π½ΠΈΡ
. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ²Π΅Π·ΡΡ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΠΈΡΡΠ°ΡΠΈΡΠΌΠΈ, ΡΠΈΡΠ°ΡΡ ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ
ΠΊΡΠ°ΡΠΊΠΈΡ
Π΄Π΅ΡΠ΅ΠΊΡΠΈΠ²Π°Ρ
β ΡΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Β«ΠΈΠ· ΠΏΠ΅ΡΠ²ΡΡ
ΡΡΠΊΒ» β Π²ΡΠ΅Π³Π΄Π° Π·Π°Π½ΡΡΠ½ΠΎ, ΡΠ°Π·Π²Π΅ Π½Π΅ ΡΠ°ΠΊ?..
ΠΡΡΠΎΡΠΈΡ 1. Supercronic ΠΈ Π·Π°Π²ΠΈΡΠ°ΡΡΠΈΠΉ Docker
ΠΠ° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ² ΠΌΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΈ Β«Π·Π°Π²ΠΈΡΡΠΈΠΉΒ» Docker, ΡΡΠΎ ΠΌΠ΅ΡΠ°Π»ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. ΠΡΠΈ ΡΡΠΎΠΌ Π² Π»ΠΎΠ³Π°Ρ Docker Π½Π°Π±Π»ΡΠ΄Π°Π»ΠΎΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅
level=error msg="containerd: start init process" error="exit status 2: "runtime/cgo: pthread_create failed: No space left on device
SIGABRT: abort
PC=0x7f31b811a428 m=0
goroutine 0 [idle]:
goroutine 1 [running]:
runtime.systemstack_switch() /usr/local/go/src/runtime/asm_amd64.s:252 fp=0xc420026768 sp=0xc420026760
runtime.main() /usr/local/go/src/runtime/proc.go:127 +0x6c fp=0xc4200267c0 sp=0xc420026768
runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:2086 +0x1 fp=0xc4200267c8 sp=0xc4200267c0
goroutine 17 [syscall, locked to thread]:
runtime.goexit() /usr/local/go/src/runtime/asm_amd64.s:2086 +0x1
β¦
Π ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅: pthread_create failed: No space left on device
. ΠΠ΅Π³Π»ΠΎΠ΅ ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅
Π ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠ΅ΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΡΠ°ΠΊΠ°Ρ ΠΊΠ°ΡΡΠΈΠ½Π°:
Π‘Ρ
ΠΎΠΆΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ ΠΈ Π½Π° Π΄ΡΡΠ³ΠΈΡ
ΡΠ·Π»Π°Ρ
:
ΠΠ° ΡΡΠΈΡ
ΠΆΠ΅ ΡΠ·Π»Π°Ρ
Π²ΠΈΠ΄ΠΈΠΌ:
root@kube-node-1 ~ # ps auxfww | grep curl -c
19782
root@kube-node-1 ~ # ps auxfww | grep curl | head
root 16688 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 17398 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 16852 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 9473 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 4664 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 30571 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 24113 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 16475 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 7176 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
root 1090 0.0 0.0 0 0 ? Z Feb06 0:00 | _ [curl] <defunct>
ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ podβΠ° Ρ
_ docker-containerd-shim 833b60bb9ff4c669bb413b898a5fd142a57a21695e5dc42684235df907825567 /var/run/docker/libcontainerd/833b60bb9ff4c669bb413b898a5fd142a57a21695e5dc42684235df907825567 docker-runc
| _ /usr/local/bin/supercronic -json /crontabs/cron
| _ /usr/bin/newrelic-daemon --agent --pidfile /var/run/newrelic-daemon.pid --logfile /dev/stderr --port /run/newrelic.sock --tls --define utilization.detect_aws=true --define utilization.detect_azure=true --define utilization.detect_gcp=true --define utilization.detect_pcf=true --define utilization.detect_docker=true
| | _ /usr/bin/newrelic-daemon --agent --pidfile /var/run/newrelic-daemon.pid --logfile /dev/stderr --port /run/newrelic.sock --tls --define utilization.detect_aws=true --define utilization.detect_azure=true --define utilization.detect_gcp=true --define utilization.detect_pcf=true --define utilization.detect_docker=true -no-pidfile
| _ [newrelic-daemon] <defunct>
| _ [curl] <defunct>
| _ [curl] <defunct>
| _ [curl] <defunct>
β¦
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ: ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°ΡΠ° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π² supercronic, ΠΏΡΠΎΡΠ΅ΡΡ, ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ ΠΈΠΌ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ, ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡΡ Π²
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΡΠ»ΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΡΠΎΡΠ½Π΅Π΅, ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΡΡ cron-Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ supercronic Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ init-ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Β«ΡΠ΄ΠΎΡΠ΅ΡΠΈΡΡΒ» ΠΏΡΠΎΡΠ΅ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΡΠΎΠ΄ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π΄Π΅ΡΠΈ. ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² SIGHUP ΠΈΠ»ΠΈ SIGTERM ΠΎΠ½ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎΡΠΎΠΆΠ΄ΡΠ½Π½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ, ΠΎΡΡΠ°Π²Π°ΡΡΡ Π² ΡΡΠ°ΡΡΡΠ΅ Π·ΠΎΠΌΠ±ΠΈ. ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎΠ±ΠΎ Π²ΡΡΠΌ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π²
ΠΡΡΡ ΠΏΠ°ΡΠ° ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ:
- ΠΠ°ΠΊ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ workaround β ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ PIDβΠΎΠ² Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Π² Π΅Π΄ΠΈΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ:
/proc/sys/kernel/pid_max (since Linux 2.5.34) This file specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). PIDs greater than this value are not alloβ cated; thus, the value in this file also acts as a system-wide limit on the total number of processes and threads. The default value for this file, 32768, results in the same range of PIDs as on earlier kernels
- ΠΠ»ΠΈ ΠΆΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΏΡΡΠΊ Π·Π°Π΄Π°Ρ Π² supercronic Π½Π΅ Π½Π°ΠΏΡΡΠΌΡΡ, Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅
tini , ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠ°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈ Π½Π΅ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡ zombie.
ΠΡΡΠΎΡΠΈΡ 2. Β«ΠΠΎΠΌΠ±ΠΈΒ» ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ cgroup
Kubelet Π½Π°ΡΠ°Π» ΠΏΠΎΡΡΠ΅Π±Π»ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ CPU:
Π’Π°ΠΊΠΎΠ΅ Π½ΠΈΠΊΠΎΠΌΡ Π½Π΅ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΠΎΠΎΡΡΠΆΠΈΠ»ΠΈΡΡ
- Kubelet ΡΡΠ°ΡΠΈΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΠ΅ΡΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π²ΡΡΠ°ΡΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΎ ΠΏΠ°ΠΌΡΡΠΈ ΠΈΠ· Π²ΡΠ΅Ρ cgroup:
- Π ΡΠ°ΡΡΡΠ»ΠΊΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ΄ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ
ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ . ΠΡΠ»ΠΈ Π²ΠΊΡΠ°ΡΡΠ΅, ΡΠΎ ΡΡΡΡ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΠ°Π·Π½ΡΠ΅ tmpfs-ΡΠ°ΠΉΠ»Ρ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΡ ΠΎΠΆΠΈΠ΅ Π²Π΅ΡΠΈ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ΄Π°Π»ΡΡΡΡΡ ΠΈΠ· ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ cgroup β ΠΎΡΡΠ°ΡΡΡΡ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅memcg zombie. Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΎΠ½ΠΈ Π²ΡΡ ΠΆΠ΅ ΡΠ΄Π°Π»ΡΡΡΡ ΠΈΠ· page cache, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΡΠΌΡΡΠ»Π° ΡΡΠ°ΡΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π½Π° ΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ΄ΡΠΎ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡ. ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ? ΠΡΠΎ ΡΠ΅ΡΠ²Π΅Ρ Ρ cron-Π·Π°Π΄Π°Π½ΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ jobβΡ, Π° Ρ Π½ΠΈΠΌΠΈ β Π½ΠΎΠ²ΡΠ΅ podβΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ² Π² Π½ΠΈΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½ΠΎΠ²ΡΠ΅ cgroup, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΊΠΎΡΠ΅ ΡΠ΄Π°Π»ΡΡΡΡΡ. - ΠΠΎΡΠ΅ΠΌΡ cAdvisor Π² kubelet ΡΡΠ°ΡΠΈΡ ΡΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ? ΠΡΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ
time cat /sys/fs/cgroup/memory/memory.stat
. ΠΡΠ»ΠΈ Π½Π° Π·Π΄ΠΎΡΠΎΠ²ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 0,01 ΡΠ΅ΠΊΡΠ½Π΄Ρ, ΡΠΎ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ cron02 β 1,2 ΡΠ΅ΠΊΡΠ½Π΄Ρ. ΠΡΡ Π΄Π΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ cAdvisor, ΠΎΡΠ΅Π½Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΡΠΈΡΠ°ΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· sysfs, ΠΏΡΡΠ°Π΅ΡΡΡ ΡΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΈ Π² zombie cgroups. - Π§ΡΠΎΠ±Ρ Π½Π°ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π·ΠΎΠΌΠ±ΠΈ, ΠΌΡ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ Π·Π°ΡΠΈΡΡΠΈΡΡ ΠΊΡΡΠΈ, ΠΊΠ°ΠΊ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΈ Π² LKML:
sync; echo 3 > /proc/sys/vm/drop_caches
, β Π½ΠΎ ΡΠ΄ΡΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΈ ΠΏΠΎΠ²Π΅ΡΠΈΠ»ΠΎ ΠΌΠ°ΡΠΈΠ½Ρ.
Π§ΡΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°ΡΡ? ΠΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ (
ΠΡΡΠΎΡΠΈΡ 3. Systemd ΠΈ Π΅Π³ΠΎ mount
Π‘Π½ΠΎΠ²Π° kubelet ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠΎΠ² Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ·Π»Π°Ρ , Π½ΠΎ Π½Π° ΡΠ΅ΠΉ ΡΠ°Π· β ΡΠΆΠ΅ ΠΏΠ°ΠΌΡΡΠΈ:
ΠΠΊΠ°Π·Π°Π»ΠΎΡΡ, ΡΡΠΎ Π΅ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² systemd, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΌ Π² Ubuntu 16.04, ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΠ½Π° ΠΏΡΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ mountβΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ subPath
ΠΈΠ· ConfigMapβΠΎΠ² ΠΈΠ»ΠΈ secretβΠΎΠ². ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ podβΠ° ΡΠ΅ΡΠ²ΠΈΡ systemd ΠΈ Π΅Π³ΠΎ ΡΠ»ΡΠΆΠ΅Π±Π½ΡΠΉ mount ΠΎΡΡΠ°ΡΡΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. Π‘ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈΡ
Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅ΡΡΡ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ. ΠΠ° ΡΡΡ ΡΠ΅ΠΌΡ Π΄Π°ΠΆΠ΅ Π΅ΡΡΡ issues:
β¦ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΌ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° PR Π² systemd:
ΠΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΆΠ΅ Π½Π΅Ρ Π² Ubuntu 18.04, Π½ΠΎ Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈ Π΄Π°Π»ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ubuntu 16.04, Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ Π½Π°Ρ workaround Π½Π° ΡΡΡ ΡΠ΅ΠΌΡ.
ΠΡΠ°ΠΊ, ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ DaemonSet:
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
labels:
app: systemd-slices-cleaner
name: systemd-slices-cleaner
namespace: kube-system
spec:
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: systemd-slices-cleaner
template:
metadata:
labels:
app: systemd-slices-cleaner
spec:
containers:
- command:
- /usr/local/bin/supercronic
- -json
- /app/crontab
Image: private-registry.org/systemd-slices-cleaner/systemd-slices-cleaner:v0.1.0
imagePullPolicy: Always
name: systemd-slices-cleaner
resources: {}
securityContext:
privileged: true
volumeMounts:
- name: systemd
mountPath: /run/systemd/private
- name: docker
mountPath: /run/docker.sock
- name: systemd-etc
mountPath: /etc/systemd
- name: systemd-run
mountPath: /run/systemd/system/
- name: lsb-release
mountPath: /etc/lsb-release-host
imagePullSecrets:
- name: antiopa-registry
priorityClassName: cluster-low
tolerations:
- operator: Exists
volumes:
- name: systemd
hostPath:
path: /run/systemd/private
- name: docker
hostPath:
path: /run/docker.sock
- name: systemd-etc
hostPath:
path: /etc/systemd
- name: systemd-run
hostPath:
path: /run/systemd/system/
- name: lsb-release
hostPath:
path: /etc/lsb-release
β¦ Π° Π² Π½ΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΊΡΠΈΠΏΡ:
#!/bin/bash
# we will work only on xenial
hostrelease="/etc/lsb-release-host"
test -f ${hostrelease} && grep xenial ${hostrelease} > /dev/null || exit 0
# sleeping max 30 minutes to dispense load on kube-nodes
sleep $((RANDOM % 1800))
stoppedCount=0
# counting actual subpath units in systemd
countBefore=$(systemctl list-units | grep subpath | grep "run-" | wc -l)
# let's go check each unit
for unit in $(systemctl list-units | grep subpath | grep "run-" | awk '{print $1}'); do
# finding description file for unit (to find out docker container, who born this unit)
DropFile=$(systemctl status ${unit} | grep Drop | awk -F': ' '{print $2}')
# reading uuid for docker container from description file
DockerContainerId=$(cat ${DropFile}/50-Description.conf | awk '{print $5}' | cut -d/ -f6)
# checking container status (running or not)
checkFlag=$(docker ps | grep -c ${DockerContainerId})
# if container not running, we will stop unit
if [[ ${checkFlag} -eq 0 ]]; then
echo "Stopping unit ${unit}"
# stoping unit in action
systemctl stop $unit
# just counter for logs
((stoppedCount++))
# logging current progress
echo "Stopped ${stoppedCount} systemd units out of ${countBefore}"
fi
done
β¦ ΠΈ ΠΎΠ½ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠ΅ 5 ΠΌΠΈΠ½ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ ΡΠ°Π½ΡΡΠ΅ supercronic. ΠΠ³ΠΎ Dockerfile Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
FROM ubuntu:16.04
COPY rootfs /
WORKDIR /app
RUN apt-get update &&
apt-get upgrade -y &&
apt-get install -y gnupg curl apt-transport-https software-properties-common wget
RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" &&
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - &&
apt-get update &&
apt-get install -y docker-ce=17.03.0*
RUN wget https://github.com/aptible/supercronic/releases/download/v0.1.6/supercronic-linux-amd64 -O
/usr/local/bin/supercronic && chmod +x /usr/local/bin/supercronic
ENTRYPOINT ["/bin/bash", "-c", "/usr/local/bin/supercronic -json /app/crontab"]
ΠΡΡΠΎΡΠΈΡ 4. ΠΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΡΡΡ ΠΏΡΠΈ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ podβΠΎΠ²
ΠΡΠ»ΠΎ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΎ, ΡΡΠΎ: Π΅ΡΠ»ΠΈ Ρ Π½Π°Ρ Π½Π° ΡΠ·Π΅Π» ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ pod ΠΈ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π· Π²ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΠ»Π³ΠΎ, ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ pod, ΠΊΠΎΡΠΎΡΡΠΉ Β«ΠΏΠΎΠΏΠ°Π»Β» Π½Π° ΡΡΠΎΡ ΠΆΠ΅ ΡΠ·Π΅Π», ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π½Π°ΡΠΈΠ½Π°Π΅Ρ pullβΠΈΡΡ ΠΎΠ±ΡΠ°Π· Π½ΠΎΠ²ΠΎΠ³ΠΎ pod’Π°. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΠΆΠ΄Π΅Ρ, ΠΏΠΎΠΊΠ° ΡβpullβΠΈΡΡΡ ΠΎΠ±ΡΠ°Π· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ podβΠ°. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅, pod, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ Π±ΡΠ» Π·Π°ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ ΠΈ ΠΎΠ±ΡΠ°Π· ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠ³ Π±Ρ ΡΠΊΠ°ΡΠ°ΡΡΡΡ Π²ΡΠ΅Π³ΠΎ Π·Π° ΠΌΠΈΠ½ΡΡΡ, ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π² ΡΡΠ°ΡΡΡΠ΅ containerCreating
.
Π eventβΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
Normal Pulling 8m kubelet, ip-10-241-44-128.ap-northeast-1.compute.internal pulling image "registry.example.com/infra/openvpn/openvpn:master"
ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ΄ΠΈΠ½-Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ°Π· ΠΈΠ· ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅Π΅ΡΡΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π΄Π΅ΠΏΠ»ΠΎΠΉ Π½Π° ΡΠ·Π΅Π».
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π²ΡΡ ΠΎΠ΄ΠΎΠ² ΠΈΠ· ΡΠΈΡΡΠ°ΡΠΈΠΈ Π½Π΅ ΡΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ:
- Π‘ΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΉ Docker Registry ΠΏΡΡΠΌΠΎ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ (ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, GitLab Registry, Nexus ΠΈ Ρ.ΠΏ.);
- ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΡΠΈΠ»ΠΈΡΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ
kraken .
ΠΡΡΠΎΡΠΈΡ 5. ΠΠ°Π²ΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ·Π»ΠΎΠ² ΠΏΡΠΈ Π½Π΅Ρ Π²Π°ΡΠΊΠ΅ ΠΏΠ°ΠΌΡΡΠΈ
ΠΠ° Π²ΡΠ΅ΠΌΡ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΌΡ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π»ΠΈ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ·Π΅Π» ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½: Π½Π΅ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ SSH, Π²ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° ΠΎΡΠ²Π°Π»ΠΈΠ²Π°ΡΡΡΡ, Π° Π² Π»ΠΎΠ³Π°Ρ ΠΏΠΎΡΠΎΠΌ Π½ΠΈΡΠ΅Π³ΠΎ (ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠΈ Π½ΠΈΡΠ΅Π³ΠΎ) Π°Π½ΠΎΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π½Π΅Ρ.
Π Π°ΡΡΠΊΠ°ΠΆΡ Π² ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°Ρ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ·Π»Π°, Π³Π΄Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π»Π° MongoDB.
ΠΠΎΡ ΡΠ°ΠΊ atop Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄ΠΎ Π°Π²Π°ΡΠΈΠΈ:
Π Π²ΠΎΡ ΡΠ°ΠΊ β ΠΏΠΎΡΠ»Π΅ Π°Π²Π°ΡΠΈΠΈ:
Π ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π΅ ΡΠΎΠΆΠ΅ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ ΡΠ΅Π·ΠΊΠΈΠΉ ΡΠΊΠ°ΡΠΎΠΊ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ·Π΅Π» ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½:
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΈΠ· ΡΠΊΡΠΈΠ½ΡΠΎΡΠΎΠ² Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ:
- ΠΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅ Π±Π»ΠΈΠ·ΠΊΠ° ΠΊ ΠΊΠΎΠ½ΡΡ;
- ΠΠ°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ ΡΠ΅Π·ΠΊΠΈΠΉ ΡΠΊΠ°ΡΠΎΠΊ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠ΅Π·ΠΊΠΎ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊΠΎ Π²ΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅;
- ΠΠ° Mongo ΠΏΡΠΈΠ»Π΅ΡΠ°Π΅Ρ Π±ΠΎΠ»ΡΡΠ°Ρ Π·Π°Π΄Π°ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π‘Π£ΠΠ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΈΡΠ°ΡΡ Ρ Π΄ΠΈΡΠΊΠ°.
ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, Π΅ΡΠ»ΠΈ Π² Linux Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π°Ρ ΠΏΠ°ΠΌΡΡΡ (Π½Π°ΡΡΡΠΏΠ°Π΅Ρ memory pressure) ΠΈ swapβΠ° Π½Π΅Ρ, ΡΠΎ Π΄ΠΎ ΠΏΡΠΈΡ ΠΎΠ΄Π° OOM killerβΠ° ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΡΡΠΏΠΈΡΡ ΡΠΊΠ²ΠΈΠ»ΠΈΠ±ΡΠΈΡΠΌ ΠΌΠ΅ΠΆΠ΄Ρ Π·Π°ΠΊΠΈΠ΄ΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΡΠ°Π½ΠΈΡ Π² page cache ΠΈ writebackβΠΎΠΌ ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° Π΄ΠΈΡΠΊ. ΠΠ°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΡΠΈΠΌ kswapd, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π°ΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΡΠ°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΏΡΠΈ Π±ΠΎΠ»ΡΡΠΎΠΉ Π½Π°Π³ΡΡΠ·ΠΊΠ΅ Π½Π° Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ Π²ΠΊΡΠΏΠ΅ Ρ ΠΌΠ°Π»ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, kswapd ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΡΡΡΠ»ΠΎΡΠ½ΡΠΌ Π³ΠΎΡΠ»ΡΡΠΊΠΎΠΌ Π²ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π° Π½Π΅Π³ΠΎ Π·Π°Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π²ΡΠ΅ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ (page faults) ΡΡΡΠ°Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΠ»Π³ΠΎ, Π΅ΡΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π΅ Π·Π°Ρ ΠΎΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΌΡΡΡ, Π° Π·Π°ΡΠΈΠΊΡΠΈΡΡΡΡΡΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ ΠΊΡΠ°Ρ OOM-killer-Π±Π΅Π·Π΄Π½Ρ.
ΠΠ°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ΅Π½ Π²ΠΎΠΏΡΠΎΡ: Π° ΠΏΠΎΡΠ΅ΠΌΡ OOM killer ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡ ΡΠ°ΠΊ ΠΏΠΎΠ·Π΄Π½ΠΎ? Π ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ²ΠΎΠ΅ΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ OOM killer ΠΊΡΠ°ΠΉΠ½Π΅ Π³Π»ΡΠΏ: ΠΎΠ½ ΠΏΡΠΈΠ±ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΎΠ²Π°Π»ΠΈΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Ρ.Π΅. Π΅ΡΠ»ΠΈ page fault ΠΏΡΠΎΠΉΠ΄ΡΡ Ρ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ. ΠΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ kswapd ΠΎΡΠ²Π°ΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ±ΡΠ°ΡΡΠ²Π°Ρ page cache (Π²Π΅ΡΡ Π΄ΠΈΡΠΊΠΎΠ²ΡΠΉ I/O Π² ΡΠΈΡΡΠ΅ΠΌΠ΅, ΠΏΠΎ ΡΡΡΠΈ) ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π½Π° Π΄ΠΈΡΠΊ. ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΡΠ°Π³ΠΎΠ², Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π»Ρ ΡΡΡΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ
ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π² ΡΠ΄ΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ
ΠΠ°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΡΠΎΡΠΈΡ 6. PodβΡ Π·Π°Π²ΠΈΡΠ°ΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Pending
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΊΠ»Π°ΡΡΠ΅ΡΠ°Ρ
, Π² ΠΊΠΎΡΠΎΡΡΡ
ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΡΠ΅Ρ ΠΏΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ ΠΌΠ½ΠΎΠ³ΠΎ podβΠΎΠ², ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ Π·Π°ΠΌΠ΅ΡΠ°ΡΡ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ°Ρ ΠΈΡ
ΡΠ°ΡΡΡ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΠ»Π³ΠΎ Β«Π²ΠΈΡΠΈΡΒ» Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ Pending
, Ρ
ΠΎΡΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΠΌΠΈ Docker-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΡΠΆΠ΅ Π·Π°ΠΏΡΡΠ΅Π½Ρ Π½Π° ΡΠ·Π»Π°Ρ
ΠΈ Ρ Π½ΠΈΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ.
ΠΡΠΈ ΡΡΠΎΠΌ Π² describe
Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅Ρ ΠΏΠ»ΠΎΡ
ΠΎΠ³ΠΎ:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 1m default-scheduler Successfully assigned sphinx-0 to ss-dev-kub07
Normal SuccessfulAttachVolume 1m attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-6aaad34f-ad10-11e8-a44c-52540035a73b"
Normal SuccessfulMountVolume 1m kubelet, ss-dev-kub07 MountVolume.SetUp succeeded for volume "sphinx-config"
Normal SuccessfulMountVolume 1m kubelet, ss-dev-kub07 MountVolume.SetUp succeeded for volume "default-token-fzcsf"
Normal SuccessfulMountVolume 49s (x2 over 51s) kubelet, ss-dev-kub07 MountVolume.SetUp succeeded for volume "pvc-6aaad34f-ad10-11e8-a44c-52540035a73b"
Normal Pulled 43s kubelet, ss-dev-kub07 Container image "registry.example.com/infra/sphinx-exporter/sphinx-indexer:v1" already present on machine
Normal Created 43s kubelet, ss-dev-kub07 Created container
Normal Started 43s kubelet, ss-dev-kub07 Started container
Normal Pulled 43s kubelet, ss-dev-kub07 Container image "registry.example.com/infra/sphinx/sphinx:v1" already present on machine
Normal Created 42s kubelet, ss-dev-kub07 Created container
Normal Started 42s kubelet, ss-dev-kub07 Started container
ΠΠΎΠΊΠΎΠΏΠ°Π²ΡΠΈΡΡ, ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎ kubelet ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΡΡΠΏΠ΅Π²Π°Π΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ API-ΡΠ΅ΡΠ²Π΅ΡΡ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ podβΠΎΠ², liveness/readiness-ΠΏΡΠΎΠ±Π°Ρ .
Π ΠΈΠ·ΡΡΠΈΠ² help, Π½Π°ΡΠ»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
--kube-api-qps - QPS to use while talking with kubernetes apiserver (default 5)
--kube-api-burst - Burst to use while talking with kubernetes apiserver (default 10)
--event-qps - If > 0, limit event creations per second to this value. If 0, unlimited. (default 5)
--event-burst - Maximum size of a bursty event records, temporarily allows event records to burst to this number, while still not exceeding event-qps. Only used if --event-qps > 0 (default 10)
--registry-qps - If > 0, limit registry pull QPS to this value.
--registry-burst - Maximum size of bursty pulls, temporarily allows pulls to burst to this number, while still not exceeding registry-qps. Only used if --registry-qps > 0 (default 10)
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ, Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ β Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠ΅, ΠΈ Π² 90 % ΠΎΠ½ΠΈ ΠΏΠΎΠΊΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠΈβ¦ ΠΠ΄Π½Π°ΠΊΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠΊΠ°Π·Π°Π»ΠΎΡΡ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π²ΡΡΡΠ°Π²ΠΈΠ»ΠΈ ΡΠ°ΠΊΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
--event-qps=30 --event-burst=40 --kube-api-burst=40 --kube-api-qps=30 --registry-qps=30 --registry-burst=40
β¦ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠ»ΠΈ kubeletβΡ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ API-ΡΠ΅ΡΠ²Π΅ΡΡ ΡΠ²ΠΈΠ΄Π΅Π»ΠΈ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ:
β¦ ΠΈ Π΄Π°, Π²ΡΡ Π½Π°ΡΠ°Π»ΠΎ Π»Π΅ΡΠ°ΡΡ!
P.S.
ΠΠ° ΠΏΠΎΠΌΠΎΡΡ Π² ΡΠ±ΠΎΡΠ΅ Π±Π°Π³ΠΎΠ² ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ΅ ΡΡΠ°ΡΡΠΈ Π²ΡΡΠ°ΠΆΠ°Ρ Π±ΠΎΠ»ΡΡΡΡ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΌ ΠΈΠ½ΠΆΠ΅Π½Π΅ΡΠ°ΠΌ Π½Π°ΡΠ΅ΠΉ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Π° Π² ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ β ΠΊΠΎΠ»Π»Π΅Π³Π΅ ΠΈΠ· Π½Π°ΡΠ΅ΠΉ R&D-ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΠ½Π΄ΡΠ΅Ρ ΠΠ»ΠΈΠΌΠ΅Π½ΡΡΠ΅Π²Ρ (
P.P.S.
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«
ΠΠ»Π°Π³ΠΈΠ½ kubectl-debug Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π² pod’Π°Ρ Kubernetes Β». - Π¦ΠΈΠΊΠ» Kubernetes tips & tricks:
- Β«
ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ² ΠΏΠΎΠ΄ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Helm 2 Β»; - Β«
Π Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠ·Π»ΠΎΠ² ΠΈ ΠΎ Π½Π°Π³ΡΡΠ·ΠΊΠ°Ρ Π½Π° Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Β»; - Β«
ΠΠΎΡΡΡΠΏ ΠΊ dev-ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ°ΠΌ Β»; - Β«
Π£ΡΠΊΠΎΡΡΠ΅ΠΌ bootstrap Π±ΠΎΠ»ΡΡΠΈΡ Π±Π°Π· Π΄Π°Π½Π½ΡΡ Β».
- Β«
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com