建立 Windows HostProcess Pod

功能狀態: Kubernetes v1.26 [stable]

Windows HostProcess 容器允許你在 Windows 主機上執行容器化工作負載。這些容器作為普通程序執行,但在獲得適當的使用者許可權後,可以訪問主機網路名稱空間、儲存和裝置。HostProcess 容器可用於將網路外掛、儲存配置、裝置外掛、kube-proxy 和其他元件部署到 Windows 節點,而無需專用的代理或直接安裝主機服務。

可以執行管理任務,例如安裝安全補丁、收集事件日誌等,而無需叢集操作員登入到每個 Windows 節點。HostProcess 容器可以作為主機上可用或主機機器域中的任何使用者執行,從而允許管理員透過使用者許可權限制資源訪問。雖然不支援檔案系統或程序隔離,但在啟動容器時會在主機上建立一個新卷,為其提供一個乾淨且整合的工作空間。HostProcess 容器也可以構建在現有的 Windows 基礎映象之上,並且不繼承與 Windows Server 容器相同的相容性要求,這意味著基礎映象的版本不需要與主機的版本匹配。但是,建議你使用與 Windows Server 容器工作負載相同的基礎映象版本,以確保節點上沒有未使用的映象佔用空間。HostProcess 容器還支援容器卷內的卷掛載

什麼時候應該使用 Windows HostProcess 容器?

  • 當你需要執行需要主機網路名稱空間的任務時。HostProcess 容器可以訪問主機的網路介面和 IP 地址。
  • 你需要訪問主機上的資源,例如檔案系統、事件日誌等。
  • 安裝特定的裝置驅動程式或 Windows 服務。
  • 管理任務和安全策略的整合。這降低了 Windows 節點所需的許可權級別。

準備工作

此任務指南專門針對 Kubernetes v1.34。如果你未執行 Kubernetes v1.34,請查閱該版本 Kubernetes 的文件。

在 Kubernetes 1.34 中,HostProcess 容器功能預設啟用。kubelet 將透過 CRI 直接傳遞 hostprocess 標誌與 containerd 通訊。你可以使用最新版本的 containerd (v1.6+) 執行 HostProcess 容器。如何安裝 containerd。

限制

這些限制適用於 Kubernetes v1.34

  • HostProcess 容器需要 containerd 1.6 或更高版本的容器執行時,建議使用 containerd 1.7。
  • HostProcess pod 只能包含 HostProcess 容器。這是 Windows 作業系統的當前限制;非特權 Windows 容器無法與主機 IP 名稱空間共享 vNIC。
  • HostProcess 容器作為主機上的程序執行,除了對 HostProcess 使用者帳戶施加的資源限制外,沒有任何隔離。HostProcess 容器不支援檔案系統或 Hyper-V 隔離。
  • 支援卷掛載,並掛載到容器卷下。參閱卷掛載
  • 預設情況下,HostProcess 容器可以使用有限的主機使用者帳戶集。參閱選擇使用者帳戶
  • 資源限制(磁碟、記憶體、CPU 數量)以與主機上的程序相同的方式支援。
  • **不支援**命名管道掛載和 Unix 域套接字,應改為透過主機上的路徑訪問它們(例如 \\.\pipe\*)

HostProcess Pod 配置要求

啟用 Windows HostProcess Pod 需要在 Pod 安全配置中設定正確的配置。在Pod 安全標準中定義的策略中,HostProcess Pod 被基線和受限策略所禁止。因此,建議 HostProcess Pod 按照特權配置檔案執行。

在特權策略下執行時,需要設定以下配置才能建立 HostProcess Pod

特權策略規範
控制策略
securityContext.windowsOptions.hostProcess

Windows Pod 提供了執行HostProcess 容器的能力,從而可以對 Windows 節點進行特權訪問。

允許值

  • true
hostNetwork

包含 HostProcess 容器的 Pod 必須使用主機的網路名稱空間。

允許值

  • true
securityContext.windowsOptions.runAsUserName

Pod 規範中需要指定 HostProcess 容器應以哪個使用者身份執行。

允許值

  • NT AUTHORITY\SYSTEM
  • NT AUTHORITY\Local Service
  • NT AUTHORITY\NetworkService
  • 本地使用者組名稱(見下文)
runAsNonRoot

因為 HostProcess 容器對主機擁有特權訪問許可權,所以runAsNonRoot欄位不能設定為 true。

允許值

  • 未定義/Nil
  • false

示例清單(摘錄)

spec:
  securityContext:
    windowsOptions:
      hostProcess: true
      runAsUserName: "NT AUTHORITY\\Local service"
  hostNetwork: true
  containers:
  - name: test
    image: image1:latest
    command:
      - ping
      - -t
      - 127.0.0.1
  nodeSelector:
    "kubernetes.io/os": windows

卷掛載

HostProcess 容器支援在容器卷空間內掛載卷。卷掛載行為因節點上使用的 containerd 執行時版本而異。

Containerd v1.6

在容器內部執行的應用程式可以透過相對或絕對路徑直接訪問卷掛載。在容器建立時會設定一個環境變數 $CONTAINER_SANDBOX_MOUNT_POINT,它提供容器卷的絕對主機路徑。相對路徑基於 .spec.containers.volumeMounts.mountPath 配置。

要訪問服務帳戶令牌(例如),容器內支援以下路徑結構

  • .\var\run\secrets\kubernetes.io\serviceaccount\
  • $CONTAINER_SANDBOX_MOUNT_POINT\var\run\secrets\kubernetes.io\serviceaccount\

Containerd v1.7(及更高版本)

在容器內部執行的應用程式可以透過卷掛載指定的 mountPath 直接訪問卷掛載(就像 Linux 和非 HostProcess Windows 容器一樣)。

為了向後相容,卷也可以透過使用與 containerd v1.6 配置相同的相對路徑來訪問。

例如,要訪問容器內的服務帳戶令牌,可以使用以下路徑之一

  • c:\var\run\secrets\kubernetes.io\serviceaccount
  • /var/run/secrets/kubernetes.io/serviceaccount/
  • $CONTAINER_SANDBOX_MOUNT_POINT\var\run\secrets\kubernetes.io\serviceaccount\

資源限制

資源限制(磁碟、記憶體、CPU 數量)應用於作業,並對整個作業生效。例如,如果限制設定為 10MB,則為任何 HostProcess 作業物件分配的記憶體將上限為 10MB。這與其他 Windows 容器型別行為相同。這些限制將以目前用於任何協調器或執行時的方式指定。唯一的區別在於用於資源跟蹤的磁碟資源使用計算,因為 HostProcess 容器的引導方式不同。

選擇使用者帳戶

系統帳戶

預設情況下,HostProcess 容器支援以三種受支援的 Windows 服務帳戶之一執行

你應該為每個 HostProcess 容器選擇一個合適的 Windows 服務帳戶,旨在限制許可權級別,以避免對主機造成意外(甚至惡意)損害。LocalSystem 服務帳戶擁有這三個中最高的許可權級別,只有在絕對必要時才應使用。在可能的情況下,使用 LocalService 服務帳戶,因為它是這三個選項中許可權最低的。

本地帳戶

如果配置,HostProcess 容器也可以作為本地使用者帳戶執行,這允許節點操作員對工作負載進行精細訪問。

要將 HostProcess 容器作為本地使用者執行;必須首先在節點上建立本地使用者組,並且必須在部署的 runAsUserName 欄位中指定該本地使用者組的名稱。在初始化 HostProcess 容器之前,將建立一個新的**臨時**本地使用者帳戶並加入到指定的用於執行容器的使用者組中。這提供了許多好處,包括消除了管理本地使用者帳戶密碼的需要。作為服務帳戶執行的初始 HostProcess 容器可用於為後續 HostProcess 容器準備使用者組。

示例

  1. 在節點上建立本地使用者組(這可以在另一個 HostProcess 容器中完成)。

    net localgroup hpc-localgroup /add
    
  2. 授予本地使用者組對節點上所需資源的訪問許可權。這可以透過 icacls 等工具完成。

  3. 將 Pod 或單個容器的 runAsUserName 設定為本地使用者組的名稱。

    securityContext:
      windowsOptions:
        hostProcess: true
        runAsUserName: hpc-localgroup
    
  4. 排程 Pod!

HostProcess 容器的基礎映象

HostProcess 容器可以從任何現有的Windows 容器基礎映象構建。

此外,還專門為 HostProcess 容器建立了一個新的基礎映象!有關更多資訊,請檢視 windows-host-process-containers-base-image github 專案

HostProcess 容器故障排除

  • HostProcess 容器啟動失敗,並顯示 failed to create user process token: failed to logon user: Access is denied.: unknown

    確保 containerd 以 LocalSystemLocalService 服務帳戶執行。使用者帳戶(即使是管理員帳戶)也無權為任何受支援的使用者帳戶建立登入令牌。