创建 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 节点的特权访问。 允许的值
|
| hostNetwork | 包含 HostProcess 容器的 Pod 必须使用主机的网络命名空间。 允许的值
|
| securityContext.windowsOptions.runAsUserName | 需要指定 pod 规范中 HostProcess 容器应作为哪个用户运行。 允许的值
|
| runAsNonRoot | 由于 HostProcess 容器具有对主机的特权访问,因此runAsNonRoot字段不能设置为 true。 允许的值
|
示例清单(摘录)
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 容器的用户组。
说明
运行 HostProcess 容器作为本地用户帐户需要 containerd v1.7+示例
在节点上创建一个本地用户组(这可以在另一个 HostProcess 容器中完成)。
net localgroup hpc-localgroup /add授予对节点上所需资源的本地用户组的访问权限。可以使用诸如 icacls 之类的工具来完成此操作。
将
runAsUserName设置为 pod 或单个容器的本地用户组的名称。securityContext: windowsOptions: hostProcess: true runAsUserName: hpc-localgroup安排 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 以
LocalSystem或LocalService服务帐户运行。用户帐户(即使是管理员帐户)也没有权限为任何受支持的 用户帐户 创建 logon token。