參考文件 https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
今天要來實作 Share Process Namespace between Containers in a Pod 這個任務
在同一個 Pod 的 Container 內的 Process 可以透過 namespace sharing 的方式, 讓彼此可以互相溝通
這種設定可以用來讓同一個 Pod 內的 Container 彼此合作. 舉例來說, 建立一個專門處理應用log 的 SideCar Container 或是建立一個用來 Debug 的 Container 就可以這樣做
1 建立一個 Pod 設定 shareProcessNames 讓 Container 間 Process 可以互通
2 透過連線到其中一的 Container 驗證查看另一個 Container 的 Process
建立 share-process-namespace.yaml 如下:
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
名稱設定為 nginx
設定 shareProcessNamespace 為 true 這個設定用來讓 Containers 間的 Process 可以互通
設定第一個 Container 使用 image 為 nginx 名稱設定為 nginx
設定第二個 Container 使用 image 為 busybox 名稱設定為 shell
設定第二個 Container 設定 securityContext 如下
capabilities:
add:
- SYS_PTRACE
增加這個 SYS_PTRACE 是開啟 可以讓另一個 Container Process 操作這個 busybox Container process 的權限
設定第二個 Container 開啟 tty: true, stdin: true 打開 terminal 與 stdin 權限
建立佈署使用以下指令
kubectl apply -f share-process-namespace.yaml
透過以下指令連線到 nginx
kubectl attach -it nginx -c shell
使用以下指令查看 Process
ps ax
透過以下指令發 SIGNUP 到 nginx 來重新啟動 worker process
kill -HUP 7
注意的是, 這邊 7 這個 PID 可能因為每個佈署的不同而不同, 需要透過上面 ps ax 找到 master process 來處理
然後使用以下指令驗證一下重起狀態
ps ax
使用以下指令來查看 /proc/$pid/root 連結
head /proc/7/root/etc/nginx/nginx.conf
同一個 Pod 的 Container 透過 shared namespace namespace
以下有幾個特性
有些 Container 需要 PID 1 來開啟比如說需要 systemd 的 image
會透過 kill -HUP 1 來重啟 Container Process
在 Pod 有開啟 share process namespace, kill -HUP 1 則會變成發指令到 Pod 的 sandbox
包括所有在 /proc 下的資訊, 比如說環境參數或是運行參數
可是存取仍然需要是具有對應 UNIX 權限的使用者
透過這個方式可以有效的做 debug
這篇是 k8s 入門 30 天的最後一篇
大致上介紹了一些基礎 k8s 基礎概念
筆者發現在研究時由於自身經驗的不足, 常常無法用良好的實際案例來解說
想要更理解 k8s 的效用, 後續應該要做更延伸應用
還需要去研究許多比如資訊安全的設置, NAT, Metric 監測, 或是建制 ci/cd 的 Pipeline runner 等等也許都是不錯的應用情境
感謝各位訂閱者一直以來的觀看筆者的文章