创建 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.35。如果您没有运行 Kubernetes v1.35,请检查该 Kubernetes 版本的文档。

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

限制

这些限制适用于 Kubernetes v1.35

  • 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。

允许的值

  • 未定义/空
  • 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. runAsUserName 设置为 pod 或单个容器的本地用户组的名称。

    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 服务帐户运行。用户帐户(即使是管理员帐户)也没有权限为任何受支持的 用户帐户 创建 logon token。