簡介
此文講述如何配置Pod中的容器恭喜共享進程Namespace。當進程名稱空間共享被激活,在同一個Pod中,一個容器的進程可以在其他容器中看到。可以使用此功能來配置協作容器,例如日志處理程序sidecar容器,或對不包含調試實用程序(例如shell)的容器映像進行故障排除。在Kubernetes v1.17中已處於穩定狀態。
備注:此文檔參考官方文檔,並加以自己的理解。如有誤導性的內容,請批評指正。
配置Pod共享進程Namespace
使用shareProcessNamespace
激活進程Namespace共享。例如:
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
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
創建Pod
# kubectl apply -f /root/k8s-example/pods/share-process-namespace.yaml
2、將 shell
容器附加到nginx
容器上,運行ps
命令
# kubectl attach -it nginx -c shell
輸出內容如下:
/ # ps ax
PID USER TIME COMMAND
1 root 0:00 /pause
6 root 0:00 nginx: master process nginx -g daemon off;
11 101 0:00 nginx: worker process
12 root 0:00 sh
18 root 0:00 ps ax
可以用信號通知其他容器中的進程。 例如,將SIGHUP
發送到nginx以重新啟動worker
進程。 這需要SYS_PTRACE
功能。
/ # kill -HUP 6
/ # ps ax
PID USER TIME COMMAND
1 root 0:00 /pause
6 root 0:00 nginx: master process nginx -g daemon off;
12 root 0:00 sh
19 101 0:00 nginx: worker process
20 root 0:00 ps ax
甚至可以使用/proc/$pid/root
鏈接訪問另一個容器映像。
/ # head /proc/6/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;
理解進程Namepsace共享
Pod可以共享很多資源,例如共享進程名稱空間。不過,某些容器圖片可能會與其他容器隔離,因此了解這些差異很重要:
- 容器的進程不再有
PID 1
。一些容器在沒有PID 1
進程或運行諸如kill -HUP 1之類的命令來發出容器進程信號拒絕啟動(例如:,容器使用systemd
)在具有共享進程名稱空間的Pod中,kill -HUP 1
將向Pod沙箱發出信號。 (在以上示例中為/ pause
。) - 進程對Pod中的其他容器可見。 這包括
/proc
中所有可見的信息,例如作為參數或環境變量傳遞的密碼。 這些僅受常規Unix權限保護。 - 容器文件系對Pod中其他容器通過
/proc/$pid/root
鏈接。這使調試更加容易,但是這也意味着文件系統秘密僅受文件系統許可權保護。