6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

Π‘ΠΎ Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° Π³ΠΎΠ΄ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Kubernetes Π²ΠΎ производството, ΠΈΠΌΠ°ΠΌΠ΅ Π°ΠΊΡƒΠΌΡƒΠ»ΠΈΡ€Π°Π½ΠΎ ΠΌΠ½ΠΎΠ³Ρƒ интСрСсни ΠΏΡ€ΠΈΠΊΠ°Π·Π½ΠΈ Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ Π²ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ Π½Π° систСмот Π΄ΠΎΠ²Π΅Π΄ΠΎΠ° Π΄ΠΎ Π½Π΅ΠΏΡ€ΠΈΡ˜Π°Ρ‚Π½ΠΈ ΠΈ/ΠΈΠ»ΠΈ Π½Π΅Ρ€Π°Π·Π±ΠΈΡ€Π»ΠΈΠ²ΠΈ послСдици ΠΊΠΎΠΈ Π²Π»ΠΈΡ˜Π°Π°Ρ‚ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ ΠΈ ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠΈΡ‚Π΅. Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ ΠΈΠ·Π±ΠΎΡ€ Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ Π½Π°Ρ˜Ρ‡Π΅ΡΡ‚ΠΈΡ‚Π΅ ΠΈΠ»ΠΈ Π½Π°Ρ˜ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΈΡ‚Π΅. Π”ΡƒΡ€ΠΈ ΠΈ Π°ΠΊΠΎ никогаш Π½Π΅ стС Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΡΡ€Π΅ΡœΠ½ΠΈ Π΄Π° Π½Π°ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° Ρ‚Π°ΠΊΠ²ΠΈ ситуации, Ρ‡ΠΈΡ‚Π°ΡšΠ΅Ρ‚ΠΎ Π·Π° Ρ‚Π°ΠΊΠ²ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΈ дСтСктивски ΠΏΡ€ΠΈΠΊΠ°Π·Π½ΠΈ - особСно β€žΠΎΠ΄ ΠΏΡ€Π²Π° Ρ€Π°ΠΊΠ°β€œ - Π΅ сСкогаш интСрСсно, Π½Π΅Π»ΠΈ?

ΠŸΡ€ΠΈΠΊΠ°Π·Π½Π° 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. Π‘Ρ€Π·ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° Објасни Π΄Π΅ΠΊΠ° Π”ΠΎΠΊΠ΅Ρ€ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡ‚ΠΏΠΎΡ‡Π½Π΅ процСс, ΠΏΠΎΡ€Π°Π΄ΠΈ ΡˆΡ‚ΠΎ Ρ‚ΠΎΡ˜ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ Π·Π°ΠΌΡ€Π·Π½ΡƒΠ²Π°.

Π’ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΡ‚, слСднава слика ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π° Π½Π° ΠΎΠ½Π° ΡˆΡ‚ΠΎ сС случува:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

Π‘Π»ΠΈΡ‡Π½Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π½Π° ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ јазли:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

На иститС јазли Π³Π»Π΅Π΄Π°ΠΌΠ΅:

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>

Π‘Π΅ испостави Π΄Π΅ΠΊΠ° Π²Π°ΠΊΠ²ΠΎΡ‚ΠΎ ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Π΅ послСдица Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° со ΠΏΠΎΠ΄Π»ΠΎΠ³Π°Ρ‚Π° супСркроник (Π“ΠΎ Π°Π»Π°Ρ‚ΠΊΠ° која ја користимС Π·Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ cron Π·Π°Π΄Π°Ρ‡ΠΈ Π²ΠΎ pods):

 _ 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>
…

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ Π΅ Π²ΠΎ ΠΎΠ²Π°: ΠΊΠΎΠ³Π° Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π° Π²ΠΎ супСркроник, процСсот Π΅ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π½ ΠΎΠ΄ Π½Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΄Π° сС ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅, ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€Π°Ρ˜ΡœΠΈ сС Π²ΠΎ Π·ΠΎΠΌΠ±ΠΈ.

Π˜ΠΌΠ°Ρ˜Ρ‚Π΅ Π½Π° ΡƒΠΌ: Π”Π° Π±ΠΈΠ΄Π°ΠΌ ΠΏΠΎΠΏΡ€Π΅Ρ†ΠΈΠ·Π΅Π½, процСситС сС ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈ ΠΎΠ΄ cron Π·Π°Π΄Π°Ρ‡ΠΈ, Π½ΠΎ supercronic Π½Π΅ Π΅ ΠΈΠ½ΠΈΡ‚Π΅Π½ систСм ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ β€žΡƒΡΠ²ΠΎΠΈβ€œ процСситС ΡˆΡ‚ΠΎ Π³ΠΈ создалС Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Π΄Π΅Ρ†Π°. Кога ќС сС ΠΏΠΎΠ΄ΠΈΠ³Π½Π°Ρ‚ сигналитС SIGHUP ΠΈΠ»ΠΈ SIGTERM, Ρ‚ΠΈΠ΅ Π½Π΅ сС прСнСсуваат Π½Π° дСтскитС процСси, ΡˆΡ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚ΠΈΡ€Π° со Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ процСситС Π½Π° Π΄Π΅Ρ‚Π΅ Π½Π΅ Π·Π°Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚ ΠΈ остануваат Π²ΠΎ статус Π½Π° Π·ΠΎΠΌΠ±ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ повСќС Π·Π° сСто ΠΎΠ²Π°, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²ΠΎ Ρ‚Π°ΠΊΠΎΠ² напис.

ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅:

  1. Како ΠΏΡ€ΠΈΠ²Ρ€Π΅ΠΌΠ΅Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ - Π·Π³ΠΎΠ»Π΅ΠΌΠ΅Ρ‚Π΅ Π³ΠΎ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° 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
  2. Или ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°Ρ˜Ρ‚Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π²ΠΎ супСркроник Π½Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ, Ρ‚ΡƒΠΊΡƒ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ истото Ρ‚ΠΈΠ½ΠΈ, кој ΠΌΠΎΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΡ€Π΅ΠΊΠΈΠ½Π΅ процСситС ΠΈ Π΄Π° Π½Π΅ создава Π·ΠΎΠΌΠ±ΠΈ.

ΠŸΡ€ΠΈΠΊΠ°Π·Π½Π° 2. β€žΠ—ΠΎΠΌΠ±ΠΈβ€œ ΠΏΡ€ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ Π½Π° cgroup

Kubelet ΠΏΠΎΡ‡Π½Π° Π΄Π° Ρ‚Ρ€ΠΎΡˆΠΈ ΠΌΠ½ΠΎΠ³Ρƒ процСсор:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

На никој Π½Π΅ΠΌΠ° Π΄Π° ΠΌΡƒ сС Π΄ΠΎΠΏΠ°Π΄Π½Π΅ ΠΎΠ²Π°, ΠΏΠ° сС Π²ΠΎΠΎΡ€ΡƒΠΆΠΈΠ²ΠΌΠ΅ ΠΏΠ΅Ρ€Ρ„ ΠΈ ΠΏΠΎΡ‡Π½Π° Π΄Π° сС справува со ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΠ΄ истрагата Π±Π΅Π° ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ слСдува:

  • Kubelet Ρ‚Ρ€ΠΎΡˆΠΈ повСќС ΠΎΠ΄ Π΅Π΄Π½Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠ½Π° ΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° процСсорот Π²Π»Π΅Ρ‡Π΅Ρ˜ΡœΠΈ мСмориски ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ ситС cΠ³Ρ€ΡƒΠΏΠΈ:

    6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

  • Π’ΠΎ мСјлинг листата Π½Π° Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ΠΈΡ‚Π΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π΄ΠΈΡΠΊΡƒΡΠΈΡ˜Π° Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚. Накратко, ΠΏΠΎΠ΅Π½Ρ‚Π°Ρ‚Π° сС свСдува Π½Π° ΠΎΠ²Π°: Ρ€Π°Π·Π½ΠΈ tmpfs Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ слични Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π΅ сС цСлосно отстранСти ΠΎΠ΄ систСмот ΠΏΡ€ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ Π½Π° cgroup, Ρ‚.Π½ memcg Π·ΠΎΠΌΠ±ΠΈ. ΠŸΠΎΡ€Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΡ†Π½Π° Ρ‚ΠΈΠ΅ ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΈΠ·Π±Ρ€ΠΈΡˆΠ°Π½ΠΈ ΠΎΠ΄ ΠΊΠ΅ΡˆΠΎΡ‚ Π½Π° страницата, Π½ΠΎ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π½Π° сСрвСрот ΠΈ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π½Π΅ ја Π³Π»Π΅Π΄Π° смислата Π²ΠΎ Π³ΡƒΠ±Π΅ΡšΠ΅Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π·Π° Π½ΠΈΠ²Π½ΠΎ Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅. Π—Π°Ρ‚ΠΎΠ° ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎ сС Ρ‚Ρ€ΡƒΠΏΠ°Π°Ρ‚. Π—ΠΎΡˆΡ‚ΠΎ Π²ΠΎΠΎΠΏΡˆΡ‚ΠΎ сС случува ΠΎΠ²Π°? Ова Π΅ сСрвСр со cron jobs кој ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎ создава Π½ΠΎΠ²ΠΈ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ мСста, Π° со Π½ΠΈΠ² ΠΈ Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ΄ΠΎΠ²ΠΈ. Π’Π°ΠΊΠ°, сС создаваат Π½ΠΎΠ²ΠΈ cΠ³Ρ€ΡƒΠΏΠΈ Π·Π° ΠΊΠΎΠ½Ρ‚Π΅Ρ˜Π½Π΅Ρ€ΠΈΡ‚Π΅ Π²ΠΎ Π½ΠΈΠ², ΠΊΠΎΠΈ наскоро сС Π±Ρ€ΠΈΡˆΠ°Ρ‚.
  • Π—ΠΎΡˆΡ‚ΠΎ cAdvisor Π²ΠΎ ΠΊΡƒΠ±Π΅Π»Π΅Ρ‚ Ρ‚Ρ€ΠΎΡˆΠΈ Ρ‚ΠΎΠ»ΠΊΡƒ ΠΌΠ½ΠΎΠ³Ρƒ Π²Ρ€Π΅ΠΌΠ΅? Ова Π΅ лСсно Π΄Π° сС Π²ΠΈΠ΄ΠΈ со Π½Π°Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎΡ‚ΠΎ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ time cat /sys/fs/cgroup/memory/memory.stat. Ако Π½Π° Π·Π΄Ρ€Π°Π²Π° машина ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Ρ‚Ρ€Π°Π΅ 0,01 сСкунди, Ρ‚ΠΎΠ³Π°Ρˆ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΈΠΎΡ‚ cron02 Ρ‚Ρ€Π°Π΅ 1,2 сСкунди. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π΅ ΡˆΡ‚ΠΎ cAdvisor, кој ΠΌΠ½ΠΎΠ³Ρƒ Π±Π°Π²Π½ΠΎ Π³ΠΈ Ρ‡ΠΈΡ‚Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ sysfs, сС ΠΎΠ±ΠΈΠ΄ΡƒΠ²Π° Π΄Π° ја Π·Π΅ΠΌΠ΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° ΡˆΡ‚ΠΎ сС користи Π²ΠΎ Π·ΠΎΠΌΠ±ΠΈ cΠ³Ρ€ΡƒΠΏΠΈΡ‚Π΅.
  • Π—Π° насилно ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π·ΠΎΠΌΠ±ΠΈ, сС ΠΎΠ±ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ Π΄Π° Π³ΠΈ исчистимС ΠΊΠ΅ΡˆΠΎΠ²ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡Π°Π½ΠΎ Π²ΠΎ LKML: sync; echo 3 > /proc/sys/vm/drop_caches, - Π½ΠΎ Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ сС ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΏΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Π½ΠΎ ΠΈ Π³ΠΎ ΡƒΡ€Π½Π° Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΠΎΡ‚.

Π¨Ρ‚ΠΎ Π΄Π° сС ΠΏΡ€Π°Π²ΠΈ? ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ сС Ρ€Π΅ΡˆΠ°Π²Π° (посвСтат, Π° Π·Π° опис Π²ΠΈΠ΄ΠΈ ΠΏΠΎΡ€Π°ΠΊΠ° Π·Π° ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡƒΠ²Π°ΡšΠ΅) Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Линукс Π΄ΠΎ Π²Π΅Ρ€Π·ΠΈΡ˜Π°Ρ‚Π° 4.16.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ˜Π° 3. Systemd ΠΈ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° ΠΌΠΎΠ½Ρ‚Π°ΠΆΠ°

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, kubelet Ρ‚Ρ€ΠΎΡˆΠΈ ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ рСсурси Π½Π° Π½Π΅ΠΊΠΎΠΈ јазли, Π½ΠΎ овој ΠΏΠ°Ρ‚ Ρ‚Ρ€ΠΎΡˆΠΈ ΠΏΡ€Π΅ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

Π‘Π΅ испостави Π΄Π΅ΠΊΠ° ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π²ΠΎ systemd ΡˆΡ‚ΠΎ сС користи Π²ΠΎ Ubuntu 16.04 ΠΈ сС Ρ˜Π°Π²ΡƒΠ²Π° ΠΏΡ€ΠΈ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°ΡšΠ° ΡˆΡ‚ΠΎ сС создадСни Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ subPath ΠΎΠ΄ ConfigMaps ΠΈΠ»ΠΈ Ρ‚Π°Ρ˜Π½ΠΈ. ΠžΡ‚ΠΊΠ°ΠΊΠΎ ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠ°Ρ‚Π° ќС ја Π·Π°Π²Ρ€ΡˆΠΈ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° услугата systemd ΠΈ Π½Π΅Ρ˜Π·ΠΈΠ½ΠΈΠΎΡ‚ сСрвисСн ΠΌΠΎΠ½Ρ‚ остануваат Π²ΠΎ систСмот. Π‘ΠΎ Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, ΠΎΠ³Ρ€ΠΎΠΌΠ΅Π½ Π±Ρ€ΠΎΡ˜ ΠΎΠ΄ Π½ΠΈΠ² сС Π°ΠΊΡƒΠΌΡƒΠ»ΠΈΡ€Π°Π°Ρ‚. Има Π΄ΡƒΡ€ΠΈ ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ°:

  1. #5916;
  2. ΠΊΡƒΠ±Π΅Ρ€Π½Π΅Ρ‚ΠΈ #57345.

...послСдната ΠΎΠ΄ Π½ΠΈΠ² сС однСсува Π½Π° ПР Π²ΠΎ систСмот: # 7811 (ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΠΎ systemd - # 7798).

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ повСќС Π½Π΅ постои Π²ΠΎ Ubuntu 18.04, Π½ΠΎ Π°ΠΊΠΎ сакатС Π΄Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅ Π΄Π° Π³ΠΎ користитС Ubuntu 16.04, ΠΌΠΎΠΆΠ΅Π±ΠΈ ќС Π²ΠΈ Π±ΠΈΠ΄Π΅ корисСн Π½Π°ΡˆΠΈΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ°.

Π’Π°ΠΊΠ°, Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ слСдниов 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 ΠΌΠΈΠ½ΡƒΡ‚ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ спомСнатиот супСркроник. ΠΠ΅Ρ˜Π·ΠΈΠ½Π°Ρ‚Π° 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. ΠšΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΡΡ‚ ΠΏΡ€ΠΈ Π·Π°ΠΊΠ°ΠΆΡƒΠ²Π°ΡšΠ΅ ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠΈ

Π—Π°Π±Π΅Π»Π΅ΠΆΠ°Π½ΠΎ Π΅ Π΄Π΅ΠΊΠ°: Π°ΠΊΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠ° поставСна Π½Π° јазол ΠΈ Π½Π΅Ρ˜Π·ΠΈΠ½Π°Ρ‚Π° слика сС испумпува ΠΌΠ½ΠΎΠ³Ρƒ Π΄ΠΎΠ»Π³ΠΎ, Ρ‚ΠΎΠ³Π°Ρˆ Π΄Ρ€ΡƒΠ³Π° ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠ° ΡˆΡ‚ΠΎ Π³ΠΎ β€žΡƒΠ΄Ρ€ΠΈβ€œ истиот јазол Сдноставно ќС Π½Π΅ ΠΏΠΎΡ‡Π½ΡƒΠ²Π° Π΄Π° ја Π²Π»Π΅Ρ‡Π΅ сликата Π½Π° Π½ΠΎΠ²ΠΈΠΎΡ‚ ΠΏΠΎΠ΄. НамСсто Ρ‚ΠΎΠ°, Ρ‡Π΅ΠΊΠ° Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ сС ΠΏΠΎΠ²Π»Π΅Ρ‡Π΅ сликата ΠΎΠ΄ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠ°. Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ°, ΠΏΠΎΠ΄Π»ΠΎΠ³Π°Ρ‚Π° ΡˆΡ‚ΠΎ вСќС Π±ΠΈΠ»Π° Π·Π°ΠΊΠ°ΠΆΠ°Π½Π° ΠΈ Ρ‡ΠΈΡ˜Π° слика ΠΌΠΎΠΆΠ΅Π»Π° Π΄Π° сС ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅ Π·Π° само Π΅Π΄Π½Π° ΠΌΠΈΠ½ΡƒΡ‚Π° ќС Π·Π°Π²Ρ€ΡˆΠΈ Π²ΠΎ статус Π½Π° containerCreating.

НастанитС ќС ΠΈΠ·Π³Π»Π΅Π΄Π°Π°Ρ‚ ΠΎΡ‚ΠΏΡ€ΠΈΠ»ΠΈΠΊΠ° Π²Π°ΠΊΠ°:

Normal  Pulling    8m    kubelet, ip-10-241-44-128.ap-northeast-1.compute.internal  pulling image "registry.example.com/infra/openvpn/openvpn:master"

Π˜Π·Π»Π΅Π³ΡƒΠ²Π° Π΄Π΅ΠΊΠ° Π΅Π΄Π½Π° слика ΠΎΠ΄ Π±Π°Π²Π΅Π½ рСгистар ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π±Π»ΠΎΠΊΠΈΡ€Π° Ρ€Π°ΡΠΏΠΎΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ ΠΏΠΎ јазол.

Π—Π° ΠΆΠ°Π», Π½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ Π½Π°Ρ‡ΠΈΠ½ΠΈ Π·Π° ΠΈΠ·Π»Π΅Π· ΠΎΠ΄ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°:

  1. ΠžΠ±ΠΈΠ΄Π΅Ρ‚Π΅ сС Π΄Π° Π³ΠΎ користитС Π²Π°ΡˆΠΈΠΎΡ‚ Docker Registry Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ кластСрот ΠΈΠ»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ со кластСрот (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, GitLab Registry, Nexus, ΠΈΡ‚Π½.);
  2. ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ‚Π΅ ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС kraken.

ΠŸΡ€ΠΈΠΊΠ°Π·Π½Π° 5. ΠˆΠ°Π·Π»ΠΈΡ‚Π΅ висат ΠΏΠΎΡ€Π°Π΄ΠΈ нСдостаток Π½Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°

Π—Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Π½Π°ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ ΠΈ Π½Π° ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π° ΠΊΠΎΠ³Π° Π΅Π΄Π΅Π½ јазол цСлосно прСстанува Π΄Π° Π±ΠΈΠ΄Π΅ достапСн: SSH Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€Π°, ситС Π΄Π΅ΠΌΠΎΠ½ΠΈ Π·Π° слСдСњС ΠΏΠ°Ρ“Π°Π°Ρ‚, Π° ΠΏΠΎΡ‚ΠΎΠ° Π½Π΅ΠΌΠ° Π½ΠΈΡˆΡ‚ΠΎ (ΠΈΠ»ΠΈ рСчиси Π½ΠΈΡˆΡ‚ΠΎ) Π½Π΅Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ Π²ΠΎ Π΄Π½Π΅Π²Π½ΠΈΡ†ΠΈΡ‚Π΅.

ЌС Π²ΠΈ ΠΊΠ°ΠΆΠ°ΠΌ Π½Π° слики ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ Π½Π° Π΅Π΄Π΅Π½ јазол ΠΊΠ°Π΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°ΡˆΠ΅ MongoDB.

Π’Π°ΠΊΠ° ΠΈΠ·Π³Π»Π΅Π΄Π° Π½Π° Π²Ρ€Π²ΠΎΡ‚ Π΄Π° Π½Π΅ΡΡ€Π΅ΡœΠΈ:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

И Π²Π°ΠΊΠ° - ΠΏΠΎ Π½Π΅ΡΡ€Π΅ΡœΠΈ:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

Π’ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΡ‚, постои ΠΈ остар скок, ΠΏΡ€ΠΈ кој Ρ˜Π°Π·ΠΎΠ»ΠΎΡ‚ прСстанува Π΄Π° Π±ΠΈΠ΄Π΅ достапСн:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

Π’Π°ΠΊΠ°, ΠΎΠ΄ сликитС ΠΎΠ΄ Π΅ΠΊΡ€Π°Π½ΠΎΡ‚ Π΅ јасно Π΄Π΅ΠΊΠ°:

  1. RAM ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Π΅ блиску Π΄ΠΎ ΠΊΡ€Π°Ρ˜ΠΎΡ‚;
  2. Има остар скок Π²ΠΎ ΠΏΠΎΡ‚Ρ€ΠΎΡˆΡƒΠ²Π°Ρ‡ΠΊΠ°Ρ‚Π° Π½Π° RAM ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°, ΠΏΠΎ ΡˆΡ‚ΠΎ пристапот Π΄ΠΎ Ρ†Π΅Π»Π°Ρ‚Π° машина Π΅ Π½Π°Π³Π»ΠΎ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½;
  3. Π“ΠΎΠ»Π΅ΠΌΠ° Π·Π°Π΄Π°Ρ‡Π° пристигнува Π½Π° Mongo, ΡˆΡ‚ΠΎ Π³ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΡƒΠ²Π° процСсот Π½Π° DBMS Π΄Π° користи повСќС ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° Ρ‡ΠΈΡ‚Π° ΠΎΠ΄ дискот.

Π˜Π·Π»Π΅Π³ΡƒΠ²Π° Π΄Π΅ΠΊΠ° Π°ΠΊΠΎ Линукс снСма слободна ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° (притисок Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° сС поставува) ΠΈ Π½Π΅ΠΌΠ° Π·Π°ΠΌΠ΅Π½Π°, Ρ‚ΠΎΠ³Π°Ρˆ Π΄Π° Кога ќС пристигнС ΡƒΠ±ΠΈΠ΅Ρ†ΠΎΡ‚ Π½Π° OOM, ΠΌΠΎΠΆΠ΅ Π΄Π° дојдС Π΄ΠΎ Π±Π°Π»Π°Π½ΡΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Ρ„Ρ€Π»Π°ΡšΠ΅ страници Π²ΠΎ ΠΊΠ΅ΡˆΠΎΡ‚ Π½Π° страницитС ΠΈ Π½ΠΈΠ²Π½ΠΎ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π°Π·Π°Π΄ Π½Π° дискот. Ова Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ kswapd, кој Ρ…Ρ€Π°Π±Ρ€ΠΎ ослободува ΡˆΡ‚ΠΎ Π΅ ΠΌΠΎΠΆΠ½ΠΎ повСќС мСмориски страници Π·Π° послСдоватСлна Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Π°.

Π—Π° ΠΆΠ°Π», со Π³ΠΎΠ»Π΅ΠΌΠΎ Π’/И ΠΎΠΏΡ‚ΠΎΠ²Π°Ρ€ΡƒΠ²Π°ΡšΠ΅ Π·Π°Π΅Π΄Π½ΠΎ со ΠΌΠ°Π»Π° ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π° слободна ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°, kswapd станува тСсно Π³Ρ€Π»ΠΎ Π½Π° Ρ†Π΅Π»ΠΈΠΎΡ‚ систСм, Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ сС Π²Ρ€Π·Π°Π½ΠΈ Π·Π° Ρ‚ΠΎΠ° ситС Π°Π»ΠΎΠΊΠ°Ρ†ΠΈΠΈ (Π³Ρ€Π΅ΡˆΠΊΠΈ Π½Π° страници) Π½Π° мСмориски страници Π²ΠΎ систСмот. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ‚Ρ€Π°Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Π΄ΠΎΠ»Π³ΠΎ Π°ΠΊΠΎ процСситС Π½Π΅ сакаат повСќС Π΄Π° користат ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°, Ρ‚ΡƒΠΊΡƒ сС фиксирани Π½Π° самиот Ρ€Π°Π± Π½Π° Π±Π΅Π·Π΄Π½Π°Ρ‚Π° Π½Π° ΡƒΠ±ΠΈΠ΅Ρ†ΠΎΡ‚ Π½Π° OOM.

ΠŸΡ€ΠΈΡ€ΠΎΠ΄Π½ΠΎΡ‚ΠΎ ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅ Π΅: Π·ΠΎΡˆΡ‚ΠΎ ΡƒΠ±ΠΈΠ΅Ρ†ΠΎΡ‚ Π½Π° ООМ Π΄ΠΎΠ°Ρ“Π° Ρ‚ΠΎΠ»ΠΊΡƒ Π΄ΠΎΡ†Π½Π°? Π’ΠΎ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° сСгашна ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡ˜Π°, ΡƒΠ±ΠΈΠ΅Ρ†ΠΎΡ‚ OOM Π΅ ΠΊΡ€Π°Ρ˜Π½ΠΎ Π³Π»ΡƒΠΏΠ°Π²: ќС Π³ΠΎ ΡƒΠ±ΠΈΠ΅ процСсот само ΠΊΠΎΠ³Π° ΠΎΠ±ΠΈΠ΄ΠΎΡ‚ Π΄Π° сС распрСдСли страница Π·Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π½Π΅ успСС, Ρ‚.Π΅. Π°ΠΊΠΎ Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π° Π½Π° страницата Π½Π΅ успСС. Ова Π½Π΅ сС случува Π΄ΠΎΠ»Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅, бидСјќи kswapd Ρ…Ρ€Π°Π±Ρ€ΠΎ Π³ΠΈ ослободува мСморискитС страници, Ρ„Ρ€Π»Π°Ρ˜ΡœΠΈ Π³ΠΎ ΠΊΠ΅ΡˆΠΎΡ‚ Π½Π° страницата (Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚, Ρ†Π΅Π»ΠΈΠΎΡ‚ Π²Π»Π΅Π·/ΠΈΠ·Π»Π΅Π· Π½Π° дискот Π²ΠΎ систСмот) Π½Π°Π·Π°Π΄ Π½Π° дискот. ΠŸΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΎ, со опис Π½Π° Ρ‡Π΅ΠΊΠΎΡ€ΠΈΡ‚Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ Π·Π° ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π²Π°ΠΊΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ Ρ‚ΡƒΠΊΠ°.

Ова ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅ Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈ со Linux ΠΊΠ΅Ρ€Π½Π΅Π» 4.6+.

ΠŸΡ€ΠΈΠΊΠ°Π·Π½Π° 6. ΠœΠ΅ΡˆΡƒΠ½ΠΊΠΈΡ‚Π΅ сС Π·Π°Π³Π»Π°Π²ΡƒΠ²Π°Π°Ρ‚ Π²ΠΎ ΡΠΎΡΡ‚ΠΎΡ˜Π±Π° Π½Π° Ρ‡Π΅ΠΊΠ°ΡšΠ΅

Π’ΠΎ Π½Π΅ΠΊΠΎΠΈ кластСри, Π²ΠΎ ΠΊΠΎΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π°Ρ‚ навистина ΠΌΠ½ΠΎΠ³Ρƒ ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠΈ, ΠΏΠΎΡ‡Π½Π°Π²ΠΌΠ΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΡƒΠ²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ ΠΎΠ΄ Π½ΠΈΠ² β€žΠ²ΠΈΡΠ°Ρ‚β€œ ΠΌΠ½ΠΎΠ³Ρƒ Π΄ΠΎΠ»Π³ΠΎ Π²ΠΎ Π΄Ρ€ΠΆΠ°Π²Π°Ρ‚Π° 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

По Π½Π΅ΠΊΠΎΠ΅ копањС, Π½Π°ΠΏΡ€Π°Π²ΠΈΠ²ΠΌΠ΅ прСтпоставка Π΄Π΅ΠΊΠ° ΠΊΡƒΠ±Π΅Π»Π΅Ρ‚ΠΎΡ‚ Сдноставно Π½Π΅ΠΌΠ° Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° Π³ΠΈ испрати ситС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° ΡΠΎΡΡ‚ΠΎΡ˜Π±Π°Ρ‚Π° Π½Π° ΠΌΠ΅ΡˆΡƒΠ½ΠΊΠΈΡ‚Π΅ ΠΈ тСстовитС Π·Π° Тивост/подготвСност Π΄ΠΎ сСрвСрот API.

И ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ја ΠΏΡ€ΠΎΡƒΡ‡ΡƒΠ²Π°Π²ΠΌΠ΅ ΠΏΠΎΠΌΠΎΡˆΡ‚Π°, Π³ΠΈ најдовмС слСднивС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ:

--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

... ΠΈ Π³ΠΈ рСстартиравмС kubelets, ΠΏΠΎ ΡˆΡ‚ΠΎ ја Π²ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ слСдната слика Π²ΠΎ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ½ΠΈΡ‚Π΅ Π½Π° ΠΏΠΎΠ²ΠΈΡ†ΠΈΡ‚Π΅ Π΄ΠΎ сСрвСрот API:

6 Π·Π°Π±Π°Π²Π½ΠΈ систСмски Π³Ρ€Π΅ΡˆΠΊΠΈ Π²ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ΡšΠ΅Ρ‚ΠΎ Π½Π° Kubernetes [ΠΈ Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅]

... ΠΈ Π΄Π°, сè ΠΏΠΎΡ‡Π½Π° Π΄Π° Π»Π΅Ρ‚Π°!

PS

Π—Π° Π½ΠΈΠ²Π½Π°Ρ‚Π° помош Π²ΠΎ ΡΠΎΠ±ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°Ρ‚Π° Π½Π° овој напис, ΠΈΠ·Ρ€Π°Π·ΡƒΠ²Π°ΠΌ Π΄Π»Π°Π±ΠΎΠΊΠ° благодарност Π΄ΠΎ Π±Ρ€ΠΎΡ˜Π½ΠΈΡ‚Π΅ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΈ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° компанија, Π° особСно Π΄ΠΎ ΠΌΠΎΡ˜ΠΎΡ‚ ΠΊΠΎΠ»Π΅Π³Π° ΠΎΠ΄ Π½Π°ΡˆΠΈΠΎΡ‚ Ρ‚ΠΈΠΌ Π·Π° ΠΈΡΡ‚Ρ€Π°ΠΆΡƒΠ²Π°ΡšΠ΅ ΠΈ Ρ€Π°Π·Π²ΠΎΡ˜ ΠΠ½Π΄Ρ€Π΅Ρ˜ ΠšΠ»ΠΈΠΌΠ΅Π½Ρ‚Ρ˜Π΅Π² (Π·ΡƒΠ·ΠΈ).

PPS

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ˜Ρ‚Π΅ ΠΈ Π½Π° Π½Π°ΡˆΠΈΠΎΡ‚ Π±Π»ΠΎΠ³:

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€