创建 Windows HostProcess Pod

功能状态: Kubernetes v1.26 [稳定版]

Windows HostProcess 容器允许你在 Windows 主机上运行容器化的工作负载。这些容器作为普通进程运行,但在被赋予适当的用户权限时,可以访问主机网络命名空间、存储和设备。HostProcess 容器可以用于将网络插件、存储配置、设备插件、kube-proxy 和其他组件部署到 Windows 节点,而无需专用代理或直接安装主机服务。

诸如安装安全补丁、事件日志收集等管理任务可以在无需集群操作员登录每个 Windows 节点的情况下执行。HostProcess 容器可以以主机上可用的任何用户或主机域中的用户身份运行,从而允许管理员通过用户权限限制资源访问。虽然不支持文件系统或进程隔离,但在启动容器时会在主机上创建一个新卷,以便为其提供干净且统一的工作空间。HostProcess 容器也可以基于现有的 Windows 基础镜像构建,并且不继承与 Windows 服务器容器相同的兼容性要求,这意味着基础镜像的版本不需要与主机的版本匹配。但是,建议你使用与 Windows Server 容器工作负载相同的基础镜像版本,以确保节点上没有任何未使用的镜像占用空间。HostProcess 容器还支持在容器卷内进行卷挂载

我应该在何时使用 Windows HostProcess 容器?

  • 当需要执行需要主机网络命名空间的任务时。HostProcess 容器可以访问主机的网络接口和 IP 地址。
  • 你需要访问主机上的资源,例如文件系统、事件日志等。
  • 安装特定的设备驱动程序或 Windows 服务。
  • 整合管理任务和安全策略。这降低了 Windows 节点所需的权限级别。

开始之前

本任务指南特定于 Kubernetes v1.32。如果你运行的不是 Kubernetes v1.32,请查看该 Kubernetes 版本的文档。

在 Kubernetes 1.32 中,HostProcess 容器功能默认启用。kubelet 将通过 CRI 传递 hostprocess 标志,直接与 containerd 通信。你可以使用最新版本的 containerd (v1.6+) 来运行 HostProcess 容器。如何安装 containerd。

限制

这些限制与 Kubernetes v1.32 相关

  • 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

Pod 容器 HostProcess 容器必须使用主机的网络命名空间。

允许的值

  • true
securityContext.windowsOptions.runAsUserName

Pod 规范需要指定 HostProcess 容器应以哪个用户身份运行。

允许的值

  • NT AUTHORITY\SYSTEM
  • NT AUTHORITY\Local service
  • NT AUTHORITY\NetworkService
  • 本地用户组名称(见下文)
runAsNonRoot

因为 HostProcess 容器具有对主机的特权访问权限,所以runAsNonRoot字段不能设置为 true。

允许的值

  • 未定义/空
  • 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 (及更高版本)

容器内运行的应用程序可以直接通过 volumeMount 的指定 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 服务帐户运行。用户帐户(即使是管理员帐户)也无权为任何受支持的用户帐户创建登录令牌。