參考:https://kubernetes.io/zh/docs/tasks/configure-pod-container/share-process-namespace/
FEATURE STATE: Kubernetes v1.17 [stable]
此頁面展示如何為 pod 配置進程命名空間共享。 當啟用進程命名空間共享時,容器中的進程對該 pod 中的所有其他容器都是可見的。
您可以使用此功能來配置協作容器,比如日志處理 sidecar 容器,或者對那些不包含諸如 shell 等調試實用工具的鏡像進行故障排查。
配置 Pod
進程命名空間共享使用 v1.PodSpec 中的 ShareProcessNamespace 字段啟用。例如:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
shareProcessNamespace: true
containers:
- name: nginx
image: nginx
- name: shell
image: busybox
securityContext:
capabilities:
add:
- SYS_PTRACE
stdin: true
tty: true
1.在集群中創建 nginx pod:
kubectl apply -f https://k8s.io/examples/pods/share-process-namespace.yaml
2.獲取容器 shell,執行 ps:
kubectl attach -it nginx -c shell
如果沒有看到命令提示符,請按 enter 回車鍵。
/ # 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 功能。
/ # kill -HUP 8
/ # 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 鏈接訪問另一個容器鏡像。
/ # 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 共享許多資源,因此它們共享進程命名空間是很有意義的。 不過,有些容器鏡像可能希望與其他容器隔離,因此了解這些差異很重要:
1.容器進程不再具有 PID 1。 在沒有 PID 1 的情況下,一些容器鏡像拒絕啟動(例如,使用 systemd 的容器),或者拒絕執行 kill -HUP 1 之類的命令來通知容器進程。在具有共享進程命名空間的 pod 中,kill -HUP 1 將通知 pod 沙箱(在上面的例子中是 /pause)。
2.進程對 pod 中的其他容器可見。 這包括 /proc 中可見的所有信息,例如作為參數或環境變量傳遞的密碼。這些僅受常規 Unix 權限的保護。
3.容器文件系統通過 /proc/$pid/root 鏈接對 pod 中的其他容器可見。 這使調試更加容易,但也意味着文件系統安全性只受文件系統權限的保護。