【K8s任務】在 Pod 中的容器之間共享程序名稱空間
阿新 • • 發佈:2021-08-05
參考: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 中的其他容器可見。 這使除錯更加容易,但也意味著檔案系統安全性只受檔案系統許可權的保護。
作者:Varden
出處:http://www.cnblogs.com/varden/
本文內容如有雷同,請聯絡作者!
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。