在 Pod 中使用使用者名稱空間

功能狀態: Kubernetes v1.33 [beta] (預設啟用:true)

本頁面展示瞭如何為 Pod 配置使用者名稱空間。這允許你將容器內部執行的使用者與主機上的使用者隔離開來。

以 root 使用者身份在容器中執行的程序,可以在主機上以不同的(非 root)使用者身份執行;換句話說,該程序對使用者名稱空間內的操作擁有完全許可權,但對名稱空間外的操作沒有特權。

你可以使用此功能來減少受損容器對主機或同一節點中的其他 Pod 造成的損害。有 幾項安全漏洞 被評為高危嚴重,在使用者名稱空間啟用時是無法利用的。預計使用者名稱空間在未來也能緩解一些漏洞。

如果不使用使用者名稱空間,以 root 身份執行的容器在發生容器逃逸時,將對節點擁有 root 許可權。如果容器被授予某些功能,這些功能在主機上也是有效的。當使用使用者名稱空間時,這些都不成立。

準備工作

你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用以下 Kubernetes 演練場之一

你的 Kubernetes 伺服器版本必須是 v1.25 或更高版本。

要檢查版本,請輸入 kubectl version

  • 節點作業系統需要是 Linux。
  • 你需要在主機中執行命令。
  • 你需要能夠 exec 進入 Pod。
  • 你需要啟用 UserNamespacesSupport 特性門控

你正在使用的叢集必須包含至少一個滿足為 Pod 使用使用者名稱空間的要求的節點。

如果你的節點混合存在,並且只有部分節點為 Pod 提供使用者名稱空間支援,你還需要確保使用者名稱空間 Pod 被排程到合適的節點上。

執行使用使用者名稱空間的 Pod

透過將 .spechostUsers 欄位設定為 false 來為 Pod 啟用使用者名稱空間。例如

apiVersion: v1
kind: Pod
metadata:
  name: userns
spec:
  hostUsers: false
  containers:
  - name: shell
    command: ["sleep", "infinity"]
    image: debian
  1. 在你的叢集上建立 Pod

    kubectl apply -f https://k8s.io/examples/pods/user-namespaces-stateless.yaml
    
  2. 進入 Pod 並執行 readlink /proc/self/ns/user

    kubectl exec -ti userns -- bash
    

執行此命令

readlink /proc/self/ns/user

輸出類似於:

user:[4026531837]

同時執行

cat /proc/self/uid_map

輸出類似於:

0  833617920      65536

然後,在主機中開啟一個 shell 並執行相同的命令。

readlink 命令顯示程序正在執行的使用者名稱空間。在主機和容器內部執行時,它應該不同。

容器內部 uid_map 檔案的最後一個數字必須是 65536,在主機上它必須是一個更大的數字。

如果你在使用者名稱空間內執行 kubelet,你需要比較在 Pod 中執行命令的輸出與在主機中執行命令的輸出

readlink /proc/$pid/ns/user

$pid 替換為 kubelet 的 PID。

本頁面上的專案引用了提供 Kubernetes 所需功能的第三方產品或專案。Kubernetes 專案作者不對這些第三方產品或專案負責。有關更多詳細資訊,請參閱 CNCF 網站指南

在提議新增額外第三方連結的更改之前,你應該閱讀內容指南

最後修改於 2025 年 7 月 24 日太平洋標準時間下午 1:11:tasks/userns: 不要使用除錯容器 (39f457805f)