Privileged Container(特權容器)
Privileged Container(特權容器)
特權容器(privileged container)是 securityContext.privileged: true 的容器:容器執行環境不替它套用一般容器的隔離限制,它拿得到主機上所有的裝置與 Linux capability,配合掛載主機的根目錄,就能像節點上的 root 一樣讀寫節點的檔案、改節點的設定。可先對照 Container 與 Pod。
概念位置
一般的 Container 靠 namespace、cgroup 與 capability 限制和主機隔開,特權容器把這些限制拿掉,所以它與主機之間實質上沒有隔離邊界。需要它的多半是要直接操作節點的元件:網路外掛、儲存驅動、節點監控代理,以及 kubectl debug node --profile=sysadmin 這類節點除錯工具。誰能建特權容器由兩道檢查決定:Kubernetes RBAC 允許這個身分在那個 namespace 建 Pod,Pod Security Admission 允許那個 namespace 接受特權設定。
可觀察訊號與例子
- Pod 的 YAML 裡有
securityContext: { privileged: true },常伴隨hostPID: true、hostNetwork: true或掛載hostPath: /。 kubectl debug node/<node>用預設的generalprofile 或sysadmin建出的 Pod 都把節點的根目錄掛在/host,chroot /host之後就是節點的 shell;--profile=sysadmin另外讓它成為特權容器,可以用nsenter進入節點的 namespace。GKE 上這個做法需要的權限見GCP 上由 MIG 與 GKE 管理的 VM 的管理存取,專用 namespace 的建法見GCP 上 MIG 與 GKE 管理存取的實測紀錄。- GKE Autopilot 這類由雲端管理節點的模式,預設拒絕特權容器,只對列入允許清單的工作負載例外。
設計責任
能建特權容器等於持有每個它排得上去的節點的 root 權限,所以這個能力只給負責維運節點的群組,並限制在特定的 namespace。用特權容器除錯之後要刪掉那個 Pod,留著的特權 Pod 是一個隨時能進節點的入口。工作負載本身需要特權時,先查它實際需要的是哪一項 capability,只給那一項(securityContext.capabilities.add)通常就夠,不必整個開成特權。
鄰卡
- Pod Security Admission —
baseline以上的等級擋下特權容器 - Kubernetes RBAC — 決定誰能建 Pod
- Container — 一般容器的隔離方式