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

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

限制

这些限制与 Kubernetes v1.30 相关

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

允许的值

  • 未定义/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. 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 服务帐户。用户帐户(即使是管理员帐户)也没有权限为任何支持的 用户帐户 创建登录令牌。