Поділ простору імен процесів між контейнерами у Podʼі
На цій сторінці показано, як налаштувати поділ простору імен процесів для Podʼа. Коли поділ простору імен процесів увімкнено, процеси в контейнері стають видимими для всіх інших контейнерів у тому ж Podʼі.
Ви можете використовувати цю функцію для налаштування контейнерів, що взаємодіють один з одним, таких як контейнер sidecar обробника логу, або для дослідження образів контейнера, які не містять інструментів для налагодження, наприклад, оболонки.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Налаштування Podʼа
Поділ простору імен процесів увімкнено за допомогою поля shareProcessNamespace
в розділі .spec
Podʼа. Наприклад:
Створіть Pod
nginx
у вашому кластері:kubectl apply -f https://k8s.io/examples/pods/share-process-namespace.yaml
Приєднайтеся до контейнера
shell
та запустіть командуps
:kubectl exec -it nginx -c shell -- /bin/sh
Якщо ви не бачите символу командного рядка, спробуйте натиснути клавішу Enter. У оболонці контейнера:
# виконайте це всередині контейнера "shell" ps ax
Вивід схожий на такий:
PID USER TIME COMMAND 1 root 0:00 /pause 8 root 0:00 nginx: master process nginx -g daemon off; 14 101 0:00 nginx: worker process 15 root 0:00 sh 21 root 0:00 ps ax
Ви можете відправляти сигнали процесам в інших контейнерах. Наприклад, відправте SIGHUP
до nginx
, щоб перезапустити робочий процес. Для цього потрібна можливість SYS_PTRACE
.
# виконайте це всередині контейнера "shell"
kill -HUP 8 # змініть "8" на відповідний PID лідера процесу nginx, якщо потрібно
ps ax
Вивід схожий на такий:
PID USER TIME COMMAND
1 root 0:00 /pause
8 root 0:00 nginx: master process nginx -g daemon off;
15 root 0:00 sh
22 101 0:00 nginx: worker process
23 root 0:00 ps ax
Навіть можливо отримати доступ до файлової системи іншого контейнера, використовуючи посилання /proc/$pid/root
.
# виконайте це всередині контейнера "shell"
# змініть "8" на PID процесу Nginx, якщо потрібно
head /proc/8/root/etc/nginx/nginx.conf
Вивід схожий на такий:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
Розуміння поділу простору імен процесів
Podʼи ділять багато ресурсів, тому логічно, що вони також будуть ділитися простором імен процесів. Деякі контейнери можуть очікувати ізоляції від інших, тому важливо розуміти відмінності:
Процес контейнера вже не має PID 1. Деякі контейнери відмовляються запускатися без PID 1 (наприклад, контейнери, що використовують
systemd
) або виконують команди типуkill -HUP 1
для відправлення сигналу процесу контейнера. У Podʼах зі спільним простором імен процесівkill -HUP 1
відправить сигнал пісочниці Podʼа (/pause
у вищезазначеному прикладі).Процеси видимі іншим контейнерам у Podʼі. Це включає всю інформацію, доступну у
/proc
, таку як паролі, що були передані як аргументи або змінні середовища. Ці дані захищені лише звичайними правами Unix.Файлові системи контейнерів видимі іншим контейнерам у Podʼі через посилання
/proc/$pid/root
. Це полегшує налагодження, але також означає, що секрети файлової системи захищені лише правами файлової системи.